하이브리드 노드용 웹훅 구성
하이브리드 노드용 웹훅 구성
하이브리드 노드와 함께 웹훅을 실행할 때의 고려 사항과 혼합 모드 클러스터 구성 방법을 설명합니다.
출처: 문서
본문
이 페이지는 하이브리드 노드와 함께 웹훅을 실행할 때의 고려 사항을 자세히 설명합니다. 웹훅은 AWS Load Balancer Controller와 CloudWatch Observability Agent 같은 Kubernetes 애플리케이션과 오픈 소스 프로젝트에서 런타임에 변경(mutating) 및 검증(validating) 기능을 수행하는 데 사용됩니다.
라우팅 가능한 Pod 네트워크
온프레미스 네트워크에서 온프레미스 Pod CIDR을 라우팅 가능하게 만들 수 있다면 하이브리드 노드에서 웹훅을 실행할 수 있습니다. 온프레미스 네트워크에서 온프레미스 Pod CIDR을 라우팅 가능하게 만드는 데는 BGP(Border Gateway Protocol), 정적 경로, 기타 사용자 지정 라우팅 솔루션 등 여러 기술이 있습니다. BGP는 사용자 지정 또는 수동 경로 구성이 필요한 대안보다 확장성이 높고 관리하기 쉬우므로 권장 솔루션입니다. AWS는 Pod CIDR 광고를 위해 Cilium과 Calico의 BGP 기능을 지원합니다. 자세한 내용은 하이브리드 노드용 CNI 구성 및 라우팅 가능한 원격 Pod CIDR을 참조하세요.
라우팅 불가능한 Pod 네트워크
온프레미스 네트워크에서 온프레미스 Pod CIDR을 라우팅 가능하게 만들 수 없고 웹훅을 실행해야 한다면 하이브리드 노드와 같은 EKS 클러스터의 클라우드 노드에서 모든 웹훅을 실행할 것을 권장합니다.
혼합 모드 클러스터 고려 사항
혼합 모드 클러스터는 하이브리드 노드와 AWS 클라우드에서 실행되는 노드가 모두 있는 EKS 클러스터로 정의됩니다. 혼합 모드 클러스터를 실행할 때 다음 권장 사항을 고려하세요.
- AWS 클라우드의 노드에는 VPC CNI를, 하이브리드 노드에는 Cilium 또는 Calico를 실행합니다. Cilium과 Calico는 AWS 클라우드의 노드에서 실행될 때 AWS에서 지원되지 않습니다.
- AWS 클라우드의 노드에서 실행되도록 웹훅을 구성합니다. AWS 및 커뮤니티 애드온의 웹훅 구성 방법은 애드온용 웹훅 구성을 참조하세요.
- 애플리케이션에 AWS 클라우드의 노드에서 실행되는 Pod가 하이브리드 노드에서 실행되는 Pod와 직접 통신("동서(east-west) 통신")해야 하는 경우가 있고, AWS 클라우드의 노드에 VPC CNI를, 하이브리드 노드에 Cilium 또는 Calico를 사용한다면 온프레미스 Pod CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다.
- AWS 클라우드의 노드에 CoreDNS 복제본을 최소 1개, 하이브리드 노드에 CoreDNS 복제본을 최소 1개 실행합니다.
- Service Traffic Distribution을 구성하여 Service 트래픽이 발생한 존(zone)에 로컬로 유지되게 합니다. Service Traffic Distribution에 대한 자세한 내용은 Service Traffic Distribution 구성을 참조하세요.
- 하이브리드 노드에서 실행되는 워크로드 트래픽에 AWS Application Load Balancers(ALB) 또는 Network Load Balancers(NLB)를 사용한다면 ALB 또는 NLB와 함께 사용하는 IP 대상이 AWS에서 라우팅 가능해야 합니다.
- Metrics Server 애드온은 EKS 컨트롤 플레인에서 Metrics Server Pod IP 주소로의 연결이 필요합니다. 하이브리드 노드에서 Metrics Server 애드온을 실행한다면 온프레미스 Pod CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다.
- Amazon Managed Service for Prometheus(AMP) 관리형 수집기로 하이브리드 노드의 메트릭을 수집하려면 온프레미스 Pod CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다. 또는 AWS 클라우드에서 실행되는 EKS 컨트롤 플레인 메트릭과 자원에 AMP 관리형 수집기를 사용하고, AWS Distro for OpenTelemetry(ADOT) 애드온으로 하이브리드 노드의 메트릭을 수집할 수 있습니다.
혼합 모드 클러스터 구성
클러스터에서 실행되는 변경 및 검증 웹훅을 보려면 EKS 콘솔의 Resources 패널에서 Extensions 리소스 유형을 보거나 다음 명령을 사용할 수 있습니다. EKS는 클러스터 관측 가능성 대시보드에서 웹훅 메트릭도 보고합니다. 자세한 내용은 관측 가능성 대시보드로 클러스터 모니터링을 참조하세요.
kubectl get mutatingwebhookconfigurations
kubectl get validatingwebhookconfigurations
Service Traffic Distribution 구성
혼합 모드 클러스터를 실행할 때 Service Traffic Distribution을 사용하여 Service 트래픽이 발생한 존에 로컬로 유지되게 할 것을 권장합니다. Service Traffic Distribution(EKS에서 Kubernetes 버전 1.31 이상에서 사용 가능)은 Topology Aware Routing보다 더 예측 가능하므로 권장 솔루션입니다. Service Traffic Distribution을 사용하면 존의 정상 엔드포인트가 해당 존의 모든 트래픽을 받습니다. Topology Aware Routing을 사용하면 각 서비스가 해당 존에서 사용자 지정 라우팅을 적용하기 위해 몇 가지 조건을 충족해야 하며, 그렇지 않으면 모든 엔드포인트에 균등하게 트래픽을 라우팅합니다.
CNI로 Cilium을 사용한다면 Service Traffic Distribution을 활성화하려면 enable-service-topology가 true로 설정된 상태로 CNI를 실행해야 합니다. 이 구성은 Helm 설치 플래그 --set loadBalancer.serviceTopology=true로 전달하거나 기존 설치를 Cilium CLI 명령 cilium config set enable-service-topology true로 업데이트할 수 있습니다. 기존 설치의 구성을 업데이트한 후 각 노드에서 실행되는 Cilium 에이전트를 다시 시작해야 합니다.
CoreDNS 서비스에 Service Traffic Distribution을 구성하는 예시는 다음 섹션에 나와 있으며, 의도하지 않은 교차 환경 트래픽을 피하기 위해 클러스터의 모든 서비스에 대해 동일하게 활성화할 것을 권장합니다.
CoreDNS 복제본 구성
하이브리드 노드와 AWS 클라우드의 노드가 모두 있는 혼합 모드 클러스터를 실행한다면 하이브리드 노드에 CoreDNS 복제본을 최소 1개, AWS 클라우드의 노드에 CoreDNS 복제본을 최소 1개 가질 것을 권장합니다. 혼합 모드 클러스터 설정에서 지연 시간과 네트워크 문제를 방지하려면 Service Traffic Distribution으로 CoreDNS 서비스가 가장 가까운 CoreDNS 복제본을 선호하도록 구성할 수 있습니다.
Service Traffic Distribution(EKS에서 Kubernetes 버전 1.31 이상에서 사용 가능)은 Topology Aware Routing보다 더 예측 가능하므로 권장 솔루션입니다. Service Traffic Distribution에서는 존의 정상 엔드포인트가 해당 존의 모든 트래픽을 받습니다. Topology Aware Routing에서는 각 서비스가 해당 존에서 사용자 지정 라우팅을 적용하기 위해 몇 가지 조건을 충족해야 하며, 그렇지 않으면 모든 엔드포인트에 균등하게 트래픽을 라우팅합니다. 다음 단계는 Service Traffic Distribution을 구성합니다.
-
CNI로 Cilium을 사용한다면 Service Traffic Distribution을 활성화하려면
enable-service-topology가true로 설정된 상태로 CNI를 실행해야 합니다. 이 구성은 Helm 설치 플래그--set loadBalancer.serviceTopology=true로 전달하거나 기존 설치를 Cilium CLI 명령cilium config set enable-service-topology true로 업데이트할 수 있습니다. 기존 설치의 구성을 업데이트한 후 각 노드에서 실행되는 Cilium 에이전트를 다시 시작해야 합니다. -
각 하이브리드 노드에 토폴로지 존 라벨을 추가합니다(예:
topology.kubernetes.io/zone: onprem). 또는nodeadm구성에서 라벨을 지정하여nodeadm init단계에서 라벨을 설정할 수 있습니다(kubelet 사용자 지정용 Node Config(선택 사항) 참조). 참고: AWS 클라우드에서 실행되는 노드는 노드의 가용 영역(AZ)에 해당하는 토폴로지 존 라벨이 자동으로 적용됩니다.
kubectl label node hybrid-node-name topology.kubernetes.io/zone=zone
- 토폴로지 존 키로 CoreDNS 배포에
podAntiAffinity를 추가합니다. 또는 EKS 애드온으로 설치 중 CoreDNS 배포를 구성할 수 있습니다.
kubectl edit deployment coredns -n kube-system
spec:
template:
spec:
affinity:
...
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values:
- kube-dns
topologyKey: kubernetes.io/hostname
weight: 100
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values:
- kube-dns
topologyKey: topology.kubernetes.io/zone
weight: 50
...
kube-dns서비스 구성에trafficDistribution: PreferClose설정을 추가하여 Service Traffic Distribution을 활성화합니다.
kubectl patch svc kube-dns -n kube-system --type=merge -p '{
"spec": {
"trafficDistribution": "PreferClose"
}
}'
kube-dns서비스의 엔드포인트 슬라이스를 보면 Service Traffic Distribution이 활성화되었는지 확인할 수 있습니다. 엔드포인트 슬라이스에 토폴로지 존 라벨에 대한hints가 표시되어야 하며, 이는 Service Traffic Distribution이 활성화되었음을 확인합니다. 각 엔드포인트 주소에hints가 보이지 않으면 Service Traffic Distribution이 활성화되지 않은 것입니다.
kubectl get endpointslice -A | grep "kube-dns"
kubectl get endpointslice kube-dns-<hash> -n kube-system -o yaml
addressType: IPv4
apiVersion: discovery.k8s.io/v1
endpoints:
- addresses:
- <pod-ip>
hints:
forZones:
- name: onprem
nodeName: <node>
zone: onprem
- addresses:
- <pod-ip>
hints:
forZones:
- name: us-west-2a
nodeName: <node>
zone: us-west-2a
애드온용 웹훅 구성
다음 애드온은 웹훅을 사용하며 하이브리드 노드와 함께 사용할 수 있습니다.
- AWS Load Balancer Controller
- CloudWatch Observability Agent
- AWS Distro for OpenTelemetry(ADOT)
cert-manager
이러한 애드온이 사용하는 웹훅을 AWS 클라우드의 노드에서 실행하도록 구성하려면 다음 섹션을 참조하세요.
AWS Load Balancer Controller
혼합 모드 클러스터 설정에서 AWS Load Balancer Controller를 사용하려면 컨트롤러를 AWS 클라우드의 노드에서 실행해야 합니다. 이를 위해 Helm 값 구성에 다음을 추가하거나 EKS 애드온 구성으로 값을 지정하세요.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
CloudWatch Observability Agent
CloudWatch Observability Agent 애드온에는 웹훅을 사용하는 Kubernetes Operator가 있습니다. 혼합 모드 클러스터 설정에서 AWS 클라우드의 노드에서 운영자를 실행하려면 CloudWatch Observability Agent 운영자 구성을 편집하세요. Helm 및 EKS 애드온으로 설치 중에는 운영자 친화성을 구성할 수 없습니다(containers-roadmap issue #2431 참조).
kubectl edit -n amazon-cloudwatch deployment amazon-cloudwatch-observability-controller-manager
spec:
...
template:
...
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
AWS Distro for OpenTelemetry(ADOT)
AWS Distro for OpenTelemetry(ADOT) 애드온에는 웹훅을 사용하는 Kubernetes Operator가 있습니다. 혼합 모드 클러스터 설정에서 AWS 클라우드의 노드에서 운영자를 실행하려면 Helm 값 구성에 다음을 추가하거나 EKS 애드온 구성으로 값을 지정하세요.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
Pod CIDR이 온프레미스 네트워크에서 라우팅 가능하지 않다면 ADOT 수집기가 하이브리드 노드와 그 위에서 실행되는 워크로드에서 메트릭을 스크레이프하려면 하이브리드 노드에서 실행되어야 합니다. 이를 위해 CRD(Custom Resource Definition)를 편집하세요.
kubectl -n opentelemetry-operator-system edit opentelemetrycollectors.opentelemetry.io adot-col-prom-metrics
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: In
values:
- hybrid
ADOT 수집기가 하이브리드 노드와 하이브리드 노드에서 실행되는 자원의 메트릭만 스크레이프하도록 구성하려면 ADOT 수집기 CRD 구성의 각 scrape_configs에 다음 relabel_configs를 추가하세요.
relabel_configs:
- action: keep
regex: hybrid
source_labels:
- __meta_kubernetes_node_label_eks_amazonaws_com_compute_type
ADOT 애드온에는 ADOT 운영자 웹훅이 사용하는 TLS 인증서용 cert-manager를 설치해야 하는 사전 요구 사항이 있습니다. cert-manager도 웹훅을 실행하며 다음 Helm 값 구성으로 AWS 클라우드의 노드에서 실행하도록 구성할 수 있습니다.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
webhook:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
cainjector:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
startupapicheck:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
cert-manager
cert-manager 애드온은 웹훅을 실행하며 다음 Helm 값 구성으로 AWS 클라우드의 노드에서 실행하도록 구성할 수 있습니다.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
webhook:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
cainjector:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid
startupapicheck:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: eks.amazonaws.com/compute-type
operator: NotIn
values:
- hybrid