Distributed Cloud Container Platform for Kubernetes(ACK One)でサービスメッシュ(ASM)を有効にし、ACK One をマルチクラスタアプリケーションの配布とトラフィック管理のためのワンストッププラットフォームとして使用できます。このトピックでは、ACK One の Fleet インスタンスを使用して、マルチクラスタアプリケーションの配布とトラフィック管理を実装する方法について説明します。
前提条件
ACK One Fleet インスタンスでサービスメッシュが有効になっている。
Distributed Cloud Container Platform for Kubernetes(ACK One)コンソールで Fleet インスタンスの kubeconfig ファイルを取得し、kubectl クライアントが Fleet インスタンスに接続されている。
背景情報
次の例は、Fleet インスタンスを使用して Rollouts アプリケーションを関連付けられたクラスタに配布し、トラフィック分散ルールを構成して異なるアプリケーションバージョンへのトラフィックを管理する方法を示しています。アプリケーションを複数の関連付けられたクラスタに配布する方法の詳細については、「アプリケーションの配布」をご参照ください。
次の図は、例を示しています。
次の図の丸で囲まれた番号 1 でマークされた接続は、デプロイメント、サービス、ConfigMap などの Kubernetes リソースを関連付けられたクラスタに配布できることを示しています。
次の図の丸で囲まれた番号 2 でマークされた接続は、トラフィック分散ルールを構成して、関連付けられたクラスタへのトラフィックを管理できることを示しています。Service Meshインスタンスの kubeconfig ファイルを使用する必要はありません。次のトラフィック分散ルールがサポートされています。
Destinationrules
Envoyfilters
Gateways
Serviceentries
Sidecars
Virtualservices
Workloadentries
Workloadgroups
次の図の丸で囲まれた番号 3 でマークされた接続は、ゲートウェイの IP アドレスを使用してアプリケーションにアクセスできることを示しています。リクエストは、トラフィック分散ルールに基づいて転送されます。
手順
ステップ 1: アプリケーションを作成する
次のコマンドを実行して、デフォルトの名前空間に対して自動サイドカーインジェクションを有効にします。
kubectl label namespace default istio-injection=enabledpodinfo-meta.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。このファイルは、アプリケーションのデプロイに必要な Kubernetes リソースを定義します。
次のコマンドを実行して、Fleet インスタンスにリソースを作成します。
kubectl apply -f podinfo-meta.yaml次のコマンドを実行して、Fleet インスタンスに関連付けられているクラスタに関する情報をクエリします。
AMC コマンドラインツールの詳細については、「AMC コマンドラインの使用」をご参照ください。
kubectl amc get managedclusters予期される出力:
Name Alias HubAccepted c5f4110f2ad88499583fc76cc568a**** ack-hy-01 true c7f78dd3b09a146b8b750b4c1c51d**** ack-hy-02 truepodinfo-app.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。このファイルは、podinfo という名前のオープンソース KubeVela アプリケーションを定義します。
次のコードブロックの
<clusterid1>と<clusterid2>を、前のステップで取得したクラスタ ID に置き換えます。apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: podinfo namespace: default annotations: app.oam.dev/publishVersion: version1 spec: components: - name: podinfo type: ref-objects properties: objects: - apiVersion: apps/v1 kind: Deployment name: podinfo-blue - apiVersion: apps/v1 kind: Deployment name: podinfo-green - apiVersion: v1 kind: Service name: podinfo policies: - type: topology name: podinfo-clusters properties: clusters: ["<clusterid1>","<clusterid2>"] # アプリケーションをデプロイするクラスタの名前を指定します。クラスタ名を追加したり、既存のクラスタ名を変更したりできます。次のコマンドを実行して、
podinfoという名前のアプリケーションを Fleet インスタンスにデプロイします。kubectl apply -f podinfo-app.yaml
ステップ 2: ゲートウェイルールを構成し、仮想サービスを作成する。
ACK One コンソールにログインし、Service Meshイングレスゲートウェイを作成します。詳細については、「イングレスゲートウェイを作成する」をご参照ください。
podinfo-gateway.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: podinfo-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"次のコマンドを実行して、Fleet インスタンスに Istio ゲートウェイを作成します。
kubectl apply -f podinfo-gateway.yamlvirtual-service-all-blue.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: podinfo spec: hosts: - "*" gateways: - podinfo-gateway http: - match: - uri: prefix: / route: - destination: host: podinfo subset: blue port: number: 80次のコマンドを実行して、Fleet インスタンスに仮想サービスを作成します。
kubectl apply -f virtual-service-all-blue.yamldestination-rule-all.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: podinfo spec: host: podinfo trafficPolicy: outlierDetection: baseEjectionTime: 30s consecutiveErrors: 7 interval: 30s subsets: - name: blue labels: version: blue - name: green labels: version: green次のコマンドを実行して、Fleet インスタンスに宛先ルールを作成します。
kubectl apply -f destination-rule-all.yaml
ステップ 3: 結果を確認する
次のコマンドを実行して、ASM ゲートウェイの IP アドレスをクエリします。
AMC コマンドラインツールの詳細については、「AMC コマンドラインの使用」をご参照ください。
kubectl amc get svc -n istio-system -m <関連付けられたクラスタの名前>予期される出力:
Run on ManagedCluster c5f4110f2ad88499583fc76cc568a**** (ack-hy-01) NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.12.1**.*** 47.113.***.*** 80:30315/TCP,443:32***/TCP 47h Run on ManagedCluster c7f78dd3b09a146b8b750b4c1c51d**** (ack-hy-02) NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.75.9**.*** 47.113.***.*** 80:32101/TCP,443:30***/TCP 47hブラウザのアドレスバーに http://<ASM ゲートウェイの IP アドレス>/ と入力します。
<ASM ゲートウェイの IP アドレス>を前のステップで取得したEXTERNAL-IPに置き換えます。次の図は、表示される Web ページを示しています。この例では、アプリケーションのblueバージョンにアクセスしています。
仮想サービスを作成して、アプリケーションの異なるバージョンのトラフィック比率を構成します。
virtual-service-green-blue-80-20.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
この例では、
greenバージョンの重みは 80 に設定され、blueバージョンの重みは 20 に設定されています。apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: podinfo spec: hosts: - "*" gateways: - podinfo-gateway http: - match: - uri: prefix: / route: - destination: host: podinfo subset: green port: number: 80 weight: 80 - destination: host: podinfo subset: blue port: number: 80 weight: 20次のコマンドを実行して、Fleet インスタンスに仮想サービスを作成します。
kubectl apply -f virtual-service-green-blue-80-20.yaml
ブラウザのアドレスバーに http://<ASM ゲートウェイの IP アドレス>/ と入力します。
結果は、トラフィックの 80% が
greenバージョンに転送され、トラフィックの 20% がblueバージョンに転送されることを示しています。