カスタム Istio ゲートウェイの導入 IstioOperator
1.23 およびそれ以前のアドオンバージョンでは、 Istio が管理するアプリトラフィック用に独自のインバウンドおよびアウトバウンドゲートウェイを定義する、 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 operator pod ログに構文エラーがないか確認します。 Istio オペレーターは、ユーザーがIstioOperator(IOP)に対して行った変更を検証し、整合性を確保します。 - さらに、
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.29.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 サンプルアプリケーションをデプロイし、カスタムインジェスゲートウェイのロードバランサーへのアクセスをテストします。
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 bookinfoNAME 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 2mkubectl get pods -n bookinfoNAME 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 クラスター ```sh {: pre} 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-gatewayGatewayリソースを変更します。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.29.5 がリリースされると、すべてのIngressゲートウェイポッドが自動的にこの最新のパッチバージョンに更新されます。 パッチ・バージョンは、アプリのダウン時間を回避するために、ローリング更新ストラテジーを使用して更新されます。 ただし、最新のパッチ・バージョンでの潜在的な回帰を検査する場合などは、カスタム・ゲートウェイ・ポッドの自動更新を回避することができます。
カスタム 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.29.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.29.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