Google Cloud Kubernetes(GKE)とAlibaba Cloud KubernetesをACK Oneでマルチクラウド構築してみる

2022年12月27日掲載

キービジュアル

Alibaba Cloud ACK Oneを使って、Google Cloud Kubernetes(GKE)とAlibaba Cloud KubernetesをAlibaba Cloud ACK Oneでマルチクラウド構築してみました。

目次

はじめに

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サービスを利用して、Alibaba Cloud上のASKクラスタ間でマルチクラスタサービスを構築する方法を説明しました。ACK Oneでは、データセンターに配置されたクラスタだけでなく、サードパーティクラウド上のクラスタも登録できるため、GKEクラスタを巻き込んで、マルチクラスタサービスを構築することも可能です。

本トピックでは、VPN Gatewayを介したAlibaba CloudとGoogle Cloud間のネットワーク接続の構築方法と、それをベースにしたACK Oneによるマルチクラスターサービスの構築方法について説明します。

 

1. 全体構成図

全体構成図は次の通りになります。

画像

2. Alibaba CloudにVPCとvSwitchを作成

VPN Gatewayによるネットワーク接続を構築するために、Alibaba Cloud上でVPCとvSwitchを作成します。

3.Alibaba CloudにVPN Gatewayを作成

外部IPアドレスを生成するために、Alibaba CloudにVPN Gatewayを作成します。

操作画面
  1. VPN Gatewayコンソールの「Create VPN Gateway」ボタンをクリックします。

  2. 作成フォームに必要事項を入力し、上記の手順で作成した特定のVPCとvSwitchが選択されていることを確認します。

  3. Buy Now」ボタンをクリックし、注文確認ページに入ります。

  4. 利用規約を確認します。

  5. Activate Now」ボタンをクリックして、作成操作を実行します。

作成されたリソースを確認し、IPアドレスが生成されるのを待ちます。この時、VPN Gatewayインスタンスは「Active」になりますので、その時に表示されるIPアドレスをメモしておきます。このIPアドレスは今後利用します。

4.Goocle Cloudでサブネットを持つVPCネットワークを作成

Goocle Cloudプラットフォームの「VPC Network」コンソールに移動し、サブネットを持つ新しいVPCを作成します。

  1. Create VPC Network」ボタンをクリックし、作業に入ります。

  2. 基本設定の必要事項を入力し、サブネット作成モードは「custom」を選択します。

  3. サブネット設定の必要事項を入力し、ターゲット地域をピックアップして、IPアドレスの範囲がAlibaba CloudのVPCと異なることを確認します。

  4. 推奨されるファイアウォールルールを選択します。

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

完了すると、Goocle CloudのターゲットVPCネットワークが表示されます。

5.Google CloudにVPN Gatewayを作成

Goocle CloudのVPNコンソールに移動し、さらに使用するためのVPN接続を作成します。

操作画面
  1. VPNコンソールの 「Create VPN connection」ボタンをクリックします。

  2. クラシックVPNモードを選択し、「Continue」ボタンをクリックすると、次のステップに進みます。

  3. VPN Gatewayの基本情報(ネットワーク、地域等)を入力してください。

  4. ターゲットVPN Gatewayとバインドするための新しい静的IPアドレスを予約します。これは、VPC NetworkコンソールのIPアドレスのページで別途作成することもできます。このIPアドレスは、今後使用するために覚えておいてください。

  5. VPNトンネルの設定を行います。

    1. Remote peer IP addressは、Alibaba CloudのVPN Gatewayの生成された外部IPアドレスにします。

    2. IKEのバージョンはIKEv2を選択します。

    3. IKE pre-shared keyを指定し、今後の使用のためにそれを覚えておきます。

    4. ルーティングオプションをPolicy-basedと選択します。

    5. Remote network IP rangesは、Alibaba CloudのVPCまたはvSwitchのCIDRを指定します。

    6. 上記の手順で作成したVPCネットワークに基づいて、Local subnetworksLocal IP rangesを設定します。

  6. Create」をクリックし、操作を実行します。

VPN Gatewayやトンネルなど、作成されたリソースを確認します。

6. Alibaba Cloudにカスタマーゲートウェイを作成

Alibaba Cloudにカスタマーゲートウェイを作成します。

  1. Alibabaコンソールの 「Create Customer Gateway」ボタンをクリックします。

  2. ポップアップウィンドウに必要な情報を入力し、IPアドレスを上記の手順で生成した静的IPアドレスのインスタンスとして設定します。

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

作成されたインスタンスを以下のように確認します。

7.Alibaba CloudでIPsec接続を作成

次はAlibaba CloudでIPsec接続を構築します。Alibaba CloudのVPCコンソールから処理します。

  1. Create IPsec Connection」ボタンをクリックします。

  2. 基本設定に必要な情報を入力します。

    1. Associate ResourceをVPN Gatewayに設定し、対応するVPN GatewayとCustomer Gatewayをドロップダウンリストで選択します。

    2. ルーティングモードとして保護されたデータフローを選択します。

    3. ローカルネットワークに、Alibaba CloudのターゲットVPCまたはvSwitchのIPレンジを設定します。

    4. Goocle CloudのターゲットVPCのIPレンジでリモートネットワークを設定します。

    5. VPN Gatewayの顧客ルートポリシーを手動で公開する必要があるため、推奨通り「Effective Immediately(即時実行)」をYesに設定します。

    6. 事前共有キーは、Goocle Cloudの設定で設定したものと同じものを設定します。

  3. 詳細設定に必要な情報を入力します。

    1. IKE設定の項目で、Goocle Cloudの設定で設定したものと同じIKEv2をピックアップします。Encryption Algorithmをaes256、Authentication Algorithmをsha256に設定します。

    2. IPsecの条件欄は、上記と同様にEncryption Algorithmをaes256、Authentication Algorithmをsha256に設定します。

  4. BGPの設定はデフォルトで無効のままにしておきます。

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


作成されたIPsec接続は、接続ステータスにエラーが表示されます。必要なリソースをすべて用意したため、接続状態はすぐに成功に変わります。最終的な接続ステータスが「Phase 2 of IKE Tunnel Negotiation Succeeded」であることを確認します。接続ステータスがこの通りでない場合、上記の設定ステップで何らかのエラーが発生している可能性があります。

8.ネットワーク接続の設定を確認

設定が正常に完了したことを確認するためには、IPsecの接続状況以外にもいくつかの項目を確認した方が良いです。

まずGoocle CloudのVPNトンネルの状態を確認します。Alibaba CloudでIPsec接続が正常に設定されたら、同時にGoocle CloudのVPNトンネルも「Established」に更新する必要があります。

その後、Alibaba CloudのVPNコンソールに戻り、対象のVPN Gatewayの下にあるPolicy-based Routingを確認してください。公開されたルートエントリがあるはずです。

もし、ルートエントリが「Unpublished」の状態になっている場合は、手動で公開してください。

選択したVPCのルートテーブルを表示し、ルートエントリーリストのカスタムルートを確認します。VPN Gatewayの下に、公開されているルートエントリに応じた項目が1つあるはずです。

9.ネットワーク接続を確認

Alibaba CloudとGoocle Cloudの両方で2つのVMを作成し、`ping`コマンドでネットワーク接続を確認します。接続構成に問題がなければ、以下のようなレスポンスが返ってきます。

操作画面

10.ASKクラスタとGKEクラスタによるマルチクラスタサービスの構築

ACK Oneを利用して、マルチクラスターサービスを構築します。Alibaba CloudのASKクラスタはサービスプロバイダとして、Goocle CloudのGKEクラスタはサービスの応答をチェックするためのデモコンシューマ用プロバイダとして展開します。

前提条件

  • 上記の手順でVPN Gatewayを介した共通ネットワーク接続の準備。

  • ACK Oneでマルチクラスタ管理を有効にし、対象リージョンにマスターインスタンスを作成。

  • Alibaba Cloudの対象リージョンにASKクラスタを1つ用意。

  • Goocle Cloudの対象リージョンにGKE標準クラスタが1つあることを確認。

  • Alibaba Cloudで登録クラスタを作成し、GKEクラスタとの接続に成功すること。

  • 準備したクラスターをACK Oneに関連付けていること。

  • マルチクラスターサービスの設定YAMLファイルを用意済。

参考として、この記事「複数の異なるアカウントのサーバレスKubernetesクラスタをAlibaba Cloud ACK Oneで統合管理してみる」で作り方を把握することもできます。

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

操作画面

この記事「複数の異なるアカウントのサーバレスKubernetesクラスタをAlibaba Cloud ACK Oneで統合管理してみる」の設定YAMLファイルを再利用して、アプリケーションを配布し、Alibaba CloudのASK clusterにサービスエクスポーターを作成し、Goocle CloudのGKE clusterにサービスインポーターを作成します。

ここに関連する設定YAMLファイルを例として列挙します。デプロイメントとサービスを含む分散アプリケーションのack-vpc-app-meta.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 the ASK cluster"]     # リソースの配布先クラスターです。これを対象のクラスタIDに置き換えます。

サービスインポーターおよびエクスポーター用に、以下のような設定用 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 the ASK cluster"]  # 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 the register cluster for GKE cluster"]  # ACK Cluster 1にServiceImportを配布

設定用YAMLファイルのクラスタIDを更新してから利用します。
以下は、マルチクラスタサービスの検証手順における gke-consumer.yaml です。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-consumer
  namespace: provider-ns
  labels:
    app: web-demo
    department: demo
spec:
  selector:
    matchLabels:
      app: web-demo
      department: demo
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: web-demo
        department: demo
    spec:
      containers:
      - image: bwbw723/ack_one_demo_consumer:1.0
        name: demo-consumer
        ports:
        - containerPort: 8080
          name: demo-consumer

必要に応じて、OSSバケットにアップロードし、Alibaba Cloudのシェル環境にダウンロードして、さらに使用することができます。または、次の手順でローカルの作業環境で直接使用することもできます。

11.クラスターでVPN接続を更新

VPN接続によるマルチクラスタサービスが完了したら、GKEクラスタのPodからサービスにアクセスすることになります。そのため、GKEクラスタのPodのIPレンジをVPN接続で見えるようにする必要があります。

つまり、上記の手順でサブネットワークのIP範囲以外に、PodのIP範囲のルートエントリーを新規に設定する必要があります。

GKEクラスタに設定されているPodやサービスのIPレンジを確認します。

Podとサービスの両方のIPレンジを含むVPNトンネルを再作成します。

Alibaba CloudのIPsec接続を更新し、リモートネットワークオプションとしてこれら2つのIPレンジを追加します。

VPN GatewayとvSwitchの両方で、公開されたルートエントリを確認します。

そうすれば、ネットワーク接続はクラスタに合わせることができます。

 

12.クラウドシェルからマルチクラスターサービスを構築

ASK/ACKクラスタと同じように、作業環境からACK Oneマスターインスタンスに接続することができます。今回はAlibaba Cloud shellを使用します。

ACK Oneコンソールの「Master Instance Basic Information」ページを開き、「Manage Master Instance in Cloud Shell」ボタンをクリックしてクラウドシェルを開きます。

`kubectl 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でクラスタの関連付けに成功した場合、ここに表示されます。

provider-ns」という新しい名前空間を作成し、次のステップでこの下にデプロイメントとサービスを作成します。

kubectl create ns provider-ns

事前に準備した設定 YAML ファイルを使用して、デプロイとサービスを含む分散アプリケーションを作成します。イメージとして bwbw723/ack_one_demo_provider:1.0 を使用している場合、作成されたサービスは、生成された注文情報をレスポンスとして返します。

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>

また、コンソールから直接リソースを確認することもできます。アプリケーションはAlibaba Cloud上のASKクラスタに配布されるため、対象クラスタの詳細ページには対象のデプロイメント、Pod、サービスが表示されるはずです。

操作画面

`kubectl` コマンドでサービスのインポータとエクスポータを作成し、ASK クラスタと GKE クラスタ間のマルチクラスタ サービスを構築します。

コンソールからウィザードで処理することも可能です。マルチクラスタサービスは、ClusterIPモードのサービスのみをサポートしていることを確認してください。

kubectl apply -f ack-vpc-mcs-service-policy.yaml
kubectl amc get serviceexport,serviceimport -n provider-ns -m all

作成されたマルチクラスターサービスは、コンソールで確認することができました。ページの図は、Demo Cluster 2 がDemo Cluster 1 の Service 1 にアクセスする必要がある例です。

ページで「Access Method for Multi-cluster Services」をチェックしてください。

また、GKEクラスタにacms-<ASKクラスタのサービス名>という名前でサービスが作成されます。この場合、サービス名は「acms-service1」です。

実際のレスポンスはASKクラスタに配置されたサービスが提供するため、対象のサービスは0/0のServingPodを持つことになります。

マルチクラスタサービスにアクセスするために、GKEクラスタにdemo-consumerをデプロイします。

kubectl apply -f gke-consumer.yaml

`kubectl`コマンドで生成されたPodを確認します。

kubectl get pod -n provider-ns

Podに入り、マルチクラスターサービスを確認します。上記の手順で見つけたマルチクラスターサービスのアクセス方法、またはdemo-consumerイメージが提供する8080番ポートのローカルウェブアプリケーションで確認することができます。

kubectl exec -n provider-ns -ti demo-consumer-6bf66448f7-z54nz -- sh
curl amcs-service1.provider-ns.svc.cluster.local
curl 127.0.0.1:8080

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

13.さいごに

本記事ではACK Oneを使って、Google Cloud Kubernetes(GKE)とAlibaba Cloud Kubernetesを繋げてマルチクラウドを構築し、Kubernetesを統一管理する方法を紹介しました。現在、Google Cloud Anthos、Redhad Openshiftなど様々なハイブリットクラウド・マルチクラウドソリューションが出回っていますが、ACK Oneのこのようなシンプルで簡単な構成管理が出来るインターフェースであれば、サービスが大規模でも柔軟かつ簡単に管理できるのは非常に心強いと感じます。Kubernetesによるハイブリットクラウド・マルチクラウドを作成する際は参考に頂ければ幸いです。

Special Thanks Bob.

関連サービス

Alibaba Cloud

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

MSPサービス

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

おすすめの記事

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