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/
작업 리스트
- VPC에 추가할 CIDR대역 추가
- 추가한 CIDR에 서브넷 추가
- 추가한 서브넷에 라우팅 테이블 설정
- AWS VPC CNI플러그인 확인 및 설정
- ENIConfig 사용자 지정 리소스 정의(CRD, CustomResourceDefinition)를 설치
- 모든 서브넷 및 가용 영역에 대해 ENIConfig 사용자 지정 리소스를 생성
- 새로운 노드그룹 생성
- 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 활용 성공 편)
'IT > AWS' 카테고리의 다른 글
[AWS] Cloudfront Log 파일 S3버킷에 날짜 경로로 저장하기(yyyy/mm/dd/hh) (0) | 2021.10.14 |
---|---|
[AWS] EKS 클러스터에 서브넷 IP 추가 하기-2(VPC CNI custom networking 활용 실패 편) (0) | 2021.10.13 |
[AWS] app2Container(A2C) 란? (0) | 2021.10.06 |
[AWS] SSM을 이용한 EC2 접근 - 보안강화 버전(aws-valut, MFA 사용) (1) | 2021.10.01 |
AWS Load balancer controller 통신 포트 확인하기 (0) | 2021.09.24 |