フォーム読み込み中
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によるマルチクラスターサービスの構築方法について説明します。
全体構成図は次の通りになります。
VPN Gatewayによるネットワーク接続を構築するために、Alibaba Cloud上でVPCとvSwitchを作成します。
外部IPアドレスを生成するために、Alibaba CloudにVPN Gatewayを作成します。
VPN Gatewayコンソールの「Create VPN Gateway」ボタンをクリックします。
作成フォームに必要事項を入力し、上記の手順で作成した特定のVPCとvSwitchが選択されていることを確認します。
「Buy Now」ボタンをクリックし、注文確認ページに入ります。
利用規約を確認します。
「Activate Now」ボタンをクリックして、作成操作を実行します。
作成されたリソースを確認し、IPアドレスが生成されるのを待ちます。この時、VPN Gatewayインスタンスは「Active」になりますので、その時に表示されるIPアドレスをメモしておきます。このIPアドレスは今後利用します。
Goocle Cloudプラットフォームの「VPC Network」コンソールに移動し、サブネットを持つ新しいVPCを作成します。
「Create VPC Network」ボタンをクリックし、作業に入ります。
基本設定の必要事項を入力し、サブネット作成モードは「custom」を選択します。
サブネット設定の必要事項を入力し、ターゲット地域をピックアップして、IPアドレスの範囲がAlibaba CloudのVPCと異なることを確認します。
推奨されるファイアウォールルールを選択します。
「Create」ボタンをクリックして操作を実行します。
完了すると、Goocle CloudのターゲットVPCネットワークが表示されます。
Goocle CloudのVPNコンソールに移動し、さらに使用するためのVPN接続を作成します。
VPNコンソールの 「Create VPN connection」ボタンをクリックします。
クラシックVPNモードを選択し、「Continue」ボタンをクリックすると、次のステップに進みます。
VPN Gatewayの基本情報(ネットワーク、地域等)を入力してください。
ターゲットVPN Gatewayとバインドするための新しい静的IPアドレスを予約します。これは、VPC NetworkコンソールのIPアドレスのページで別途作成することもできます。このIPアドレスは、今後使用するために覚えておいてください。
VPNトンネルの設定を行います。
Remote peer IP addressは、Alibaba CloudのVPN Gatewayの生成された外部IPアドレスにします。
IKEのバージョンはIKEv2を選択します。
IKE pre-shared keyを指定し、今後の使用のためにそれを覚えておきます。
ルーティングオプションをPolicy-basedと選択します。
Remote network IP rangesは、Alibaba CloudのVPCまたはvSwitchのCIDRを指定します。
上記の手順で作成したVPCネットワークに基づいて、Local subnetworksとLocal IP rangesを設定します。
「Create」をクリックし、操作を実行します。
VPN Gatewayやトンネルなど、作成されたリソースを確認します。
Alibaba Cloudにカスタマーゲートウェイを作成します。
Alibabaコンソールの 「Create Customer Gateway」ボタンをクリックします。
ポップアップウィンドウに必要な情報を入力し、IPアドレスを上記の手順で生成した静的IPアドレスのインスタンスとして設定します。
「OK」ボタンをクリックし、操作を実行します。
作成されたインスタンスを以下のように確認します。
次はAlibaba CloudでIPsec接続を構築します。Alibaba CloudのVPCコンソールから処理します。
「Create IPsec Connection」ボタンをクリックします。
基本設定に必要な情報を入力します。
Associate ResourceをVPN Gatewayに設定し、対応するVPN GatewayとCustomer Gatewayをドロップダウンリストで選択します。
ルーティングモードとして保護されたデータフローを選択します。
ローカルネットワークに、Alibaba CloudのターゲットVPCまたはvSwitchのIPレンジを設定します。
Goocle CloudのターゲットVPCのIPレンジでリモートネットワークを設定します。
VPN Gatewayの顧客ルートポリシーを手動で公開する必要があるため、推奨通り「Effective Immediately(即時実行)」をYesに設定します。
事前共有キーは、Goocle Cloudの設定で設定したものと同じものを設定します。
詳細設定に必要な情報を入力します。
IKE設定の項目で、Goocle Cloudの設定で設定したものと同じIKEv2をピックアップします。Encryption Algorithmをaes256、Authentication Algorithmをsha256に設定します。
IPsecの条件欄は、上記と同様にEncryption Algorithmをaes256、Authentication Algorithmをsha256に設定します。
BGPの設定はデフォルトで無効のままにしておきます。
「OK」ボタンをクリックして、操作を実行します。
作成されたIPsec接続は、接続ステータスにエラーが表示されます。必要なリソースをすべて用意したため、接続状態はすぐに成功に変わります。最終的な接続ステータスが「Phase 2 of IKE Tunnel Negotiation Succeeded」であることを確認します。接続ステータスがこの通りでない場合、上記の設定ステップで何らかのエラーが発生している可能性があります。
設定が正常に完了したことを確認するためには、IPsecの接続状況以外にもいくつかの項目を確認した方が良いです。
まずGoocle CloudのVPNトンネルの状態を確認します。Alibaba CloudでIPsec接続が正常に設定されたら、同時にGoocle CloudのVPNトンネルも「Established」に更新する必要があります。
その後、Alibaba CloudのVPNコンソールに戻り、対象のVPN Gatewayの下にあるPolicy-based Routingを確認してください。公開されたルートエントリがあるはずです。
もし、ルートエントリが「Unpublished」の状態になっている場合は、手動で公開してください。
選択したVPCのルートテーブルを表示し、ルートエントリーリストのカスタムルートを確認します。VPN Gatewayの下に、公開されているルートエントリに応じた項目が1つあるはずです。
Alibaba CloudとGoocle Cloudの両方で2つのVMを作成し、`ping`コマンドでネットワーク接続を確認します。接続構成に問題がなければ、以下のようなレスポンスが返ってきます。
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のシェル環境にダウンロードして、さらに使用することができます。または、次の手順でローカルの作業環境で直接使用することもできます。
VPN接続によるマルチクラスタサービスが完了したら、GKEクラスタのPodからサービスにアクセスすることになります。そのため、GKEクラスタのPodのIPレンジをVPN接続で見えるようにする必要があります。
つまり、上記の手順でサブネットワークのIP範囲以外に、PodのIP範囲のルートエントリーを新規に設定する必要があります。
GKEクラスタに設定されているPodやサービスのIPレンジを確認します。
Podとサービスの両方のIPレンジを含むVPNトンネルを再作成します。
Alibaba CloudのIPsec接続を更新し、リモートネットワークオプションとしてこれら2つのIPレンジを追加します。
VPN GatewayとvSwitchの両方で、公開されたルートエントリを確認します。
そうすれば、ネットワーク接続はクラスタに合わせることができます。
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番ポートのインバウンドトラフィックを適用します。
本記事ではACK Oneを使って、Google Cloud Kubernetes(GKE)とAlibaba Cloud Kubernetesを繋げてマルチクラウドを構築し、Kubernetesを統一管理する方法を紹介しました。現在、Google Cloud Anthos、Redhad Openshiftなど様々なハイブリットクラウド・マルチクラウドソリューションが出回っていますが、ACK Oneのこのようなシンプルで簡単な構成管理が出来るインターフェースであれば、サービスが大規模でも柔軟かつ簡単に管理できるのは非常に心強いと感じます。Kubernetesによるハイブリットクラウド・マルチクラウドを作成する際は参考に頂ければ幸いです。
Special Thanks Bob.
条件に該当するページがございません