Amazon EKS에서 토폴로지 인식 힌트를 사용하려면 어떻게 해야 합니까?
Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에서 TAH(Topology Aware Hints, 토폴로지 인식 힌트)를 사용하고 싶습니다.
해결 방법
참고: TAH는 Amazon Elastic Compute Cloud(Amazon EC2) 스팟 인스턴스, 수평적 포드 오토 스케일링 또는 오토 스케일링이 활성화된 클러스터에 적합하지 않을 수 있습니다. 이러한 클러스터 구성을 사용하는 경우 노드에 할당된 CPU 코어에 비례하는 할당을 달성할 수 없습니다. 허용된 오버헤드 임계값을 초과했습니다. 또한 엔드포인트 재분배를 금지하는 포드 할당 제약 조건이 있는 경우 kube-proxy는 TAH를 사용하지 않습니다.
사전 요구 사항
- Amazon EKS 클러스터 버전이 1.24 이상인지 확인합니다.
- Amazon EKS 클러스터 및 노드 3개가 있는 관리형 노드 그룹을 설정합니다. 각 노드의 CPU 용량은 동일해야 하며 세 개의 가용 영역에 분산되어야 합니다.
Amazon EKS에서 TAH를 사용하려면 다음 단계를 완료하십시오.
-
새 네임스페이스 생성:
참고: example-namespace를 해당 네임스페이스 이름으로 바꾸십시오.
apiVersion: v1 kind: Namespace metadata: name: "example-namespace" labels: pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/warn: restricted -
BusyBox 이미지를 사용하여 샘플 배포를 만듭니다.
참고: example-deployment-name을 사용자의 배포 이름으로 바꾸고 example-namespace를 사용자의 네임스페이스 이름으로 바꿉니다.
apiVersion: apps/v1 kind: Deployment metadata: name: example-deployment-name namespace: example-namespace spec: replicas: 3 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: dnsPolicy: Default enableServiceLinks: false automountServiceAccountToken: false securityContext: seccompProfile: type: RuntimeDefault runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 containers: - name: busybox image: public.ecr.aws/docker/library/busybox:latest command: ["/bin/sh"] args: - "-c" - | echo "<html><body><h1>PodName: $MY_POD_NAME NodeName: $MY_NODE_NAME podIP:$MY_POD_IP</h1></body></html>" > /tmp/index.html; while true; do printf 'HTTP/1.1 200 OK\n\n%s\n' $(cat /tmp/index.html) | nc -l -p 8080 done ports: - containerPort: 8080 env: - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY_POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name resources: limits: memory: "128Mi" cpu: "500m" requests: memory: "64Mi" cpu: "250m" securityContext: readOnlyRootFilesystem: true allowPrivilegeEscalation: false capabilities: drop: - ALL volumeMounts: - name: tmp mountPath: /tmp volumes: - name: tmp emptyDir: {} -
배포를 ClusterIP 서비스 유형으로 노출한 다음 service.kubernetes.io/topology-mode: auto를 주석으로 추가합니다.
참고: example-service-name을 사용자의 서비스 이름으로 바꾸고 example-namespace를 사용자의 네임스페이스 이름으로 바꿉니다. 버전 1.27 이상에서는 service.kubernetes.io/topology-aware-hints: auto 주석이 service.kubernetes.io/topology-mode: auto로 변경되었습니다.
apiVersion: v1 kind: Service metadata: name: example-service-name namespace: example-namespace annotations: service.kubernetes.io/topology-mode: auto spec: selector: app: demo ports: - protocol: TCP port: 80 targetPort: 8080 -
엔드포인트에 TAH가 채워져 있는지 확인합니다.
참고: example-namespace을 사용자의 네임스페이스 이름으로 바꾸고 example-service-name을 사용자의 서비스 이름으로 바꿉니다.
kubectl get 'endpointslices.discovery.k8s.io' -l kubernetes.io/service-name=example-service-name -n example-namespace -o yaml출력 예시:
endpoints: - addresses: - 10.0.21.125 conditions: ready: true serving: true terminating: false hints: forZones: - name: eu-west-1b nodeName: ip-10-0-17-215.eu-west-1.compute.internal targetRef: kind: Pod name: example-deployment-name-5875bbbb7c-m2j8t namespace: example-namespace uid: 4e789648-965e-4caa-91db-bd27d240ea59 zone: eu-west-1b -
테스트 포드를 배포하여 트래픽이 동일한 가용 영역의 포드로 라우팅되는지 확인합니다.
참고: example-node-name을 사용자의 노드 이름으로 바꿉니다.
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot --overrides='{"spec": { "nodeSelector": {"kubernetes.io/hostname":"example-node-name"}}}' -
테스트 포드가 연결되는 포드와 노드를 찾습니다.
curl example-service-name.example-namespace:80출력 예시:
PodName: 7b7b9bf455-c27z9 HTTP/1.1 200 OK NodeName: ip-10-0-9-45.eu-west-1.compute.internal HTTP/1.1 200 OK podIP: example-10.0.11.140 -
위 출력의 PodName 및 NodeName을 사용하여 트래픽이 테스트 포드가 배포된 동일한 가용 영역과 일치하는지 확인합니다.
-
배포를 네 개의 복제본으로 확장한 다음 EndpointSlices를 검사합니다.
참고: example-namespace를 사용자의 네임스페이스 이름으로 바꾸고 example-deployment-name을 사용자의 배포 이름으로 바꿉니다.
kubectl -n example-namespace scale deployments example-deployment-name --replicas=4참고: 4개의 복제본으로 확장된 배포에서는 엔드포인트 비율이 50%인 가용 영역이 하나 이상 생성됩니다. 또한 오버헤드 임계값인 20%가 초과되었으며 kube-proxy에 TAH가 사용되지 않습니다.
관련 정보
Kubernetes 웹사이트의 토폴로지 인식 라우팅
토폴로지 인식 힌트가 Amazon Elastic Kubernetes Service의 네트워크 트래픽에 미치는 영향 살펴보기
- 언어
- 한국어
