你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 Istio 服务网格加载项部署的 Azure Kubernetes 服务 (AKS) 外部或内部入口

本文介绍如何为适用于 Azure Kubernetes 服务 (AKS) 群集的 Istio 服务网格加载项部署外部或内部入口。

注意

执行 Istio 加载项的次要修订版升级时,将为新的控制平面修订版创建外部/内部网关的另一个部署。

先决条件

本指南假定你按照文档的说明在 AKS 群集上启用 Istio 加载项、部署示例应用程序并设置环境变量。

启用外部入口网关

使用 az aks mesh enable-ingress-gateway 在 AKS 群集上启用可从外部访问的 Istio 入口:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external

使用 kubectl get svc 检查映射到入口网关的服务:

kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress

从输出中观察到服务的外部 IP 地址为可公开访问的 IP 地址:

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-external   LoadBalancer   10.0.10.249   <EXTERNAL_IP>   15021:30705/TCP,80:32444/TCP,443:31728/TCP   4m21s

注意

尚不支持自定义内部和外部网关的 IP 地址。 入口规范上的 IP 地址自定义由 Istio 加载项还原。计划将来允许在 Istio 加载项的网关 API 实现中使用这些自定义项。

默认情况下,启用入口网关后,无法从群集外部访问应用程序。 若要使应用程序可供访问,请使用以下清单将示例部署的入口映射到 Istio 入口网关:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway-external
spec:
  selector:
    istio: aks-istio-ingressgateway-external
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-external
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway-external
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

注意

网关对象中使用的选择器指向 istio: aks-istio-ingressgateway-external,可在映射到先前启用的外部入口的服务上找到该标签。

为外部入口主机和端口设置环境变量:

export INGRESS_HOST_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_EXTERNAL=$INGRESS_HOST_EXTERNAL:$INGRESS_PORT_EXTERNAL

检索示例应用程序的外部地址:

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

导航到上一命令输出中的 URL,并确认已显示示例应用程序的产品页。 或者,还可使用 curl 确认示例应用程序可供访问。 例如:

curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"

确认示例应用程序的产品页可供访问。 预期的输出为:

<title>Simple Bookstore App</title>

启用内部入口网关

使用 az aks mesh enable-ingress-gateway 在 AKS 群集上启用内部 Istio 入口:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal

使用 kubectl get svc 检查映射到入口网关的服务:

kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress

从输出中观察到服务的外部 IP 地址不是可公开访问的 IP 地址,而是只能在本地访问:

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-internal   LoadBalancer   10.0.182.240  <IP>      15021:30764/TCP,80:32186/TCP,443:31713/TCP   87s

启用入口网关后,需要通过网关暴露应用程序,并相应地配置路由规则。 使用以下清单将示例部署的入口映射到 Istio 入口网关:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-internal-gateway
spec:
  selector:
    istio: aks-istio-ingressgateway-internal
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-internal
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-internal-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

注意

网关对象中使用的选择器指向 istio: aks-istio-ingressgateway-internal,可在映射到先前启用的内部入口的服务上找到该标签。

为内部入口主机和端口设置环境变量:

export INGRESS_HOST_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_INTERNAL=$INGRESS_HOST_INTERNAL:$INGRESS_PORT_INTERNAL

检索示例应用程序的地址:

echo "http://$GATEWAY_URL_INTERNAL/productpage"

导航到上一命令输出中的 URL,并确认未显示示例应用程序的产品页。 或者,还可使用 curl 确认示例应用程序不可访问。 例如:

curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"

使用 kubectl exec 确认可从群集的虚拟网络内部访问应用程序:

kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS  "http://$GATEWAY_URL_INTERNAL/productpage"  | grep -o "<title>.*</title>"

确认示例应用程序的产品页可供访问。 预期的输出为:

<title>Simple Bookstore App</title>

入口网关服务注释自定义

可将以下注释添加到外部和内部入口网关的 Kubernetes 服务:

  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet:将内部入口网关绑定到特定子网。
  • service.beta.kubernetes.io/azure-shared-securityrule:用于通过增强的安全规则公开入口网关。
  • service.beta.kubernetes.io/azure-allowed-service-tags:用于指定入口网关可从中接收请求的服务标记
  • service.beta.kubernetes.io/azure-load-balancer-ipv4:用于配置静态 IPv4 地址。
  • service.beta.kubernetes.io/azure-load-balancer-resource-group:用于在与群集不同的资源组中指定公共 IP 的资源组。
  • service.beta.kubernetes.io/azure-pip-name:用于指定公共 IP 地址的名称。

删除资源

如果要清理 Istio 外部或内部入口网关,但仍在集群上启用网格,请运行以下命令:

az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

如果要清理 Istio 服务网格和入口(留下群集),请运行以下命令:

az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

如果要清理根据 Istio 操作指南文档创建的所有资源,请运行以下命令:

az group delete --name ${RESOURCE_GROUP} --yes --no-wait

后续步骤

注意

如果在部署 Istio 入口网关或配置入口流量路由时遇到任何问题,请参阅有关 Istio 加载项入口网关故障排除的文章