EKS 클러스터에 VPC CIDR 추가하기
📅 March 14, 2020
•⏱️2 min read
앞서 정리했던 EKS의 VPC 네트워크 구성 이해하기 글을 먼저 보시는걸 권장드립니다.
내 요구사항보다 적은 범위의 대역으로 클러스터를 생성한다면 VPC CNI로 인한 IP 제한에 마주할 수 있습니다. 처음부터 넓은 범위의 대역으로 생성하면 좋겠지만 이미 클러스터를 생성한 이후에는 어떻게 하면 좋을까요? 이러한 경우에는 VPC에 새로운 CIDR을 할당하고 이를 클러스터에 추가할 수 있습니다.
VPC CIDR
먼저 확장하고자 하는 VPC를 선택한 후 새로운 CIDR 범위를 추가해주어야 합니다. 저는 위의 그림과 같이 10.X.X.X와 100.X.X.X 범위를 추가해주었습니다. 이후 새로운 CIDR 범위를 사용하여 서브넷을 생성한 다음 라우팅 테이블을 연결해줍니다. EKS에서 서브넷을 검색 가능하도록 하기 위해 아래와 같은 태그를 추가해줍니다.
Key=kubernetes.io/cluster/yourClusterName,Value=shared
Custom ENI Config
이제 새로운 CIDR 범위를 사용하도록 CNI 플러그인 설정을 변경해주어야 합니다. 먼저 클러스터에서 사용 중인 CNI 플러그인 버전을 확인하고 만일 1.5.3 미만인 경우 최신 버전으로 업데이트 합니다. (2020년 3월 기준, 최신 버전은 1.6 입니다)
$ kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
$ kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/v1.6/aws-k8s-cni.yaml
설치한 이후에 kubectl get crd
를 통해 ENIConfig CRD가 제대로 설치되었는지 확인해줍니다. 만약 설치가 안되었다면 아래의 파일을 통해 CRD를 정의해주시면 됩니다.
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: eniconfigs.crd.k8s.amazonaws.com
spec:
scope: Cluster
group: crd.k8s.amazonaws.com
version: v1alpha1
names:
plural: eniconfigs
singular: eniconfig
kind: ENIConfig
이후에 aws-node daemonset에서 커스텀 네트워크 설정을 활성화하는 환경변수를 업데이트 해줍니다.
$ kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
이제 앞서 생성한 서브넷에 대해 ENIConfig CRD를 생성해줍니다. 아래는 ap-northeast-2a, 2c에 대한 2개의 서브넷에 대한 파일입니다. 보안 그룹도 클러스터 설정에 맞게 정의해주시면 됩니다.
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
name: private-user-2a
spec:
subnet: subnet-0ddddaaaaddddccdd
securityGroups:
- sg-05555598cc88ffd00
---
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
name: private-user-2c
spec:
subnet: subnet-0ccccaaaaddddccee
securityGroups:
- sg-05555598cc88ffd00
마지막으로 클러스터에 해당하는 노드 그룹의 어노테이션을 수정해주어야 합니다. terraform-aws-eks 모듈을 통해 클러스터를 생성하셨다면 worker_groups
하위에 kubelet_extra_args
변수 설정을 통해 오토스케일링 그룹 설정을 수정할 수 있습니다.
추가되어야할 어노테이션 값은 아래와 같습니다. Value 값의 경우, 위에서 추가한 ENIConfig CRD의 name metadata를 넣어주시면 됩니다. 업데이트 이후에는 노드를 재시작해주어야 정상적으로 적용됩니다.
k8s.amazonaws.com/eniConfig=private-user-2c
Reference
- https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/cni-custom-network.html
- https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-multiple-cidr-ranges/