你当前正在访问 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 加载项入口网关故障排除的文章