Служба Azure Kubernetes (AKS) внешний или внутренний входящий трафик для развертывания надстройки сетки службы Istio
В этой статье показано, как развернуть внешние или внутренние входящего трафика для надстройки сетки сетки Istio для кластера Служба Azure Kubernetes (AKS).
Примечание.
При выполнении дополнительного обновления версии надстройки Istio будет создано другое развертывание для внешних или внутренних шлюзов для новой версии уровня управления.
Необходимые компоненты
В этом руководстве предполагается, что вы выполнили документацию , чтобы включить надстройку Istio в кластере AKS, развернуть пример приложения и задать переменные среды.
Включение внешнего шлюза входящего трафика
Используйте az aks mesh enable-ingress-gateway
для включения внешнего доступа к Istio ingress в кластере AKS:
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-адрес службы является общедоступным:
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. Планируется разрешить эти настройки в реализации API шлюза для надстройки Istio в будущем.
Приложения по умолчанию недоступны извне кластера после включения шлюза входящего трафика. Чтобы сделать приложение доступным, сопоставите входящий трафик примера развертывания с шлюзом Istio ingress с помощью следующего манифеста:
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
для включения внутреннего входящего трафика Istio в кластере AKS:
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-адрес службы не является общедоступным и вместо этого доступен только локально:
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 ingress:
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 external или internal ingress, но оставьте сетку включенной в кластере, выполните следующую команду:
az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP}
Если вы хотите очистить сетку службы Istio и входящий трафик (выход из кластера), выполните следующую команду:
az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
Если вы хотите очистить все ресурсы, созданные из документов руководства Istio, выполните следующую команду:
az group delete --name ${RESOURCE_GROUP} --yes --no-wait
Следующие шаги
Примечание.
Если возникли проблемы при развертывании шлюза Istio ingress или настройке маршрутизации трафика входящего трафика, см . статью по устранению неполадок шлюзов входящего трафика Istio
Azure Kubernetes Service