동적 클러스터 분배
동적 클러스터 분배 (Dynamic Cluster Distribution)
기본적으로 클러스터는 샤드(shard)에 무기한 할당돼요. 기본 해시 기반 샤딩 알고리즘을 사용하는 사용자에게는 이 정적 할당이 문제없어요. 해시 기반 알고리즘이 항상 대략적인 균형을 유지하니까요. 하지만 round-robin이나 다른 커스텀 샤드 할당 알고리즘 사용자는 레플리카가 추가/제거될 때 정적 할당으로 인해 샤드의 균형이 깨질 수 있어요.
출처: 문서
본문
[!WARNING] Alpha 기능 (v2.9.0부터)
이것은 실험적이고 alpha 품질의 기능이에요. 향후 릴리스에서 제거되거나 역호환되지 않는 방식으로 수정될 수 있어요.
현재 상태: [Alpha][1] (v2.9.0부터)
v2.9부터 Argo CD는 동적 클러스터 분배 기능을 지원해요. 레플리카가 추가/제거되면 샤딩 알고리즘을 다시 실행해 알고리즘에 따라 클러스터가 분배되도록 해요. round-robin처럼 알고리즘이 잘 균형을 이루면 샤드도 잘 균형을 이루게 돼요.
이전에는 샤드 수가 ARGOCD_CONTROLLER_REPLICAS 환경 변수로 설정되었어요. 환경 변수를 변경하면 모든 애플리케이션 컨트롤러 파드를 재시작해야 했어요. 이제 샤드 수는 deployment의 replicas 필드로 설정되며, 애플리케이션 컨트롤러 파드를 재시작할 필요가 없어요.
동적 클러스터 분배 활성화하기 (Enabling Dynamic Distribution of Clusters)
이 기능은 alpha 기간 동안 기본적으로 비활성화돼 있어요. 기능을 사용하려면 manifests/ha/base/controller-deployment/ 매니페스트를 Kustomize overlay로 적용할 수 있어요. 이 overlay는 StatefulSet replicas를 0으로 설정하고 애플리케이션 컨트롤러를 Deployment로 배포해요. 또한 Application Controller를 deployment로 실행할 때 환경 변수 ARGOCD_ENABLE_DYNAMIC_CLUSTER_DISTRIBUTION을 true로 설정해야 해요.
[!IMPORTANT] StatefulSet 대신 Deployment를 사용하는 것은 구현 세부사항으로, 이 기능의 향후 버전에서 변경될 수 있어요. 따라서 Kustomize overlay의 디렉터리 이름도 바뀔 수 있어요. 문제를 피하려면 릴리스 노트를 주의 깊게 확인하세요.
새 환경 변수 ARGOCD_CONTROLLER_HEARTBEAT_TIME의 도입을 참고하세요. 이 환경 변수는 동적 분배 하트비트 프로세스 동작에서 설명돼요.
동적 분배의 동작 방식 (Working of Dynamic Distribution)
런타임에 클러스터를 분배하기 위해 Application Controller는 ConfigMap을 사용해 컨트롤러 파드를 샤드 번호에 연결하고, 하트비트로 컨트롤러 파드가 여전히 살아있고 자신의 샤드(즉, 작업의 몫)를 처리 중인지 확인해요.
Application Controller는 컨트롤러 <-> 샤드 매핑을 저장할 새 ConfigMap argocd-app-controller-shard-cm을 생성해요. 각 샤드에 대한 매핑은 아래와 같을 거예요:
ShardNumber : 0
ControllerName : "argocd-application-controller-hydrxyt"
HeartbeatTime : "2009-11-17 20:34:58.651387237 +0000 UTC"
ControllerName: Application Controller 파드의 호스트 이름을 저장해요ShardNumber: 컨트롤러 파드가 관리하는 샤드 번호를 저장해요HeartbeatTime: 이 하트비트가 마지막으로 업데이트된 시간을 저장해요
컨트롤러 샤드 매핑은 파드의 각 readiness 프로브 검사(즉, 10초마다, 또는 구성에 따라) 동안 ConfigMap에 업데이트돼요. 컨트롤러는 readiness 프로브 검사의 매 반복마다 샤드를 획득하고 HeartbeatTime으로 ConfigMap을 업데이트하려고 시도해요. 하트비트가 업데이트되어야 하는 기본 HeartbeatDuration은 10초예요. 어떤 컨트롤러 파드에 대해 ConfigMap이 3 * HeartbeatDuration 이상 업데이트되지 않았다면 해당 애플리케이션 파드의 readiness 프로브는 Unhealthy로 표시돼요. 기본 HeartbeatDuration을 늘리려면 원하는 값으로 환경 변수 ARGOCD_CONTROLLER_HEARTBEAT_TIME을 설정하면 돼요.
새 샤딩 메커니즘은 ARGOCD_CONTROLLER_REPLICAS 환경 변수를 모니터링하지 않고, Application Controller Deployment에서 레플리카 수를 직접 읽어요. 컨트롤러는 Application Controller Deployment의 레플리카 수와 argocd-app-controller-shard-cm ConfigMap의 매핑 수를 비교해 레플리카 수의 변경을 감지해요.
Application Controller 레플리카 수가 증가하는 시나리오에서는 argocd-app-controller-shard-cm ConfigMap의 매핑 목록에 새 항목이 추가되고, 클러스터를 재분배하기 위해 클러스터 분배가 트리거돼요.
Application Controller 레플리카 수가 감소하는 시나리오에서는 argocd-app-controller-shard-cm ConfigMap의 매핑이 재설정되고 모든 컨트롤러가 샤드를 다시 획득해서 클러스터 재분배를 트리거해요.