Поделиться через


Развертывание входных шлюзов для сервисной сетки Istio в Azure Kubernetes Service.

В этой статье показано, как развернуть внешние или внутренние входы для аддона сетевого сервиса Istio в кластере Azure Kubernetes Service (AKS).

Примечание.

При незначительном обновлении версии надстройки Istio для новой ревизии уровня управления будет создано новое развертывание для внешних или внутренних шлюзов.

Предварительные условия

В этом руководстве предполагается, что вы следовали документации для включения дополнения Istio в кластере AKS, развертывания примерного приложения и задания переменных среды.

Включение внешнего входного шлюза

Примечание.

Если вам нужны модули шлюза входящего трафика, назначенные на определенные узлы, можно использовать системные узлы AKS или метку узла azureservicemesh/istio.replica.preferred. Pod имеют привязанности к узлам с взвешанным предпочтением 100 для системных узлов AKS, помеченных kubernetes.azure.com/mode: system, и взвешанным предпочтением 50 для узлов, помеченных azureservicemesh/istio.replica.preferred: true.

Используйте 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

Приложения по умолчанию недоступны извне кластера после включения шлюза входящего трафика. Чтобы сделать приложение доступным, сопоставите входящий трафик примера развертывания с шлюзом 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 для внешних и внутренних шлюзов входящего трафика. Дополнительные сведения об этих заметках см. в документе по настройке общедоступных подсистем балансировки нагрузки .

  • external-dns.alpha.kubernetes.io/hostname: для указания домена для записей DNS ресурса. Дополнительные сведения см. в разделе external-dns.
  • service.beta.kubernetes.io/azure-allowed-ip-ranges: для указания списка разрешенных диапазонов IP-адресов, разделенных запятыми.
  • service.beta.kubernetes.io/azure-allowed-service-tags: для указания тегов службы, от которых шлюз входящего трафика может получать запросы.
  • service.beta.kubernetes.io/azure-disable-load-balancer-floating-ip: установить true для отключения плавающего IP-адреса в правиле балансировки нагрузки.
  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet: имя подсети для привязки к внутреннему шлюзу входящего трафика. Эта подсеть должна существовать в той же виртуальной сети, что и сетка.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4: для настройки статического IPv4-адреса.
  • service.beta.kubernetes.io/azure-load-balancer-disable-tcp-reset: для управления включением сброса TCP в Azure Load Balancer.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group: для указания группы ресурсов общедоступного IP-адреса в другой группе ресурсов из кластера.
  • service.beta.kubernetes.io/azure-load-balancer-tcp-idle-timeout: для настройки времени ожидания простоя TCP в минутах для подключений через Azure Load Balancer.
  • service.beta.kubernetes.io/azure-pip-ip-tags: для указания списка IpTags, разделенных запятыми.
  • service.beta.kubernetes.io/azure-pip-name: для указания имени общедоступного IP-адреса.
  • service.beta.kubernetes.io/azure-shared-securityrule: для предоставления шлюза входящего трафика с помощью расширенного правила безопасности.

Надстройка поддерживает следующие аннотации проверки работоспособности для портов 80 и 443.

  • service.beta.kubernetes.io/port_{port}_no_lb_rule
  • service.beta.kubernetes.io/port_{port}_no_probe_rule
  • service.beta.kubernetes.io/port_{port}_health-probe_protocol
  • service.beta.kubernetes.io/port_{port}_health-probe_port
  • service.beta.kubernetes.io/port_{port}_health-probe_interval
  • service.beta.kubernetes.io/port_{port}_health-probe_num-of-probe
  • service.beta.kubernetes.io/port_{port}_health-probe_request-path

Политика внешнего трафика

Надстройка поддерживает настройку .spec.externalTrafficPolicy в службе Kubernetes для шлюза входящего трафика. Установка .spec.externalTrafficPolicy в Local сохраняет IP-адрес источника клиента на шлюзе Istio ingress и избегает второго этапа в пути трафика к pod-ам шлюза входящего трафика серверной части.

kubectl patch service aks-istio-ingressgateway-external -n aks-istio-ingress --type merge --patch '{"spec": {"externalTrafficPolicy": "Local"}}'

Примечание.

Изменение с .spec.externalTrafficPolicy на Local может привести к потенциально несбалансированному распределению трафика. Перед применением этого изменения рекомендуется ознакомиться с документацией Kubernetes , чтобы понять компромиссы между разными externalTrafficPolicy параметрами.

Удаление ресурсов

Если вы хотите очистить внешние или внутренние шлюзы Istio ingress, оставив сетку включенной в кластере, выполните следующую команду:

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

Следующие шаги

Примечание.

Если возникли проблемы при развертывании Ingress-шлюза Istio или настройке маршрутизации входящего трафика, ознакомьтесь со статьей по устранению неполадок шлюзов входящего трафика Istio