서비스 어피니티
서비스 어피니티 (Service Affinity)
이 튜토리얼은 크로스 클러스터 서비스에 서비스 어피니티를 활성화하는 방법을 안내해요. service.cilium.io/affinity 애노테이션으로 로컬 백엔드를 선호할지, 원격 백엔드를 선호할지, 아니면 기본값으로 둘지 정할 수 있습니다.
출처: Service Affinity
본문
이 튜토리얼은 크로스 클러스터 서비스에 서비스 어피니티를 활성화하는 방법을 안내합니다.
사전 준비
정상 작동하는 Cluster Mesh가 필요해요. 설정하려면 Cluster Mesh 설정하기와 로드 밸런싱 & 서비스 디스커버리 가이드를 따라주세요.
Global Service 어피니티 활성화
여러 클러스터에 걸친 로드 밸런싱이 어떤 경우에는 이상적이지 않을 수 있어요. service.cilium.io/affinity: "none|local|remote" 애노테이션으로 선호하는 엔드포인트 대상을 지정할 수 있습니다. MCS-API에서는 ServiceExport의 exportedAnnotations 필드를 통해 이 애노테이션을 지정하세요.
예를 들어 service.cilium.io/affinity 애노테이션의 값이 local이면, Global Service는 정상 local 백엔드에 걸쳐 로드 밸런싱하고, 모든 로컬 백엔드가 사용 불가능하거나 비정상일 때만 원격 엔드포인트를 사용해요.
apiVersion: v1
kind: Service
metadata:
name: rebel-base
annotations:
service.cilium.io/global: "true"
# Possible values:
# - none (default)
# no preference. Default behavior if this annotation does not exist
# - local
# preferred endpoints from local cluster if available
# - remote
# preferred endpoints from remote cluster if available
service.cilium.io/affinity: "local"
spec:
type: ClusterIP
ports:
- port: 80
selector:
name: rebel-base
클러스터 1에서 기존 global service에 service.cilium.io/affinity="local" 을 추가하세요
kubectl annotate service rebel-base service.cilium.io/affinity=local --overwrite
클러스터 1에서 global service에 접근합니다:
kubectl exec -ti deployment/x-wing -- curl rebel-base
cluster 1 의 Pod에서만 응답을 볼 수 있을 거예요.
클러스터 2에서 global service에 접근합니다:
kubectl exec -ti deployment/x-wing -- curl rebel-base
평소처럼 두 클러스터의 Pod에서 응답을 볼 수 있을 거예요.
클러스터 1에서 서비스 엔드포인트를 확인하면, 로컬 엔드포인트가 preferred로 표시됩니다.
kubectl exec -n kube-system -ti ds/cilium -- cilium-dbg service list --clustermesh-affinity
ID Frontend Service Type Backend
1 10.96.0.1:443 ClusterIP 1 => 172.18.0.3:6443 (active)
2 10.96.0.10:53 ClusterIP 1 => 10.244.1.171:53 (active)
2 => 10.244.2.206:53 (active)
3 10.96.0.10:9153 ClusterIP 1 => 10.244.1.171:9153 (active)
2 => 10.244.2.206:9153 (active)
4 10.96.210.49:2379 ClusterIP 1 => 10.244.2.216:2379 (active)
5 10.96.173.113:80 ClusterIP 1 => 10.244.2.136:80 (active)
2 => 10.244.1.61:80 (active) (preferred)
3 => 10.244.2.31:80 (active) (preferred)
4 => 10.244.2.200:80 (active)
클러스터 1에서 기존 global service의 service.cilium.io/affinity 값을 remote 로 변경하세요
kubectl annotate service rebel-base service.cilium.io/affinity=remote --overwrite
클러스터 1에서 global service에 접근합니다:
kubectl exec -ti deployment/x-wing -- curl rebel-base
이번에는 cluster 2 의 Pod에서만 응답이 옵니다.
클러스터 1에서 서비스 엔드포인트를 확인하면, 이제 원격 엔드포인트가 preferred로 표시됩니다.
kubectl exec -n kube-system -ti ds/cilium -- cilium-dbg service list --clustermesh-affinity
ID Frontend Service Type Backend
1 10.96.0.1:443 ClusterIP 1 => 172.18.0.3:6443 (active)
2 10.96.0.10:53 ClusterIP 1 => 10.244.1.171:53 (active)
2 => 10.244.2.206:53 (active)
3 10.96.0.10:9153 ClusterIP 1 => 10.244.1.171:9153 (active)
2 => 10.244.2.206:9153 (active)
4 10.96.210.49:2379 ClusterIP 1 => 10.244.2.216:2379 (active)
5 10.96.173.113:80 ClusterIP 1 => 10.244.2.136:80 (active) (preferred)
2 => 10.244.1.61:80 (active)
3 => 10.244.2.31:80 (active)
4 => 10.244.2.200:80 (active) (preferred)
클러스터 2에서 global service에 접근합니다:
kubectl exec -ti deployment/x-wing -- curl rebel-base
평소처럼 두 클러스터의 Pod에서 응답을 볼 수 있을 거예요.
클러스터 1에서 기존 global service의 service.cilium.io/affinity 애노테이션을 제거하세요
kubectl annotate service rebel-base service.cilium.io/affinity- --overwrite
어느 클러스터에서든 global service에 접근합니다:
kubectl exec -ti deployment/x-wing -- curl rebel-base
다시 두 클러스터의 Pod에서 응답을 볼 수 있을 거예요.