フォーム読み込み中
2022年12月14日掲載
こんにちは、大原です。
この記事は、ソフトバンク Advent Calendar2022の14日目の記事になります。
Alibaba Cloud ACK Oneを使って、複数のAlibaba Cloudアカウント上のサーバレスKubernetesであるASKクラスタを統合管理してみました。
Alibaba Cloud ACK Oneは、Alibaba Cloudが提供する、Kubernetesベースでハイブリッドクラウド・マルチクラウドの実現を提供するプロダクトサービスです。ACK Oneは、AWS、Azure、GoogleCloud、オンプレミスなどの Kubernetes クラスタをAlibaba Cloud のフルマネージド型KubernetesサービスACKクラスタと一元管理するため、異なる環境間によるマルチクラスタ構成を柔軟に対処することが出来ます。ACK Oneは他のクラウド・オンプレミスでもKubernetesがあれば、ACK Oneに対象の Kubernetes クラスタを登録するだけで、他のクラウド・オンプレミスでもAlibaba Cloudのフルマネージド型Kubernetesサービス ACK(Alibaba Cloud Container Service for Kubernetes)をベースとしながら操作します。
本記事では、ACK Oneを使って、ACK/ASKクラスタ間にマルチクラスタサービスをデプロイする方法および、ACK Oneの基本的な操作についてをご紹介します。
この手法は、オンプレミスのKubernetesや、AWS EKS、Azure AKS等Kubernetesサービスにも適用できますので、参考にして頂ければ幸いです。
全体構成図は次の通りになります。
異なるAlibaba Cloudアカウント配下のVPCはそれぞれ独立していますが、VPCピアリング接続を使って、単一のVPCにしたうえで構築します。
この準備が出来たら、ACK Oneによる構築を進めます。
ACK Oneコンソールに初めてアクセスすると、サービスのアクティベーションページに入ります。サービスを利用する前に、アクティベーションを行う必要があります。
ACK One アクティベーション後、ACK Oneマスターインスタンスの設定画面へ遷移します。VPCとvSwitchが用意されたターゲットのRegionをピックアップし、作成したマスターインスタンスでマルチクラスタ管理を有効にします。
アカウントで初めてマルチクラスタ管理を有効にした場合、特定のロールやロールポリシーで見つからないエラーが発生します。
これを解決するには、エラーメッセージを閉じてからポップアップウィンドウのOKボタンをクリックするだけで、必要なロールとロールポリシーの作成操作が実行されます。
一方、選択したRegionにクラスタが存在しない場合は、同様にエラーで初期処理が中断されます。
最初の処理は、マスターインスタンスを作成するため、時間がかかります。
この処理は「Master Instance Logs」タブで作成ログを確認することができます。
いったん、マスターインスタンスが `running` 状態になり、それを通してマルチクラスタ管理ができるようになります。
ターゲットクラスタを管理するためには、ACK Oneの関連クラスタとして追加する必要があります。
「Associated Clusters」 ページで 「Add Associated Cluster」ボタンをクリックし、 リストからターゲットクラスタを選択して 「OK」ボタンをクリックして操作を実行します。
しばらくすると、対象のクラスタがACK Oneの関連クラスタになります。
ACK Oneでは、データセンター内に展開されたクラスタだけでなく、サードパーティのクラウド上に展開されたクラスタも登録することができます。ここではGCPプラットフォームに展開されたGKEクラスターを例にとって説明します。
GKE Standard クラスタをすでに入手していると仮定します。代わりに GKE Autopilot クラスタを使用していないことを確認してください。
クラスタプロセスを登録すると、名前空間「kube-system」下にデプロイが作成されます。フルマネージドクラスタであるGKE Autopilotクラスタは名前空間「kube-system」の作成を許可していないためです。
Error from server (Forbidden): error when creating "agent.yaml": serviceaccounts is forbidden: User "xxxxxx" cannot create resource "serviceaccounts" in API group "" in the namespace "kube-system": GKEAutopilot authz: the namespace "kube-system" is managed and the request's verb "create" is denied
gcloud CLI を現在の作業環境にあわせて準備します。最新版を入手し、gke-gcloud-auth-pluginをインストールします。そうしないと、次の手順で以下のエラーが発生します。
gcloud components install gke-gcloud-auth-plugin gcloud components update
用意したGKEクラスタの詳細ページにアクセスし、認証情報の取得に使用するコマンドをコピーします。
コマンドを実行し、GKEクラスタとの接続を作成します。
Alibaba Cloudにクラスタ登録プロキシとしてRegister Clusterを作成し、対象のGKEクラスタをそれに登録します。
ACK Oneコンソールの「Register Clusters」ページに移動し、「Ready to Connect」ボタンをクリックします。
作成フォームにて対象のRegion、Zone、VPC、vSwitch等必要事項を入力し、「Create Cluster」ボタンをクリックすると、作成処理が実行されます。
通常通り、必要なリソースを作成するため、作成処理に時間がかかります。
しばらくすると、Register Clusterが作成され、「Waiting for Connections」ステータスになります。
対象クラスタの詳細ページに入り、関連タブで「connection information」を確認します。パブリックネットワークまたはインターナルネットワークを選択し、agent.yamlにコピーします。
既存の GKE クラスタをインターネットから登録するため、 パブリックネットワーク接続情報を選択します。
コマンドを実行し、ack-cluster-agentを対象のクラスタにインストールします。次のkubectlコマンドで名前空間「kube-system」配下に無事インストールされていることを確認します。
kubectl apply -f agent.yaml kubectl -n kube-system get pod
ターゲットのack-cluster-agent podが準備できれば、登録処理は正常に完了です。Alibaba CloudのターゲットRegister Clusterは、「Running」の状態になっているはずです。
AMCは「Alibaba Cloud Distributed Cloud Container Platform (ACK One)」が提供するコマンドラインツールです。
kubectlのプラグインとして動作し、以下のような機能を提供します。
コマンド `kubectl amc -h` でヘルプ情報を確認することができます。
注意として、AMCのパッケージをダウンロードし、実行可能な状態にしないと、以下のエラーメッセージが表示されます。
AMCをお使いの環境で利用する場合、以下のコマンドを実行するだけです。
wget http://ack-one.oss-cn-hangzhou.aliyuncs.com/kubectl-amc-linux && chmod +x kubectl-amc-linux && mv kubectl-amc-linux /usr/local/bin/kubectl-amc
ACK OneコンソールからCloudShellを使用する場合、一番最初にリマインダメッセージが表示されます。
AMCの一般的なコマンドをサンプルとして紹介します。以下のマルチクラスタ・サービス・シナリオで紹介します。
別アカウントでクラスターを管理し、ACK Oneサービスを利用してMulti-Cluster serviceを構築します。まずはVPCピアリング接続から行います。
異なるk8sクラスタ間にMulti-Cluster serviceを構築するために、VPC Peering接続によるトラフィックトンネルを準備します。
事前に準備した2つのアカウントで、同じリージョンにあるターゲットVPCとvSwitchを別々に取得します。
次のコンソール画面はACK OneインスタンスとASKクラスタを1つずつ関連付けるアカウントAの構成です。
今度のコンソール画面は分離されたASKクラスタを1つだけ持つアカウントBの構成です。
今回は、アカウントAからVPCピアリング接続を初期化し、アカウントBから適用するようにします。
VPCコンソールでVPCピアリング接続ページに入り、「Create VPC Peering Connection」ボタンをクリックして作成作業に入ります。
作成フォームに必要な情報を入力します。
接続の名前を入力します。
イニシエータとして、上記で準備したVPCを選択します。
ターゲットVPCが別アカウントのため、ここでは「Cross-Account」モードを選択します。
アカウントBのアカウントIDを入力します。
VPCが同じリージョンにあるため、ここでは「Intra-Region」モードを選択します。
アカウントBの下に用意されたリソースのVPC IDを入力します。
「OK」ボタンをクリックし、操作を実行します。
これが完了すると、アカウントAのVPCピアリング接続インスタンスがイニシエーターとなり、アカウントBの別のインスタンスが受け入れ待ちの状態になります。
インスタンスで「Accept」ボタンをクリックします。
しばらくすると、上記の2つのインスタンスが両方とも「Activated」の状態になります。
アカウントAのインスタンスにルートテーブルを設定します。
対象VPCピアリング接続インスタンスで「Configure Routes」リンクをクリックします。
ドロップダウン・リストからルート・テーブル・インスタンスを選択します。
「OK」ボタンをクリックし、作成プロセスに入ります。
フォームに必要な情報を入力します。宛先VPCの正しいCIDR値を使用したことを確認してください。
「OK」ボタンをクリックして操作を実行します。
完了すると、選択したルートテーブルで作成されたルートエントリが表示されます。
アカウントBのVPCピアリング接続インスタンスで同様の操作を行います。
各VPC下にECSインスタンスを1台ずつ作成し、`ping`コマンドで接続を確認します。
これで、VPCピアリング接続の準備が整いました。アカウントAのインスタンスがイニシエータ、アカウントBのインスタンスがアクセプタとして動作します。
Alibaba Cloud コンテナサービスのコンソールにアクセスし、各アカウントでASKクラスタを1つ作成します。上記で準備したVPCを選択したことを確認し、クラスタがサービスドメイン名を解決するのに役立つ「coreDNS」コンポーネントを有効にします。
これで、以下のように各アカウントの下に1つのASKクラスタが準備されます。
ACK One コンソールの 「Multi-cluster Management」ページに移動します。対応する設定でマルチクラスター管理を有効にし、選択したRegionにマスターインスタンスを作成します。
しばらくすると、そこでマスターインスタンスが動作するようになります。
ASKクラスタを別のアカウントで管理するために、プロキシとしてRegister Clusterを作成する必要があります。
次に、内部ネットワークの接続情報をコピーします。
アカウントBのターゲットクラスタの詳細ページを開き、デプロイメントページの「Create from YAML」ボタンをクリックします。
「Custom」 モードを選択し、コピーした yaml 設定を貼り付けます。設定に従って必要なリソースを作成します。
作成されたデプロイメントやPodの状態を確認します。
Register Clusterの接続状態を確認します。状態が「To Be Connected」から「Running」に変わっていれば、全ての処理が終了しています。
ACK Oneコンソールの「Associated Clusters」ページを開き、用意したクラスタを関連付けます。
「Add Associated Cluster」ボタンをクリックし、処理に入ります。
ポップアップウィンドウのチェックボックスで対象のクラスタを選択します。
「OK」ボタンをクリックして処理を実行します。
クラスタの状態が「Associated」になるまで処理を待ちます。その後、ACK Oneマスターインスタンスからターゲットクラスタを管理することができます。
マルチクラスターサービス(MCS)機能により、ロードバランサを作成することなくKubernetesクラスタ間でサービスにアクセスすることができます。これを実現するためには、マスターインスタンスへのサービスインポーターとエクスポーターを作成する必要があります。
全ての操作は、設定用YAMLファイルやコンソール操作で処理することができます。今回は設定用 YAML ファイルを操作します。
デプロイメントとサービスを持つ分散アプリケーション用に、以下のように ack-vpc-app-meta.yaml という名前の設定用 YAML ファイルを用意します。
apiVersion: v1 # The Service provider. kind: Service metadata: name: service1 namespace: provider-ns spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo department: demo sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: web-demo department: demo name: web-demo namespace: provider-ns spec: replicas: 1 selector: matchLabels: app: web-demo department: demo template: metadata: labels: app: web-demo department: demo spec: containers: - image: bwbw723/ack_one_demo_provider:1.0 name: web-demo env: - name: ENV_NAME value: cluster1-jp-for-gke --- apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: web-demo # アプリケーションのリソースとプロパゲーションポリシーを定義する。 namespace: provider-ns annotations: app.oam.dev/publishVersion: version1 spec: components: - name: web-demo type: ref-objects properties: objects: - resource: deployment name: web-demo - resource: service name: service1 policies: - type: topology name: cluster2 properties: clusters: ["ID of Cluster 2"] # リソースの配布先クラスターです。これを対象のクラスタIDに置き換えます。
ファイルの末尾にあるクラスタIDを更新してから利用してください。この場合、register clusterのIDを推奨します。
デプロイされたイメージには、ご自身のものか、テスト用に以下のいずれかを使用することができます。
acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/web-demo:0.4.0 -> Alibaba Cloudが提供、ENV_NAMEという設定した環境変数の値を応答として返します。
bwbw723/ack_one_demo_provider:1.0 -> 私たちが提供し、生成した注文情報をJSON形式でレスポンスとして返します。bwbw723/ack_one_demo_consumer:1.0 のイメージを以下の手順で同時に使用することをお勧めします。
サービスインポーターおよびエクスポーター用に、以下のような設定用 YAML ファイル (ack-vpc-mcs-service-policy.yaml) を別途用意します。
apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceExport metadata: name: service1 # この値は、エクスポートするKubernetes Serviceの名前と同じである必要があります namespace: provider-ns # この値は、エクスポートするKubernetes Serviceの名前空間と同じである必要があります --- apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceImport metadata: name: service1 # この値は、エクスポートするKubernetes Serviceの名前と同じである必要があります namespace: provider-ns # この値は、エクスポートするKubernetes Serviceの名前空間と同じである必要があります spec: ports: # このフィールドの値は、エクスポートするKubernetes Serviceが使用するポートと同じである必要があります - port: 80 protocol: TCP type: ClusterSetIP --- apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: amcs-export-service1 namespace: provider-ns labels: amcs: export amcs-service: service1 app: web-demo department: demo annotations: app.oam.dev/publishVersion: version1 spec: components: - name: export-service type: ref-objects properties: objects: - resource: serviceexport # ServiceExportを参照 name: service1 policies: - type: topology name: export-clusters properties: clusters: ["ID of Cluster 2"] # ServiceExportをACK Cluster 2に配布します --- apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: amcs-import-service1 namespace: provider-ns labels: amcs: import amcs-service: service1 app: web-demo department: demo annotations: app.oam.dev/publishVersion: version1 spec: components: - name: import-service type: ref-objects properties: objects: - resource: serviceimport # ServiceImportを参照 name: service1 policies: - type: topology name: import-clusters properties: clusters: ["ID of Cluster 1"] # ACK Cluster 1にServiceImportを配布
上記と同様に、設定ファイルのクラスタIDを更新してから利用してください。サービスエクスポーターは,上記の手順でサービスプロバイダをデプロイしたクラスターで設定する必要があります。また、サービスインポーターはもう一方のクラスタに設定する必要があります。
必要に応じて、OSSバケットにアップロードし、Alibaba Cloudのシェル環境にダウンロードし、さらに使用することができます。または、次のステップで、ローカルの作業環境で直接使用することもできます。
ASK/ACKクラスタと同じように、作業環境からACK Oneマスターインスタンスに接続することができます。今回はAlibaba Cloud shellを使用します。
ACK Oneコンソールの「Master Instance Basic Information」ページを開き、「Manage Master Instance in Cloud Shell」ボタンをクリックしてCloudShellを開きます。
まずCloudShellでAMCコマンドラインツールを起動します。
wget http://ack-one.oss-cn-hangzhou.aliyuncs.com/kubectl-amc-linux && chmod +x kubectl-amc-linux && mv kubectl-amc-linux /usr/local/bin/kubectl-amc
コマンドで管理されているクラスタを確認します。
kubectl amc get managedclusters
マルチクラスターサービスを構築するための新しいネームスペースを作成します。
kubectl create ns provider-ns
作成されたネームスペースの情報をコンソールから確認します。
用意した ack-vpc-app-meta.yaml を用いて分散アプリケーションをデプロイし、`kubectl` コマンドでリソースの状態を確認します。
kubectl apply -f ack-vpc-app-meta.yaml kubectl get app web-demo -n provider-ns kubectl amc get deployment,service -n provider-ns -m <cluster ID>
コンソールからもデプロイメントとサービスを確認します。
用意したack-vpc-mcs-service-policy.yamlでサービスインポーターとエクスポーターをデプロイし、リソースの状態を確認します。
kubectl apply -f ack-vpc-mcs-service-policy.yaml kubectl amc get serviceexport,serviceimport -n provider-ns -m all
コンソールからマルチクラスターサービスを確認します。
アカウントAでサーバーインポーターとして使用するASKクラスタの詳細ページを表示し、以下の設定YAMLでサービスコンシューマデプロイメントを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: demo-consumer labels: app: demo-consumer spec: selector: matchLabels: app: demo-consumer tier: frontend strategy: type: Recreate template: metadata: labels: app: demo-consumer tier: frontend spec: containers: - image: bwbw723/ack_one_demo_consumer:1.0 name: demo-consumer ports: - containerPort: 8080 name: demo-consumer
関与するイメージ bwbw723/ack_one_demo_consumer:1.0 は、Web アプリケーションサーバを起動し、インポートしたサービスから取得した JSON の結果を返します。マルチクラスターサービスには、コード中の `curl amcs-service1.provider-ns.svc.cluster.local` というcurlコマンドでアクセスします。
作成されたデプロイメントとPodを確認します。
関連するPodのターミナルに入り、マルチクラスターサービスとの接続を確認。
コンソールのサービスページに移動し、demo-consumerのデプロイメントをベースにSLBサービスを作成します。
「Create」ボタンをクリックすると、ポップアップウィンドウが表示されます。
Webアプリケーションサーバが8080番ポートでリッスンしているので、SLBの助けを借りて80番ポートにエクスポートする必要があります。
「Create」ボタンをクリックして、操作を実行します。
外部エンドポイントが生成されるまで、SLBサービスの作成を待つ。Webブラウザからアクセスし、マルチクラスターサービスの実行結果を確認します。
セキュリティグループの設定を確認し、そこで接続エラーが発生する場合は、80/8080番ポートのインバウンドトラフィックを適用してください。
本記事ではACK Oneを使って、複数のAlibaba Cloudアカウント上のKubernetesクラスタを統合管理する方法を紹介しました。ACK Oneはこの通り、直観的なインターフェースを使用して、手間をかけずに複数のKubernetesクラスタを管理しながらアプリケーションのワークロードを簡単に処理することができます。また、ACK OneにはLogService、ARMS、Prometheusなどの他ツールと連携することができますので、Kubernetesによるハイブリットクラウド・マルチクラウドを作成する際は参考に頂ければ幸いです。
Special Thanks Bos.
Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。
Alibaba Cloudは中国国内でのクラウド利用はもちろん、日本-中国間のネットワークの不安定さの解消、中国サイバーセキュリティ法への対策など、中国進出に際する課題を解消できるパブリッククラウドサービスです。
MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。
条件に該当するページがございません