반응형
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값을 보존해 주지 않으면 모두 초기화 되며 이슈가 발생할 수 있다.
작업 전 설정을 확인 후 진행하자.
반응형
'Cloud > Kubernetes' 카테고리의 다른 글
Container의 개념 (0) | 2024.10.13 |
---|---|
Kubernetes PodDisruptionBudget(PDB) 활용 (0) | 2023.05.03 |
HTTPS통신을 위한 Nginx Ingress 설정 (0) | 2023.04.13 |
kubernetes환경에 nginx ingress 설치하기 (0) | 2023.04.12 |
Kubernetes plug-in 설치 및 사용 가이드(kube-ctx, ns, node-shell, neat, kube-ps1) (0) | 2023.03.29 |