Служба 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

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

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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 после включения шлюза входящего трафика. Используйте следующий манифест, чтобы сопоставить входящий трафик примера развертывания с шлюзом Istio ingress:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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>

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

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

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

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

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