この記事では、Azure Kubernetes Service (AKS) クラスター用の Istio サービス メッシュ アドオンの外部または内部イングレスをデプロイする方法について説明します。
注
Istio アドオンの マイナー リビジョン アップグレード を実行すると、新しいコントロール プレーンリビジョン用に外部/内部ゲートウェイ用の別のデプロイが作成されます。
前提条件
このガイドでは、このドキュメントに従って AKS クラスターで Istio アドオンの有効化、サンプル アプリケーションのデプロイ、環境変数の設定を行っていることを前提としています。
外部イングレス ゲートウェイを有効にする
注
特定のノードにスケジュールされたイングレス ゲートウェイ ポッドが必要な場合は、 AKS システム ノード または azureservicemesh/istio.replica.preferred
ノード ラベルを使用できます。 ポッドにはノード アフィニティがあり、AKS システム ノードの100
の重み付け設定 (kubernetes.azure.com/mode: system
) と、50
ラベルが付けられたノードのazureservicemesh/istio.replica.preferred: true
の重み付け設定があります。
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/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
を使用して、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 イングレス ゲートウェイにマップします。
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 アドレスの名前を指定します。 -
external-dns.alpha.kubernetes.io/hostname
: リソースの DNS レコードのドメインを指定します。 詳細については、 external-dns を参照してください。
アドオンは、ポート 80 と 443 の正常性プローブ注釈をサポートしています。 ポートの使用方法の詳細については 、こちらをご覧ください。
外部トラフィック ポリシー
このアドオンでは、イングレス ゲートウェイの Kubernetes サービスでの .spec.externalTrafficPolicy
のカスタマイズがサポートされています。
.spec.externalTrafficPolicy
を Local
に設定すると、Istio イングレス ゲートウェイのクライアント ソース IP が保持され、バックエンドイングレス ゲートウェイ ポッドへのトラフィック パスで 2 番目のホップが回避されます。
kubectl patch service aks-istio-ingressgateway-external -n aks-istio-ingress --type merge --patch '{"spec": {"externalTrafficPolicy": "Local"}}'
注
.spec.externalTrafficPolicy
を変更してLocal
すると、トラフィックの分散が不均衡となる可能性があります。 この変更を適用する前に、 Kubernetes のドキュメント を読んで、さまざまな externalTrafficPolicy
設定間のトレードオフを理解することをお勧めします。
リソースを削除する
Istio 外部ゲートウェイまたは内部イングレス ゲートウェイをクリーンアップするが、クラスターでメッシュを有効のままにする場合は、次のコマンドを実行します。
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 イングレス ゲートウェイのデプロイまたはイングレス トラフィック ルーティングの構成で問題が発生した場合は、Istio アドオンイングレス ゲートウェイのトラブルシューティングに関する記事を参照してください
Azure Kubernetes Service