EKS 클러스터에 VPC CIDR 추가하기


앞서 정리했던 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