Ssoon
[2주차] EKS Networking - Custom configuration mode 본문
CloudNet@ 팀의 AWS EKS Workshop Study 2주차 정리입니다.
✅ Custom configuration mode
- 기본적으로 Amazon VPC CNI plugin for Kubernetes는 Amazon EC2 노드의 secondary ENI 를 생성하는 경우 노드의 기본 네트워크 인터페이스와 동일한 서브넷에서 생성합니다
- 기본 네트워크 인터페이스에 할당된 IP 주소가 pods에 할당되지 않습니다.
- secondary 네트워크 인터페이스의 IP 주소만 pods에 할당됩니다.
[ 1단계: 테스트 VPC 및 클러스터 생성 ]
- 사용할 몇 가지 변수를 정의합니다.
$cluster_name = "my-custom-networking-cluster"
$account_id=$(aws sts get-caller-identity --query Account --output text)
Get-Variable cluster_name
Get-Variable account_id
- VPC를 생성합니다
aws cloudformation create-stack --stack-name my-eks-custom-networking-vpc `
--template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml `
--parameters ParameterKey=VpcBlock,ParameterValue=192.168.0.0/24 `
ParameterKey=PrivateSubnet01Block,ParameterValue=192.168.0.64/27 `
ParameterKey=PrivateSubnet02Block,ParameterValue=192.168.0.96/27 `
ParameterKey=PublicSubnet01Block,ParameterValue=192.168.0.0/27 `
ParameterKey=PublicSubnet02Block,ParameterValue=192.168.0.32/27
- 템플릿에서 생성한 프라이빗 서브넷 ID 값으로 변수를 정의합니다.
$subnet_id_1=aws cloudformation describe-stack-resources --stack-name my-eks-custom-networking-vpc --query "StackResources[?LogicalResourceId=='PrivateSubnet01'].PhysicalResourceId" --output text | Out-String
$subnet_id_2=aws cloudformation describe-stack-resources --stack-name my-eks-custom-networking-vpc --query "StackResources[?LogicalResourceId=='PrivateSubnet02'].PhysicalResourceId" --output text | Out-String
Get-Variable subnet_id_1
Get-Variable subnet_id_2
- 이전 단계에서 검색된 서브넷의 가용 영역으로 변수를 정의합니다.
$az_1=aws ec2 describe-subnets --subnet-ids $subnet_id_1 --query 'Subnets[*].AvailabilityZone' --output text
$az_2=aws ec2 describe-subnets --subnet-ids $subnet_id_2 --query 'Subnets[*].AvailabilityZone' --output text
Get-Variable az_1
Get-Variable az_2
- IAM 신뢰 정책 JSON 파일을 생성합니다.
@"
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
"@ | Set-Content -Path eks-cluster-role-trust-policy.json
- EKS 클러스터 IAM 역할을 생성합니다.
aws iam create-role --role-name myCustomNetworkingAmazonEKSClusterRole --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
- EKS 관리형 AmazonEKSClusterPolicy를 역할에 연결합니다.
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy --role-name myCustomNetworkingAmazonEKSClusterRole
- 클러스터를 생성합니다.
aws eks create-cluster --name my-custom-networking-cluster \
--role-arn arn:aws:iam::$account_id:role/myCustomNetworkingAmazonEKSClusterRole \
--resources-vpc-config subnetIds=$subnet_id_1","$subnet_id_2
- 클러스터 통신할수 있도록 구성을 업데이트 합니다.
[ 2단계: VPC 구성 ]
- OIDC 자격 증명 공급자를 생성합니다.
eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster=my-custom-networking-cluster --approve
- VPC CNI plugin for Kubernetes IAM 역할 생성
sctl create iamserviceaccount `
--name aws-node `
--namespace kube-system `
--cluster my-custom-networking-cluster `
--role-name "AmazonEKSVPCCNIRole" `
--attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy `
--override-existing-serviceaccounts `
--approve
- VPC CNI plugin 을 생성합니다.
aws eks create-addon --cluster-name my-custom-networking-cluster `
--addon-name vpc-cni `
--addon-version v1.12.5-eksbuild.2 `
--service-account-role-arn arn:aws:iam::251054188804:role/AmazonEKSVPCCNIRole `
--resolve-conflicts OVERWRITE
- 클러스터 VPC ID를 검색하여 이후 단계에서 사용할 수 있도록 변수에 저장합니다.
$vpc_id=$(aws eks describe-cluster --name my-custom-networking-cluster --query "cluster.resourcesVpcConfig.vpcId" --output text | Out-String)
Get-ChildItem Env: | Where-Object { $_.Name -eq "vpc_id" }
- 추가 Classless Inter-Domain Routing(CIDR) 블록을 클러스터의 VPC 연결합니다.
- CIDR 블록은 기존에 연결된 모든 CIDR 블록과 겹칠 수 없습니다.
aws ec2 describe-vpcs --vpc-ids $vpc_id `
--query 'Vpcs[*].CidrBlockAssociationSet[*].{CIDRBlock: CidrBlock, State: CidrBlockState.State}' --out table
- 추가 CIDR 블록을 VPC에 연결한 후 확인합니다.
[ 3단계: Kubernetes 리소스 구성 ]
- AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG 환경 변수를 aws-node DaemonSet의 true로 설정합니다.
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
- 클러스터 보안 그룹의 ID를 검색하여 이후 단계에서 사용할 수 있도록 변수에 저장합니다.
$cluster_security_group_id=$(aws eks describe-cluster --name $cluster_name --query cluster.resourcesVpcConfig.clusterSecurityGroupId --output text)
- pods를 배포하려는 각 서브넷에 대해 ENIConfig 사용자 지정 리소스를 생성하고 확인합니다.
- ENIConfig
- aws-node DaemonSet에서는 노드에 ENI (Elastic Network Interface)를 추가하고, Pod의 IP 주소를 관리하기 위해 ENIConfig 라는 설정 옵션을 사용합니다. 이 옵션을 통해 노드에서 사용할 ENI의 네트워크 구성을 지정할 수 있습니다. 또한 이 옵션은 AWS VPC CNI가 Pod에 할당할 IP 주소를 지정하는 데 사용됩니다.
@"
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
name: $az_1
spec:
securityGroups:
- $cluster_security_group_id
subnet: $new_subnet_id_1
"@ | Set-Content -Path az_1.yaml
@"
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
name: $az_2
spec:
securityGroups:
- $cluster_security_group_id
subnet: $new_subnet_id_2
"@ | Set-Content -Path az_2.yaml
- aws-node DaemonSet를 업데이트하여 클러스터에 생성된 모든 새로운 Amazon EC2 노드에 가용 영역의 ENIConfig를 자동으로 적용합니다.
[ 4단계: Amazon EC2 노드 배포 ]
- 노드 IAM 역할을 생성합니다.
- IAM 신뢰 정책 JSON 파일을 생성합니다.
@"
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
"@ | Set-Content -Path node-role-trust-relationship.json
- 역할 이름에 대한 변수를 설정합니다.
$node_role_name="myCustomNetworkingAmazonEKSNodeRole"
- IAM 역할을 생성하고 이후 단계에서 사용할 수 있도록 반환된 Amazon 리소스 이름(ARN)을 변수에 저장합니다.
$node_role_arn=$(aws iam create-role --role-name $node_role_name --assume-role-policy-document file://"node-role-trust-relationship.json" `
--query Role.Arn --output text)
- 필요한 3개의 IAM 관리형 정책을 IAM 역할에 연결합니다.
aws iam attach-role-policy `
--policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy `
--role-name $node_role_name
aws iam attach-role-policy `
--policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly `
--role-name $node_role_name
aws iam attach-role-policy `
--policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy `
--role-name $node_role_name
- 노드 그룹 유형 중 하나를 생성합니다
- 관리형(Managed)
- 시작 템플릿을 사용하지 않거나 AMI ID가 지정되지 않은 시작 템플릿을 사용하는 경우
- 관리형(Managed)
aws eks create-nodegroup --cluster-name $cluster_name `
--nodegroup-name my-nodegroup `
--subnets $subnet_id_1 $subnet_id_2 `
--instance-types t3.medium `
--node-role $node_role_arn
- pods가 이전 단계에서 생성한 서브넷 중 하나에 연결된 CIDR 블록의 IP 주소를 할당하는지 확인합니다.
coredns pods에 VPC 추가한 192.168.1.0 CIDR 블록의 IP 주소가 할당되었습니다.
사용자 지정 네트워킹을 사용하지 않는 경우 원래 CIDR 블록만 VPC와 연결되기 때문에 192.168.0.0 CIDR 블록의 주소가 할당됩니다.
- 추가 pods를 생성하면 추가한 192.168.1.0 대역으로 IP 주소가 할당되는 것을 확인할 수 있습니다.
- pod's spec이 hostNetwork=true를 포함하는 경우 노드의 기본 IP 주소가 할당됩니다.
- 추가한 서브넷의 주소는 할당되지 않습니다.
- 기본적으로 이 값은 false로 설정됩니다.
- 이 값은 클러스터에서 실행되는 kube-proxy 및 Amazon VPC CNI plugin for Kubernetes(aws-node) pods에 대해 true로 설정됩니다.
- 따라서 kube-proxy 및 플러그인의 aws-node pods에 이전 출력의 192.168.1.x 주소가 할당되지 않습니다.
'AWS EKS Workshop Study' 카테고리의 다른 글
[3주차] EKS 스토리지 - EFS CSI driver (0) | 2023.05.12 |
---|---|
[3주차] EKS 스토리지 - EBS CSI driver (0) | 2023.05.12 |
[2주차] EKS Networking - Prefix Mode (0) | 2023.05.04 |
[2주차] EKS Networking - Secondary IP mode (0) | 2023.05.02 |
[1주차] Amazon EKS 시작하기 - Nodes - Fargate (0) | 2023.04.25 |
Comments