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


Служба 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} --name ${CLUSTER}

Если вы хотите очистить сетку службы Istio и входящий трафик (выход из кластера), выполните следующую команду:

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

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

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

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

Примечание.

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