다음으로, 클러스터 배포 내용에 대해서 확인해 보겠습니다.
먼저 EC2 인스턴스를 통해서 작업할 예정이기 때문에, 다음과 같이 Bastion을 만들어 주고, 배포를 시작합니다.
EKS 클러스터 생성에 앞서서 VPC, Subnet4개, EC2 1대 + 보안그룹 등을 설정하고,
다음 내용을 통해서 작업에 필요한 기본적인 도구들이 설치되었는지 확인합니다.
만약 설치되어 있지 않다면, 해당 도구들을 설치해야 합니다.
EKS 배포는 다음과 같이 다양한 방법을 통해서 배포가 가능하나,
eksctl을 통해서 배포하였습니다.
1. 도구 설치
# 기본 툴 및 SSH 키 설치 등 확인
kubectl version --client=true -o yaml | yh
gitVersion: v1.25.7-eks-a59e1f0
eksctl version
0.138.0
aws --version
aws-cli/2.11.15 Python/3.11.3 Linux/4.14.311-233.529.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
ls /root/.ssh/id_rsa*
# 도커 엔진 설치 확인
docker info
이후, 클러스터 생성에 필요한 변수들을 설정합니다.
2. 클러스터에 필요한 변수 설정
# 자격 구성 설정 없이 확인
aws ec2 describe-instances
# IAM User 자격 구성 : 실습 편리를 위해 administrator 권한을 가진 IAM User 의 자격 증명 입력
aws configure
# 자격 구성 적용 확인 : 노드 IP 확인
aws ec2 describe-instances
# EKS 배포할 VPC 정보 확인
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq Vpcs[].VpcId
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId
export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId)
echo "export VPCID=$VPCID" >> /etc/profile
echo VPCID
# EKS 배포할 VPC에 속한 Subnet 정보 확인
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output json | jq
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output yaml | yh
## 퍼블릭 서브넷 ID 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)
echo "export PubSubnet1=$PubSubnet1" >> /etc/profile
echo "export PubSubnet2=$PubSubnet2" >> /etc/profile
echo $PubSubnet1
echo $PubSubnet2
3. 클러스터 배포
# 변수 확인
echo $AWS_DEFAULT_REGION
echo $CLUSTER_NAME
echo $VPCID
echo $PubSubnet1,$PubSubnet2
# 옵션 [터미널1] EC2 생성 모니터링
#while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 1; done
aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
# eks 클러스터 & 관리형노드그룹 배포 전 정보 확인
eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=$CLUSTER_NAME-nodegroup --node-type=t3.medium \
--node-volume-size=30 --vpc-public-subnets "$PubSubnet1,$PubSubnet2" --version 1.24 --ssh-access --external-dns-access --dry-run | yh
# eks 클러스터 & 관리형노드그룹 배포
eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=$CLUSTER_NAME-nodegroup --node-type=t3.medium \
--node-volume-size=30 --vpc-public-subnets "$PubSubnet1,$PubSubnet2" --version 1.24 --ssh-access --external-dns-access --verbose 4
...
생성 후에, API 서버 엔드포인트 액세스가 퍼블릭으로 설정되어 있는지, Kubernetes 버전이 최신 버전으로 설정되어 있는지 정상적으로 동작하고 있는지 등을 확인합니다.
4. 클러스터 정보 확인
다음으로, 생성된 클러스터 정보를 확인해 보겠습니다.
# eks 클러스터 정보 확인
kubectl cluster-info
eksctl get cluster
aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint
# eks API 접속 시도
curl -k -s $(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint)
curl -k -s $(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint)/version | jq
상기 API 접속 시도 시, endpoint에 대해서 -k 옵션을 주어서, ssl 인증서에 대한 검증 없이 연결을 시도하였으나,
결과는 Forbidden으로 떨어집니다.
그렇다면, jq로 엔드포인트에 대한 버전을 읽어보면, 해당 내용은 잘 읽히는 것을 확인할 수 있습니다.
5. Node 접속 시도
다음으로는 Node에 접속하여 해당 내용을 자세하게 확인하려고 합니다.
# 노드 IP 확인 및 PrivateIP 변수 지정
aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
**N1=$(**kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
**N2=$**(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
****echo $N1, $N2
# eksctl-host 에서 노드의IP나 coredns 파드IP로 ping 테스트
ping <IP>
ping -c 2 $N1
ping -c 2 $N2
다음과 같이 Node1번과, Node2번을 설정, 보안 그룹을 설정한 다음에, 핑테스트를 시행합니다.
# 노드 보안그룹 ID 확인
aws ec2 describe-security-groups --filters Name=group-name,Values=*nodegroup* --query "SecurityGroups[*].[GroupId]" --output text
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*nodegroup* --query "SecurityGroups[*].[GroupId]" --output text)
echo $NGSGID
# 노드 보안그룹에 eksctl-host 에서 노드(파드)에 접속 가능하게 룰(Rule) 추가 설정
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr **192.168.1.100/32**
# eksctl-host 에서 노드의IP나 coredns 파드IP로 ping 테스트
ping -c 2 $N1
ping -c 2 $N2
# 워커 노드 SSH 접속
**ssh -i ~/.ssh/id_rsa ec2-user@$N1 hostname
ssh -i ~/.ssh/id_rsa ec2-user@$N2 hostname**
**ssh -i ~/.ssh/id_rsa ec2-user@$N1
exit**
**ssh -i ~/.ssh/id_rsa ec2-user@$N2
exit**
다음을 통해서 노드의 네트워크 정보를 확인합니다.
6. EKS owned ENI
다음으로, 스터디 중 살펴보았던 EKS owned ENI에 대해서 확인해 보겠습니다.
EKS owned ENI : 관리형 노드 그룹의 워커 노드는 내 소유지만,
연결된 ENI(NIC)의 인스턴스(관리형 노드)는 AWS 소유가 됩니다.
# kubelet, kube-proxy 통신 Peer Address는 어딘인가요?
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ss -tnp
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ss -tnp
해당 명령어를 통해서 확인해 보면, kubelet과 kube-proxy가 가리키는 Peer Address는 API 서버임을 알 수 있습니다.
# [터미널] aws-node 데몬셋 파드 1곳에 bash 실행해두기
kubectl exec daemonsets/aws-node -it -n kube-system -c aws-node -- bash
# exec 실행으로 추가된 연결 정보의 Peer Address는 어딘인가요? >> AWS 네트워크 인터페이스 ENI에서 해당 IP 정보 확인
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ss -tnp
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ss -tnp
감사합니다.
'IT > AWS' 카테고리의 다른 글
[AWS] Elasticache의 로컬 테스트 (2) | 2023.12.28 |
---|---|
[AEWS] Wk2-1. EKS Networking (0) | 2023.05.07 |
[AEWS] Wk1-1. EKS에 대해서 (2) | 2023.04.30 |
[AWS] MSK Unable to load credentials from any of the providers in the chain AwsCredentialsProviderChain 이슈 해결 방법 (0) | 2023.03.17 |
NAT 관련 메일 조치사항 (0) | 2023.03.08 |