처음부터 차근차근 공부하는 목적으로 작성한 글입니다.
일부 잘못된 내용이 있을 수도 있습니다. 잘못된 내용은 피드백 해주시면 적극 반영하도록 하겠습니다.
감사합니다 :)
EKS를 운영하다 보면 많은 Worker node가 있고, 수많은 Pod가 생겨난다.
그리고 이때 운영자는 별도 작업이 없지만 EKS가 자동적으로 pod에 private ip를 할당해준다. 어떻게 되는걸까?
EKS 네트워킹에 대한 기본 개념과 방법에 대해서 알아보자.
EKS 네트워킹 기본 구조
가장 기본적인 EKS 네트워킹의 기본 구조이다. EKS node는 다수의 Pod을 생성해야 하고, 이때 많은 Private ip가 필요로 한다.
이때 AWS에서는 AWS VPC CNI 플러그인을 제공해주고 이것은 K8s과 AWS VPC간의 브릿지 역할을 한다.
그래서 실제로 운영중인 Node의 private ip 주소를 보면 아래와 같이 1개가 아니라 복수개가 연결되어 있다.
그렇다면 실제 Node에 속해있는 Pod은 어떤 Private Ip를 할당받을까? 여기에는 VPC CNI의 모드에 따라 달라진다.
VPC CNI Pod ip 할당 방법
AWS VPC CNI를 보면 다양한 변수가 있고, 해당 변수를 통해 Pod IP 할당 방법이 정해진다.
Prefix, Custom 방법이 있고 이외 기타 많은 변수로 인해 최적화 하는것이 Devops팀의 중요한 역할이고 개인 역량의 차이일것 같다.
VPC CNI Prefix 모드
먼저 Prefix 모드이다. Prefix 모드는 Node ip의 /28로 Pod한테 할당해주는 방법이다.
AWS Docs 또는 기타 해외 블로그를 보면 Pod ip를 효과적으로 사용하는 방법으로 권고하는 방법이기도 한다.
설정방법은 aws-node의 설정을 변경하면 된다. ENABLE_PREFIX_DELEGATION의 기본값은 false이다.
- 운영하고 있는 EKS에서는 사용하지 않는 모드라서 실제로 어떤 이점이 있는지 와닿지는 않는다.
그리고 2021년 8월에 새롭게 출시된 기능이라서 아직 많은 사람들이 사용하지는 않는것 같다.
kubectl set env daemonset -n kube-system aws-node ENABLE_PREFIX_DELEGATION=true
AWS Docs에 따르면 Prefix 모드로 운영하는 경우 아래의 장점이 있다고 한다.
이 기능을 활성화하지 않으면 추가 기능은 pod 연결에 필요한 네트워크 인터페이스 및 IP 주소를 구성하기 위해 Amazon EC2 애플리케이션 프로그래밍 인터페이스(API) 호출을 더 많이 수행해야 합니다. 이러한 API 호출의 빈도와 각 VPC 많은 네트워크 인터페이스가 결합되어 클러스터가 더 커짐에 따라 pod 및 인스턴스 시작 시간이 길어질 수 있습니다. 이로 인해 규모가 크고 까다로운 워크로드의 수요를 충족하기 위해 확장이 지연되고 확장 요구 사항을 충족하기 위해 추가 클러스터와 VPC를 프로비저닝해야 하므로 비용 및 관리 오버헤드가 추가됩니다.
VPC CNI Custom 모드
아마 대다수의 운영자들이 사용하는 방법이지 않을까한다. Prefix모드와 다르게 별도로 설정해줘야하는것은 없다.
Custom 모드에서 중요한것은 Worker node가 어떤 Instance type으로 실행되어 있는지가 중요하다.
왜냐하면 각 Type마다 연결 할 수 있는 인터페이스 개수가 다르고, 이때 각 IP별로 할당 가능한 Privete Ip도 다르다.
예를들어 t3.2xlarge의 Worker node가 있다고 가정하자. 그러면 해당 node는 4개의 인터페이스를 가질 수 있다.
그리고 각 인터페이스는 최대 15개의 Private ip를 할당할 수 있다. 그렇다면 4 * 15 = 60개의 Pod을 생성할 수 있다.
하지만, 실제로는 kube-proxy, coredns, aws-node 등이 기본적으로 배포될 수 있으므로 실제 사용 가능한 ip는 더 적다.
- 실제로 현재 재직중인 회사에서 이전에 EKS에서 Private ip 할당이 불가하여 일시적으로 scaleout이 불가한 이슈가 있다고 한다.
그리고 공통적으로 중요한 부분은 aws-node의 env에서 ENABLE_IPv4/ ENABLE_IPv6를 동시에 true로 설정하면 안된다.
Github에도 나와있지만 동시에 설정하면 잘못된 구성으로 취급하여 Private ip 할당이 불가하다.
만약 Private ip 할당이 불가하다면, ip가 부족하지는 않는지 또는 aws-node에서 enable_ipv4=true인지 확인하면 된다.
k8s는 예전부터 직접 운영하고 관리학도 싶었는데 최근 회사에서 운영할 기회가 생겨서 좋은것 같다.
아직은 부족하지만 타사 사례를 확인하고 Docs에서 best preace를 확인하면서 하나씩 알아가보자!!!
참고 자료
https://trans.yonghochoi.com/translations/aws_vpc_cni_increase_pods_per_node_limits.ko
'기술 이모저모 > [K8s] Kubernetes' 카테고리의 다른 글
[k8s] helm upgrade fail, remove api 조치 방안 (2) | 2023.02.05 |
---|---|
[k8s] kubenetes coreDNS 개념정리 (0) | 2023.01.29 |
[k8s] Devops kubenetes command tip (0) | 2023.01.18 |
[k8s] Helm이란? Helm 구성과 필수개념 (0) | 2023.01.01 |
[k8s] Kubernetes Init Containers 개념 (0) | 2022.10.25 |