カスタム Istio ゲートウェイのデプロイ
Istio マネージド・アプリ・トラフィック用に独自の Ingress ゲートウェイと Egress ゲートウェイを定義する IstioOperator
(IOP) カスタム・リソースを作成します。
デフォルトでは、クラスターの istio-ingressgateway
名前空間に 1 つの istio-system
デプロイメントが作成されます。 このデプロイメントは、外部からアクセス可能な IP アドレスを持つパブリック・ロード・バランサー・サービスとして公開されます。 その後、Gateway
リソースで Istio マネージド・アプリのポートを定義できます。これにより、それらのポートへのインバウンド
HTTP/TCP トラフィックを listen するように istio-ingressgateway
ロード・バランサーが構成されます。 さらに、1 つの istio-egressgateway
がデフォルトで作成され、Istio マネージド・アプリからのアウトバウンド・トラフィックを管理するためのロード・バランサー・サービスとして公開されます。
ただし、これらのデフォルト・ゲートウェイ以外に、追加の Ingress ゲートウェイまたは Egress ゲートウェイのデプロイメントを作成することもできます。 例えば、次の理由で追加のゲートウェイを作成して、デフォルト・ゲートウェイと一緒に実行したり、デフォルト・ゲートウェイの代わりに実行したりすることができます。
- 特定のワークロードまたは名前空間の間でトラフィック・フローを分離する
- プライベート・ネットワーク・トラフィック用の Ingress ゲートウェイを作成する
- ゲートウェイ・ポッド・ノード・アフィニティー、最小レプリカ、ゾーン固有のロード・バランサーなどのカスタマイズを加えてゲートウェイを変更する
- マネージド Istio アドオンのすべてのコンポーネントに対してロールアウトされる自動バージョン更新とは別に、ゲートウェイのバージョン更新を制御する
考慮事項
始める前に、カスタム・ゲートウェイの使用に関する以下の考慮事項を確認してください。
- マネージド Istio アドオンは、お客様が作成したカスタム・ゲートウェイの管理や調整は行いません。 これらのリソースの作成、管理、および保守は、お客様の責任で行ってください。
- カスタム・ゲートウェイをデプロイした後、
kubectl logs -n ibm-operators -l name=addon-istio-operator
を実行して、Istio オペレーター・ポッドのログに構文エラーがないか確認します。 Istio オペレーターは、お客様が行ったカスタムIstioOperator
(IOP) の変更を検証し、調整します。 ログ内のinfo installer Reconciling IstioOperator
の繰り返しによって示される調整ループに気付いた場合は、ステップ に従って、ループ・エラーの原因となっている構成内の行を見つけます。 - さらに、
istio-global-proxy-accessLogFile
構成マップmanaged-istio-custom
の オプションが"/dev/stdout"
に設定されていることを確認します。 Envoy プロキシーは、アクセス情報を標準出力に出力します。これは、Envoy コンテナーに対してkubectl logs
コマンドを実行することで表示できます。
パブリック・トラフィック用のカスタム Ingress ゲートウェイの作成
IstioOperator
(IOP) を使用して、custom-gateways
名前空間にカスタム Ingress ゲートウェイ・デプロイメントおよびパブリック・ロード・バランサー・サービスを作成します。
-
カスタム Ingress ゲートウェイの名前空間を作成します。
kubectl create namespace custom-gateways
-
custom-ingress-iop.yaml
(IOP) リソース用にIstioOperator
という名前の YAML ファイルを作成します。 カスタム・ゲートウェイ・ポッドが特定のバージョンのマネージド Istio を実行するように強制するには、tag
フィールドにバージョンを指定します。 詳しくは、カスタム・ゲートウェイの更新およびバージョンの制御を参照してください。apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: ibm-operators name: custom-ingressgateway-iop spec: profile: empty hub: icr.io/ext/istio # tag: 1.23.5 components: ingressGateways: - name: custom-ingressgateway label: istio: custom-ingressgateway namespace: custom-gateways enabled: true k8s: serviceAnnotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
-
クラスター内に
IstioOperator
(IOP) リソースを作成します。ibm-operators
名前空間内のマネージド Istio 演算子は、IOP リソースを使用して、Ingress ゲートウェイをパブリック・ロード・バランサー・サービスとともにcustom-gateways
名前空間内にデプロイして公開します。kubectl apply -f ./custom-ingress-iop.yaml
-
Ingress ゲートウェイのデプロイメントとサービスが
custom-gateways
名前空間内に作成されていることを確認します。kubectl get deploy,svc -n custom-gateways
出力例
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/custom-ingressgateway 1/1 1 1 4m53s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/custom-ingressgateway LoadBalancer 172.21.98.120 52.117.68.222 15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP 4m53s
-
service/custom-ingressgateway
ロード・バランサーの出力にある、EXTERNAL-IP
列の IP アドレス (クラシック・クラスターの場合) またはホスト名 (VPC クラスターの場合) をメモしておきます。
続いて、この Ingress ゲートウェイ・ロード・バランサーの名前 custom-ingressgateway
を、Istio マネージド・アプリのポートを定義する Gateway
リソース内で指定することができます。 その後、その Gateway
の名前を、サービス・メッシュ内のマイクロサービスのパスを定義する VirtualService
リソース内で指定できます。 カスタム・ゲートウェイ・ロード・バランサーとともに
Gateway
および VirtualService
を使用する例については、
BookInfo サンプル・アプリをお試しください。
BookInfo サンプルのセットアップ
Istio用の BookInfo サンプルアプリケーションをデプロイして、カスタムのIngress Gatewayロードバランサーへのアクセスをテストします。
bookinfo
ネームスペースを作成し、 自動サイドカー注入用にネームスペースにラベルを付けます。kubectl create namespace bookinfo kubectl label namespace bookinfo istio-injection=enabled
- BookInfo サンプル・アプリをデプロイします。
<version>
を、管理対象 Istio アドオンが実行される major.minor バージョンで置き換えます。これを見つけるには、ibmcloud ks cluster addon ls -c <cluster_name_or_ID>
を実行してください。kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml
- BookInfo マイクロサービスとその対応するポッドがデプロイされていることを確認します。
kubectl get svc -n bookinfo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 172.21.19.104 <none> 9080/TCP 2m kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 1d productpage ClusterIP 172.21.168.196 <none> 9080/TCP 2m ratings ClusterIP 172.21.11.131 <none> 9080/TCP 2m reviews ClusterIP 172.21.117.164 <none> 9080/TCP 2m
kubectl get pods -n bookinfo
NAME READY STATUS RESTARTS AGE details-v1-6865b9b99d-7v9h8 2/2 Running 0 2m productpage-v1-f8c8fb8-tbsz9 2/2 Running 0 2m ratings-v1-77f657f55d-png6j 2/2 Running 0 2m reviews-v1-6b7f6db5c5-fdmbq 2/2 Running 0 2m reviews-v2-7ff5966b99-zflkv 2/2 Running 0 2m reviews-v3-5df889bcff-nlmjp 2/2 Running 0 2m
- YAML ファイルを
bookinfo-custom-gateway.yaml
という名前で作成して、Gateway
リソースとVirtualService
リソースを定義します。Gateway
リソースでは前に作成したカスタム Ingress ロード・バランサーの名前としてcustom-ingressgateway
を指定し、VirtualService
リソースではbookinfo-gateway
リソースの名前としてGateway
を指定することに注意してください。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - "*" gateways: - bookinfo-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
- クラスター内に
Gateway
リソースとVirtualService
リソースを作成します。kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
- 前のセクションで見つけた
service/custom-ingressgateway
ロード・バランサーの IP アドレス (クラシックの場合) またはホスト名 (VPC の場合) を使用して、BookInfo アプリの製品ページをブラウザーで開きます。http://<IP_OR_HOSTNAME>/productpage
これで、カスタム Ingress ゲートウェイ・ロード・バランサーは、Gateway
リソース内のポートと VirtualService
リソース内のマイクロサービス・パスを使用して、BookInfo アプリにトラフィックを経路指定するようになりました。 次は、オプションで、カスタム・ゲートウェイ・ロード・バランサーの DNS レコードを作成することができます。
IBM 提供のサブドメインを使用した BookInfo の公開 (TLS 使用)
IBM 提供のサブドメインを作成して、カスタム・ゲートウェイ・ロード・バランサーの IP アドレス (クラシックの場合) またはホスト名 (VPC 場合) を DNS レコードに登録します。 サブドメイン用に生成される TLS 証明書により、BookInfo アプリへの HTTPS 接続が可能となります。
-
DNS サブドメインを作成することにより、カスタム・ゲートウェイ・ロード・バランサーの IP アドレスまたはホスト名を登録します。 TLS シークレットには
custom-gateway
名前空間を指定します。- クラシック・クラスター
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways
- VPC クラスター
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways
- クラシック・クラスター
-
サブドメインが作成されたことを確認します。
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
クラシック・クラスターの出力例
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>
VPC クラスターの出力例
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate>
-
サブドメインのシークレットの名前を取得します。
kubectl get secret -n custom-gateways
出力例
mycluster-af23f234rwr3asdfasdf-002 kubernetes.io/tls 2 15m
-
前のセクションで作成した
bookinfo-custom-gateway.yaml
で、HTTPS ポート 443 と、サブドメインのシークレットを指定する TLS セクションを追加することにより、bookinfo-gateway
Gateway
リソースを変更します。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name hosts: - "*" --- ...
-
変更した
Gateway
リソースをクラスター内に作成します。kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
-
Web ブラウザーで、BookInfo 製品ページを開きます。 手順 2 で確認したサブドメインに HTTPS を使用していることを確認します。
https://<subdomain>/productpage
プライベート・ネットワーク・トラフィック用のカスタム Ingress ゲートウェイの作成
カスタム Ingress ゲートウェイ・デプロイメントを作成し、それをプライベート・ロード・バランサー・サービスで公開するには、パブリック・トラフィック用のカスタム Ingress ゲートウェイを作成にある手順に従います。 ステップ 3 で IOP を作成するときは、public
ではなく service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private
アノテーションを指定します。
次の考慮事項に注意してください。
- クラシック・クラスターがプライベート VLAN にのみ接続されている場合、または VPC クラスターでプライベートクラウド・サービス・エンドポイントのみが有効になっている場合は、IOP を適用すると、デフォルトでプライベート・ロード・バランサーが作成されます。
- クラシック・クラスターに限っては、
ibmcloud ks nlb-dns create classic
を使用してカスタム・ゲートウェイ・ロード・バランサーの IP アドレスに対して DNS レコードや IBM 提供のサブドメインを作成することはできません。
カスタム・ゲートウェイの更新とバージョンの管理
カスタム Ingress ゲートウェイのマネージド Istio バージョンを手動で更新および制御します。
IBM Cloud が、IBM Cloud Kubernetes Service でサポートされる最新バージョンの Istio へのパッチの更新を自動的にロールアウトして、すべての Istio コンポーネントを最新に保ちます。 例えば、パッチバージョン 1.23.5 がリリースされると、すべてのインゲートウェイポッドが自動的にこの最新パッチバージョンに更新されます。 パッチ・バージョンは、アプリのダウン時間を回避するために、ローリング更新ストラテジーを使用して更新されます。 ただし、最新のパッチ・バージョンでの潜在的な回帰を検査する場合などは、カスタム・ゲートウェイ・ポッドの自動更新を回避することができます。
カスタム Ingress ゲートウェイの更新を管理するために、以下のロールアウト・ストラテジーを使用できます。
- カスタム Ingress ゲートウェイの IOP を作成します。
tag
フィールドに、コントロール・プレーン・バージョンと同じかそれより前のパッチ・バージョンを指定します。 コントロール・プレーンのバージョンは、istioctl version
を実行して見つけることができます。 - マネージド Istio アドオンの新しいパッチ・バージョンがリリースされたら、1 つのカスタム・ゲートウェイの IOP YAML ファイルに最新のパッチ・バージョンを使用するための編集を加え、クラスターでその IOP を再適用します。
- カスタム・ゲートウェイのポッドが最新のパッチに更新されたら、カスタム・ゲートウェイに対するすべての変更をテストします。
- 変更に問題がなければ、残りのカスタム・ゲートウェイの構成を変更して、最新のパッチに更新します。
タグには、使用している Istio アドオンのコントロール・プレーン・バージョンより後のバージョンを設定しないでください。
バージョンがリリースされた後、できるだけ早くカスタム・ゲートウェイ・ポッドを更新してください。 古いバージョンを実行しているカスタム・ゲートウェイは、セキュリティーの脆弱性にさらされるおそれがあります。
追加のゲートウェイのカスタマイズ
カスタム Ingress ゲートウェイは、特定ゾーンへのゲートウェイ・ロード・バランサーのデプロイ、ゲートウェイ・ポッド・レプリカの最小数の指定、エッジ・ノードへのカスタム・ゲートウェイ・ポッドのスケジューリング、安全なシャットダウンのための preStop
ライフサイクル・フックの追加、アンチアフィニティーとワーカー・ノード・アフィニティーの指定などのカスタマイズを追加して構成できます。
次の IOP YAML ファイルには、これらの追加カスタマイズの例が含まれています。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-ingressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.23.5 # Force the gateway to a specific managed Istio version
components:
ingressGateways:
- name: custom-ingressgateway
label:
istio: custom-ingressgateway
namespace: custom-gateways
enabled: true
k8s:
serviceAnnotations:
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
hpaSpec: # Specify the minimum number of pod replicas
minReplicas: 2
tolerations: # Schedule the custom gateway pods onto edge nodes
- key: dedicated
value: edge
env:
- name: TERMINATION_DRAIN_DURATION
value: 30s
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- istio-ingressgateway
topologyKey: kubernetes.io/hostname
weight: 100
nodeAffinity: # Example node affinities to control the zone or the edge
preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
nodeSelectorTerms:
- matchExpressions:
- key: ibm-cloud.kubernetes.io/zone
operator: In
values:
- "dal12" # Deploy the load balancer to a specific zone in your cluster
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: dedicated
operator: In
values:
- edge
weight: 100
カスタム Egress ゲートウェイの作成
バージョン 1.8 またはそれより後のマネージド Istio アドオンでは、カスタム Egress ゲートウェイを作成できます。 Egress ゲートウェイは、サービス・メッシュ内のアプリから外部の宛先へのすべてのアウトバウンド・トラフィックの出口点として機能します。
例えば、カスタム Egress ゲートウェイを作成するには、クラスター内の IOP に対して以下の YAML ファイルを適用できます。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-egressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.23.5 # Force the Gateway to a specific version
components:
egressGateways:
- name: custom-egressgateway
label:
istio: custom-egressgateway
namespace: custom-gateways
enabled: true
カスタムの出口ゲートウェイの設定および使用方法の詳細については 、Istioのオープンソースドキュメントを参照してください。
デフォルト・ゲートウェイの無効化
カスタム・ゲートウェイの作成後にデフォルトの istio-ingressgateway
デプロイメントや istio-egressgateway
デプロイメントが不要になった場合は、オプションでそれらを無効にできます。
アプリにクライアントからアクセスできるようにする場合は、少なくとも 1 つのゲートウェイ・ロード・バランサーが有効になっていて、トラフィックをアプリに経路指定するように構成されていることを確認してください。 すべてのゾーンでデフォルト・ゲートウェイ・ロード・バランサーを無効にすると、アプリは公開されなくなり外部からアクセス不可となります。
-
managed-istio-custom
構成マップ・リソースを編集します。kubectl edit cm managed-istio-custom -n ibm-operators
-
istio-ingressgateway-public-1|2|3-enabled
フィールドを"false"
に設定して、デフォルトの Ingress ゲートウェイを使用不可にします。istio-ingressgateway-public-1-enabled: "false" istio-ingressgateway-public-2-enabled: "false" istio-ingressgateway-public-3-enabled: "false"
-
デフォルトの Egress ゲートウェイを使用不可にするには、
istio-egressgateway-public-1-enabled: "false"
フィールドを追加します。istio-egressgateway-public-1-enabled: "false"
-
構成ファイルを保存して閉じます。
-
デフォルトのゲートウェイ・サービスが削除されていることを確認します。
kubectl get svc -n istio-system