본문 바로가기
Cloud/Kubernetes

EKS multiple CIDR사용 방법

by _Nate 2023. 4. 1.
반응형

subnet의 가용IP부족 문제 또는 보안상의 이유로 CIDR을 분리하여 사용하는 경우가 많다.
이번 포스팅에선 EKS에 여러 CIDR을 사용하는 방법을 설명한다.


1. CIDR 추가

  • 기존 VPC에 신규 CIDR을 추가한다.
aws ec2 associate-vpc-cidr-block --vpc-id $VPC_ID --cidr-block 10.10.0.0/16
{
    "CidrBlockAssociation": {
        "AssociationId": "vpc-cidr-assoc-0fb0be0a9b2d92aa",
        "CidrBlock": "10.10.0.0/16",
        "CidrBlockState": {
            "State": "associating"
        }
    },
    "VpcId": "vpc-0283181a244432116"
}

 
2. subnet 생성

  • 추가한 CIDR대역에 subnet을 생성한다. 기존 사용중이던 subnet의 AvailabilityZone과 같은 Zone에 생성한다. 
test@DESKTOP-F55SF6V:~ (⎈|test-cluster:default)# new_subnet1=$(aws ec2 create-subnet --cidr-block 10.10.0.0/19 --vpc-id $VPC_ID --availability-zone ap-northeast-2a | jq -r .Subnet.SubnetId)
test@DESKTOP-F55SF6V:~ (⎈|test-cluster:default)# new_subnet2=$(aws ec2 create-subnet --cidr-block 10.10.32.0/19 --vpc-id $VPC_ID --availability-zone ap-northeast-2b | jq -r .Subnet.SubnetId)

 

  • 기존 subnet과 동일한 Zone에 생성되었는지 확인한다.
test@DESKTOP-F55SF6V:~ (⎈|test-cluster:default)# aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=$VPC_ID" \
--query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \
--output table
--------------------------------------------------------------------
|                          DescribeSubnets                         |
+------------------+------------------+----------------------------+
| AvailabilityZone |     CidrBlock    |         SubnetId           |
+------------------+------------------+----------------------------+
|  ap-northeast-2b |  10.16.16.0/20   |  subnet-0826651509f0e9046  |
|  ap-northeast-2b |  10.10.32.0/19   |  subnet-0af3c31d01gg9ac5d  |
|  ap-northeast-2a |  10.16.0.0/20    |  subnet-0a332fd54098384fa  |
|  ap-northeast-2a |  10.10.0.0/19    |  subnet-01asdc18e0af3363e  |
+------------------+------------------+----------------------------+

 

반응형

 


3. Kubernetes Resource 구성

  • Daemonset aws-node의 AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG변수 값을 true로 설정한다.
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true

 

  • SecurityGroup의 ID를 조회한다.
cluster_security_group_id=$(aws eks describe-cluster --name $cluster_name \
--query cluster.resourcesVpcConfig.clusterSecurityGroupId --output text)

 

  • 노드 식별을 위해 ENIConfig label을 추가한다.
kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone

 

  • pod를 배포할 subnet에 대한 ENIConfig CRD의 yaml파일을 생성한다.
cat >ap-northeast-2a.yaml <<EOF
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata: 
  name: ap-northeast-2a
spec: 
  securityGroups: 
    - $cluster_security_group_id
  subnet: $new_subnet1
EOF

cat >ap-northeast-2b.yaml <<EOF
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata: 
  name: ap-northeast-2b
spec: 
  securityGroups: 
    - $cluster_security_group_id
  subnet: $new_subnet2
EOF

 

  • yaml파일을 통해 ENIConfig를 배포한다.
test@DESKTOP-F55SF6V:~ (⎈|test-cluster:default)# k get eniconfig
NAME              AGE
ap-northeast-2a   5h
ap-northeast-2b   5h

 

  • node를 재배포하여 pod들의 CIDR이 분리된 상태로 시작되는지 확인한다.
  • node와 같은 CIDR 대역을 사용하기 위해선 spec.hostNetwork: true설정이 있어야 한다

vpc-cni 업데이트시 daemonset aws-node의 config값을 보존해 주지 않으면 모두 초기화 되며 이슈가 발생할 수 있다.
작업 전 설정을 확인 후 진행하자.

반응형