본문으로 바로가기

[AWS] EKS 클러스터에 서브넷 IP 추가 하기

category IT/AWS 2021. 10. 12. 12:52
반응형

Intro

EKS를 생성할때 VPC와 subnet을 선택하여 생성하게 되는데, 나중에 IP가 부족하여 서브넷을 추가할때 AWS콘솔이나 AWS CLI에서는 서브넷을 추가 할 수 없습니다.

IP를 추가하려면 AWS 콘솔이나 CLI가 아닌 AWS에서 지원하는 VPC CNI 플러그인 설정을 통해 서브넷을 추가해야 합니다.

오늘은 그 방법을 알려 드리도록 하겠습니다. AWS 공식문서를 참고하였습니다. https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-multiple-cidr-ranges/

작업 리스트

  1. VPC에 추가할 CIDR대역 추가
  2. 추가한 CIDR에 서브넷 추가
  3. 추가한 서브넷에 라우팅 테이블 설정
  4. AWS VPC CNI플러그인 확인 및 설정
  5. ENIConfig 사용자 지정 리소스 정의(CRD, CustomResourceDefinition)를 설치
  6. 모든 서브넷 및 가용 영역에 대해 ENIConfig 사용자 지정 리소스를 생성
  7. 새로운 노드그룹 생성
  8. pod생성 테스트

기존 VPC에 새로운 CIDR 추가

<VPC_ID> 추가할 VPC ID를 입력

export VPC_ID=<VPC_ID>
aws ec2 associate-vpc-cidr-block --vpc-id $VPC_ID --cidr-block 100.64.0.0/16

추가한 CIDR 대역에서 Subnet 생성

현재 리전에서 사용가능한 AZ 조회

aws ec2 describe-availability-zones --region ap-northeast-2 --query 'AvailabilityZones[*].ZoneName'

사용할 AZ에 대한 변수 생성

export AZ1=ap-northeast-2a
export AZ2=ap-northeast-2b
export AZ3=ap-northeast-2c

각 AZ에 원하는 subnet생성

CUST_SNET1=$(aws ec2 create-subnet --cidr-block 100.64.0.0/19 --vpc-id $VPC_ID --availability-zone $AZ1 | jq -r .Subnet.SubnetId)
CUST_SNET2=$(aws ec2 create-subnet --cidr-block 100.64.32.0/19 --vpc-id $VPC_ID --availability-zone $AZ2 | jq -r .Subnet.SubnetId)
CUST_SNET3=$(aws ec2 create-subnet --cidr-block 100.64.64.0/19 --vpc-id $VPC_ID --availability-zone $AZ3 | jq -r .Subnet.SubnetId)

서브넷에 태그 설정 (Amazon EKS는 Kubernetes 버전 1.19부터는 kubernetes.io 태그 없이도 서브넷 자동 검색을 지원함

aws ec2 create-tags --resources $CUST_SNET1 --tags Key=kubernetes.io/cluster/yourClusterName,Value=shared
aws ec2 create-tags --resources $CUST_SNET2 --tags Key=kubernetes.io/cluster/yourClusterName,Value=shared
aws ec2 create-tags --resources $CUST_SNET3 --tags Key=kubernetes.io/cluster/yourClusterName,Value=shared

Routing Table 연결

<RTASSOC_ID>연결할 Route Table ID를 입력

export RTASSOC_ID=<RTASSOC_ID>
aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET1
aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET2
aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET3

새 CIDR 를 사용하도록 EKS내부의 VPC CNI 플러그인 구성

CNI플러그인 확인

kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

CNI 플러그인이 1.5.3 버전 이하인 경우 업데이트

kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/v1.5/aws-k8s-cni.yaml

CNI 플러그인에 대한 사용자 지정 네트워크 구성을 활성화

kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true

작업자 노드를 식별하기 위한 ENIConfig 레이블을 추가

kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=failure-domain.beta.kubernetes.io/zone

ENIConfig 사용자 지정 리소스 정의(CRD, CustomResourceDefinition)를 설치

cat << EOF | kubectl apply -f -
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
EOF

모든 서브넷 및 가용 영역에 대해 ENIConfig 사용자 지정 리소스를 생성

cat <<EOF  | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: $AZ1
spec:
  subnet: $CUST_SNET1
EOF

cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: $AZ2
spec:
  subnet: $CUST_SNET2
EOF

cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: $AZ3
spec:
  subnet: $CUST_SNET3
EOF

새로운 노드 그룹 생성

새로 할당 받은 subnet대역을 포함하는 노드그룹을 생성합니다.

테스트를 위해 kubernetes lable을 줍니다. (nodegroup-type=NEW)

자체 관리형 노드 그룹을 생성했을 경우(managed nodegroup) 아래와 같이 sg-xxxxx를 EKS의 security group으로 수정하여 적용합니다.

Managed nodegroup이란 ? https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html

cat <<EOF  | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: $AZ1
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: $CUST_SNET1
EOF

cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: $AZ2
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: $CUST_SNET2
EOF

cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: $AZ3
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: $CUST_SNET3
EOF

새로운 노드그룹에 pod할당 확인

kubectl run nginx --image nginx --labels=nodegroup-type=NEW

활용 참고 포스팅

EKS 클러스터에 서브넷 IP 추가 하기-2(VPC CNI custom networking 활용 실패 편)
EKS 클러스터에 서브넷 IP 추가 하기-3(VPC CNI custom networking 활용 성공 편)

반응형