Istio サービス メッシュ アドオン用 Azure Kubernetes Service (AKS) 外部または内部イングレスのデプロイ

この記事では、Azure Kubernetes Service (AKS) クラスター用の Istio サービス メッシュ アドオンの外部または内部イングレスをデプロイする方法について説明します。

Note

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 アドレスがパブリックにアクセス可能であることを確認します。

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 イングレス ゲートウェイにマップします。

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

Note

ゲートウェイ オブジェクトで使用されるセレクターは 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 アドレスがパブリックにアクセス可能なものではなく、ローカルでのみアクセス可能であることを確認します。

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 イングレス ゲートウェイにマップします。

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

Note

ゲートウェイ オブジェクトで使用されるセレクターは 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