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
Infrastructure as Codeを理解…
Infrastructure as Codeを理解する(第2回)AWS Clou…
2020/11/27
-
2
クラウドセキュリティ - 汝、疑ってかかれ
クラウドセキュリティ - 汝、疑ってかかれ
2021/11/16
-
3
62人分のIAMユーザの発行と通知をLambdaと…
62人分のIAMユーザの発行と通知をLambdaとSESで自動化してみた
2023/04/05
-
4
DevOps、その遙かなる道程(第2回)
DevOps、その遙かなる道程(第2回)
2019/08/30
-
5
AWS CloudFormationでBlueGr…
AWS CloudFormationでBlueGreenデプロイを実現してみた(…
2019/10/25
-
-
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)