複数の異なるアカウントのサーバレスKubernetesクラスタをAlibaba Cloud ACK Oneで統合管理してみる

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サービスにも適用できますので、参考にして頂ければ幸いです。

1. 全体構成図

全体構成図は次の通りになります。
異なるAlibaba Cloudアカウント配下のVPCはそれぞれ独立していますが、VPCピアリング接続を使って、単一のVPCにしたうえで構築します。

2. ACK One事前準備

最初に、事前準備としてターゲットとなるRegion配下に、以下のリソースを準備しておきます。
  • Resource group(推奨)
  • VPCとvSwitch(必須)
  • ACK/ASKクラスタ1台以上(必須)

この準備が出来たら、ACK Oneによる構築を進めます。

ACK Oneコンソールに初めてアクセスすると、サービスのアクティベーションページに入ります。サービスを利用する前に、アクティベーションを行う必要があります。

3. ACK One マスターインスタンス作成

ACK One アクティベーション後、ACK Oneマスターインスタンスの設定画面へ遷移します。VPCとvSwitchが用意されたターゲットのRegionをピックアップし、作成したマスターインスタンスでマルチクラスタ管理を有効にします。

アカウントで初めてマルチクラスタ管理を有効にした場合、特定のロールやロールポリシーで見つからないエラーが発生します。

これを解決するには、エラーメッセージを閉じてからポップアップウィンドウのOKボタンをクリックするだけで、必要なロールとロールポリシーの作成操作が実行されます。

一方、選択したRegionにクラスタが存在しない場合は、同様にエラーで初期処理が中断されます。

操作画面

最初の処理は、マスターインスタンスを作成するため、時間がかかります。

操作画面

この処理は「Master Instance Logs」タブで作成ログを確認することができます。

操作画面

いったん、マスターインスタンスが `running` 状態になり、それを通してマルチクラスタ管理ができるようになります。

4.関連するクラスタをACK Oneに追加

ターゲットクラスタを管理するためには、ACK Oneの関連クラスタとして追加する必要があります。

Associated Clusters」 ページで 「Add Associated Cluster」ボタンをクリックし、 リストからターゲットクラスタを選択して 「OK」ボタンをクリックして操作を実行します。

しばらくすると、対象のクラスタがACK Oneの関連クラスタになります。

5. クラスタをACK Oneに登録

ACK Oneでは、データセンター内に展開されたクラスタだけでなく、サードパーティのクラウド上に展開されたクラスタも登録することができます。ここではGCPプラットフォームに展開されたGKEクラスターを例にとって説明します。

5-1. GCP準備作業 

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クラスタとの接続を作成します。

5-2. GKEクラスタをACK Oneに登録

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」の状態になっているはずです。

6.kubectlコマンドによるクラスタ管理

AMCは「Alibaba Cloud Distributed Cloud Container Platform (ACK One)」が提供するコマンドラインツールです。

kubectlのプラグインとして動作し、以下のような機能を提供します。

  • マスターインスタンスが管理するクラスタ名を指定し、AMCを使用してクラスタに接続します。その後、クラスタ内のDeployments、Service、Ingressを管理することができます。
  • マスターインスタンスが管理するクラスタにスケジュールされているタスクを指定し、そのクラスタに接続します。すると、PodやServiceなど、タスク用に作成されたKubernetesリソースの情報を問い合わせることができます。また、タスクのログを照会することもできます。

コマンド `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の一般的なコマンドをサンプルとして紹介します。以下のマルチクラスタ・サービス・シナリオで紹介します。

7.VPCピアリング接続によるクラスタ間のマルチクラスタサービスの構築

別アカウントでクラスターを管理し、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から適用するようにします。

  1. VPCコンソールでVPCピアリング接続ページに入り、「Create VPC Peering Connection」ボタンをクリックして作成作業に入ります。

  2. 作成フォームに必要な情報を入力します。

    1. 接続の名前を入力します。

    2. イニシエータとして、上記で準備したVPCを選択します。

    3. ターゲットVPCが別アカウントのため、ここでは「Cross-Account」モードを選択します。

    4. アカウントBのアカウントIDを入力します。

    5. VPCが同じリージョンにあるため、ここでは「Intra-Region」モードを選択します。

    6. アカウントBの下に用意されたリソースのVPC IDを入力します。

  3. 「OK」ボタンをクリックし、操作を実行します。

 

これが完了すると、アカウントAのVPCピアリング接続インスタンスがイニシエーターとなり、アカウントBの別のインスタンスが受け入れ待ちの状態になります。

インスタンスで「Accept」ボタンをクリックします。

しばらくすると、上記の2つのインスタンスが両方とも「Activated」の状態になります。

操作画面

アカウントAのインスタンスにルートテーブルを設定します。

  1. 対象VPCピアリング接続インスタンスで「Configure Routes」リンクをクリックします。

  2. ドロップダウン・リストからルート・テーブル・インスタンスを選択します。

  3. 「OK」ボタンをクリックし、作成プロセスに入ります。

  4. フォームに必要な情報を入力します。宛先VPCの正しいCIDR値を使用したことを確認してください。

  5. 「OK」ボタンをクリックして操作を実行します。

完了すると、選択したルートテーブルで作成されたルートエントリが表示されます。

アカウントBのVPCピアリング接続インスタンスで同様の操作を行います。

各VPC下にECSインスタンスを1台ずつ作成し、`ping`コマンドで接続を確認します。

これで、VPCピアリング接続の準備が整いました。アカウントAのインスタンスがイニシエータ、アカウントBのインスタンスがアクセプタとして動作します。

8.各アカウントで必要なASKクラスタを作成する

Alibaba Cloud コンテナサービスのコンソールにアクセスし、各アカウントでASKクラスタを1つ作成します。上記で準備したVPCを選択したことを確認し、クラスタがサービスドメイン名を解決するのに役立つ「coreDNS」コンポーネントを有効にします。

これで、以下のように各アカウントの下に1つのASKクラスタが準備されます。

9.マルチクラスター管理の有効化とマスターインスタンスの作成

ACK One コンソールの 「Multi-cluster Management」ページに移動します。対応する設定でマルチクラスター管理を有効にし、選択したRegionにマスターインスタンスを作成します。

しばらくすると、そこでマスターインスタンスが動作するようになります。

10.別のアカウントからASKクラスタを登録

ASKクラスタを別のアカウントで管理するために、プロキシとしてRegister Clusterを作成する必要があります。

次に、内部ネットワークの接続情報をコピーします。

アカウントBのターゲットクラスタの詳細ページを開き、デプロイメントページの「Create from YAML」ボタンをクリックします。

Custom」 モードを選択し、コピーした yaml 設定を貼り付けます。設定に従って必要なリソースを作成します。

作成されたデプロイメントやPodの状態を確認します。

Register Clusterの接続状態を確認します。状態が「To Be Connected」から「Running」に変わっていれば、全ての処理が終了しています。

11.クラスターを関連付ける

ACK Oneコンソールの「Associated Clusters」ページを開き、用意したクラスタを関連付けます。

  1. Add Associated Cluster」ボタンをクリックし、処理に入ります。

  2. ポップアップウィンドウのチェックボックスで対象のクラスタを選択します。

  3. OK」ボタンをクリックして処理を実行します。

クラスタの状態が「Associated」になるまで処理を待ちます。その後、ACK Oneマスターインスタンスからターゲットクラスタを管理することができます。

12.マルチサービス設定用YAMLファイルの準備

マルチクラスターサービス(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のシェル環境にダウンロードし、さらに使用することができます。または、次のステップで、ローカルの作業環境で直接使用することもできます。

13.CloudShellからマルチクラスターサービスを作成

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サービスを作成します。

  1. Create」ボタンをクリックすると、ポップアップウィンドウが表示されます。

  2. Webアプリケーションサーバが8080番ポートでリッスンしているので、SLBの助けを借りて80番ポートにエクスポートする必要があります。

  3. Create」ボタンをクリックして、操作を実行します。

外部エンドポイントが生成されるまで、SLBサービスの作成を待つ。Webブラウザからアクセスし、マルチクラスターサービスの実行結果を確認します。

セキュリティグループの設定を確認し、そこで接続エラーが発生する場合は、80/8080番ポートのインバウンドトラフィックを適用してください。

14.さいごに

本記事ではACK Oneを使って、複数のAlibaba Cloudアカウント上のKubernetesクラスタを統合管理する方法を紹介しました。ACK Oneはこの通り、直観的なインターフェースを使用して、手間をかけずに複数のKubernetesクラスタを管理しながらアプリケーションのワークロードを簡単に処理することができます。また、ACK OneにはLogService、ARMS、Prometheusなどの他ツールと連携することができますので、Kubernetesによるハイブリットクラウド・マルチクラウドを作成する際は参考に頂ければ幸いです。

Special Thanks Bos.

関連サービス

Google Cloud

Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。

Alibaba Cloud

Alibaba Cloudは中国国内でのクラウド利用はもちろん、日本-中国間のネットワークの不安定さの解消、中国サイバーセキュリティ法への対策など、中国進出に際する課題を解消できるパブリッククラウドサービスです。

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません