column
コラム
こんにちは。クラウドCoEの竹中です。
今回は、
の間でService Discoveryを有効化し、透過的に通信する方法について記載していこうと思います。KubernetesではService Discoveryを利用することで、Podに対して透過的に通信することができます。
例えばアプリケーションからnginx-serviceというマイクロサービスに対してリクエストを送信するようなケースを考えます。
下記のようにServiceリソースを用いることで、Service Discoveryを用いた透過的な通信が可能になります。
これにより、例えばPodがスケールアウトした場合や、他のNodeにフェールオーバーした場合でも、クライアントはそれを意識せずにマイクロサービスと通信できます。
上記はシングルクラスタの例でしたが、Service Discoveryをマルチクラスタに拡張することで、クラスタの違いさえも意識しない通信が可能になります。
なお、今回使用したEKS, AKS, Ciliumのバージョンは以下の通りです。
事前準備: Site-to-Site VPNの接続
kubectl patch ds aws-node -n kube-system -p '{"spec":{"template":{"spec":{"nodeSelector":{"no-such-node": "true"}}}}}'
kubectl patch ds kube-proxy -n kube-system -p '{"spec":{"template":{"spec":{"nodeSelector":{"no-such-node": "true"}}}}}'
ⅴ. kube-proxyをCiliumに置き換えるよう設定する
※参考:
cilium clustermesh enable
以上でAWS側の設定は完了です。
export NODE_SUBNET_ID=$(az network vnet subnet show \ --resource-group "<resource-group>" \ --vnet-name "<vnet-name>" \ --name "cilium-subnet" \ --query id \ -o tsv) az aks create \ --resource-group "<resource-group>" \ --name "cilium-mesh-cluster" \ --network-plugin none \ --pod-cidr "10.200.0.0/16" \ --service-cidr "10.201.0.0/16" \ --dns-service-ip "10.201.0.10" \ --vnet-subnet-id "${NODE_SUBNET_ID}" \ --kubernetes-version 1.26.10
ⅱ. Pod, ServiceのIP範囲を指定する(AWS側のものと被らないように!)
kubectl patch ds kube-proxy -n kube-system -p '{"spec":{"template":{"spec":{"nodeSelector":{"no-such-node": "true"}}}}}'
cilium clustermesh enable
以上でAzure側の設定は完了です。
# EKS export CLUSTER1=arn:aws:eks:ap-northeast-1:<account-id>:cluster/multicloud-cluster # AKS export CLUSTER2=multi-cilium-cluster kubectl delete secret cilium-ca --context $CLUSTER2 -n kube-system kubectl --context=$CLUSTER1 get secret -n kube-system cilium-ca -o yaml | \
kubectl --context $CLUSTER2 create -f -
cilium clustermesh connect --destination-context multi-cilium-cluster
cilium connectivity test --context $CLUSTER1 --multi-cluster $CLUSTER2
ここまでで、準備は整いました。この環境を使って、AKS上のPodからEKS上のPodへのService Discoveryが可能であることを確認します。
kubectl run test-nginx --image=nginx:alpine --context=$CLUSTER1
次に、
apiVersion: v1 kind: Service metadata: labels: run: test-nginx name: test-nginx annotations: service.cilium.io/global: "true" service.cilium.io/affinity: "local" # Global Service Affinity spec: ports: - port: 8080 protocol: TCP targetPort: 80 selector: run: test-nginx type: ClusterIP
を指定します。
apiVersion: v1 kind: Service metadata: labels: run: test-nginx name: test-nginx annotations: service.cilium.io/global: "true" service.cilium.io/affinity: "remote" # Global Service Affinity spec: ports: - port: 8080 protocol: TCP targetPort: 80 selector: run: test-nginx type: ClusterIP
kubectl --context=$CLUSTER1 run tmp -i --tty --rm --restart=Never --image=nginx:alpine -- ash If you don't see a command prompt, try pressing enter. / # If you don't see a command prompt, try pressing enter. / # curl test-nginx:8080 <!DOCTYPE html> <html>
kubectl --context=$CLUSTER2 run tmp -i --tty --rm --restart=Never --image=nginx:alpine -- ash If you don't see a command prompt, try pressing enter. / # curl test-nginx:8080 <!DOCTYPE html> <html>
まとめ
-
PICK UP
ピックアップ
-
ピックアップコンテンツがありません
-
RANKING
人気の記事
-
-
1
ECS on Fargateの良いところ ~性能・…
ECS on Fargateの良いところ ~性能・拡張性~
2022/03/28
-
2
EKSを理解する(第2回)IRSAを用いたPod単…
EKSを理解する(第2回)IRSAを用いたPod単位のIAMロール割り当て
2020/09/08
-
3
SageMaker Studioのライフサイクル設…
SageMaker Studioのライフサイクル設定による自動シャットダウン
2022/12/20
-
4
AWS Secrets Managerを使用したK…
AWS Secrets Managerを使用したKubernetes Secre…
2021/08/23
-
5
Amazon S3を使用したAMIの保存(エクスポ…
Amazon S3を使用したAMIの保存(エクスポート)と復元(リストア)を試し…
2022/10/31
-
-
ARCHIVE
アーカイブ
-
- July 2024 (1)
- January 2024 (1)
- December 2023 (2)
- June 2023 (2)
- May 2023 (1)
- April 2023 (1)
- March 2023 (2)
- February 2023 (2)
- January 2023 (1)
- December 2022 (2)
- October 2022 (2)
- September 2022 (2)