상세 컨텐츠

본문 제목

[AEWS3기] 1주차 - Amazon EKS 설치 및 기본 사용 (4)

Cloud/Kubernetes

by zgz111 2025. 2. 8. 09:46

본문

* Data Plane의 노드 정보 상세 보기

1) Node ssh 접속

# 노드 IP 확인
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

 

# Priavte IP 변수 저장하기
kubectl get node --label-columns=topology.kubernetes.io/zone
kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a
kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c
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
echo "export N1=$N1" >> /etc/profile
echo "export N2=$N2" >> /etc/profile

 

 

아직 보안 그룹 설정을 하지 않아 통신이 되지 않습니다. 

# eksctl-host 에서 노드의IP나 coredns 파드IP로 ping 테스트
ping <IP>
ping -c 1 $N1
ping -c 1 $N2

 

보안 그룹 설정을 해줍니다.

# 노드 보안그룹 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
echo "export NGSGID=$NGSGID" >> /etc/profile

 

# 노드 보안그룹에 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 -o StrictHostKeyChecking=no ec2-user@$N1 hostname
ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no ec2-user@$N2 hostname

 

 

2) NODE 네트워크 확인

# AWS VPC CNI 사용 확인
kubectl -n kube-system get ds aws-node
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
kubecolor describe pod -n kube-system -l k8s-app=aws-node

# 파드 IP (서버와 같은 IP 대역을 사용)
kubectl get pod -n kube-system -o wide
kubectl get pod -n kube-system -l k8s-app=kube-dns -owide

 

# 노드 정보 확인
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i hostname; echo; done
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c addr; echo; done
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c route; echo; done
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i sudo iptables -t nat -S; echo; done

 

 

3) Node Cgroup 버전 확인

for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i stat -fc %T /sys/fs/cgroup/; echo; done

 

4) 노드 프로세스 정보 확인

# 노드 별 kubelet 서비스 확인
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i sudo systemctl status kubelet; echo; done

# 노드 별 프로세스 트리 확인 (kubelet, containerd 등 주요 프로세스)
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i sudo pstree; echo; done

# 노드 별 프로세스 자세히 확인
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i ps afxuwww; echo; done

# 노드 별 containerd 프로세스 확인
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i ps axf |grep /usr/bin/containerd; echo; done

# 노드 별 static pod 설정 확인 (EKS는 static pod 미사용) 
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i ls /etc/kubernetes/manifests/; echo; done    # EKS static pod X

# 노드 별 kubelet 설정 파일 확인
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i ls /etc/kubernetes/kubelet/; echo; done

# 노드 별 kubelet 설정 파일을 json 형식으로 확인
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i cat /etc/kubernetes/kubelet/kubelet-config.json | jq; echo; done

 

 

5) 노드 스토리지 정보 확인

for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i lsblk; echo; done
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i df -hT /; echo; done

 

 

6) EKS owned ENI 확인

API 서버와 Worker Node 간 연결 시 EKS Owned ENI를 사용합니다. 

- EKS API 서버는 AWS 관리 VPC에 위치

- API 서버 <> 워커 노드 연결 시 EKS Owned ENI를 사용

- kubectl > API 서버의 endpoint > API 서버 > EKS owned ENI > kubelet

- kubelet, kube-proxy > EKS owned ENI > API 서버 

# kubelet, kube-proxy 통신 Peer Address는 API 서버
# 노드 별 시스템 소켓 정보 확인 
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i sudo ss -tnp; echo; done

# API 서버 IP 확인
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
dig +short $APIDNS

 

kubelet과 kubeproxy가 API 서버(3.39.200.58, 3.36.247.246)와 연결되어 있음을 확인 

 

# [별도 터미널를 하나 더 생성] 파드 1곳에 shell 실행해두기 
## kubectl 명령으로 특정 파드에 접근 (경로) : 작업PC (bastion) -> API Server -> kubelet -> pod

# 별도 터미널에서 실행
kubectl run -it --rm netdebug --image=nicolaka/netshoot --restart=Never -- zsh
$ watch uptime

# 기존 작업 환경에서 실행
kubectl exec daemonsets/aws-node -it -n kube-system -c aws-eks-nodeagent -- bash

# 위에서 exec 실행으로 추가된 연결 정보의 Peer Address는 EKS Owned ENI이고 IP는 192.168.1.43이다.
# 결론 : 노드 (192.168.1.161)에서 실행되는 POD이며 Pod 입장에서 Next Peer는 EKS Owned ENI (192.168.1.43)이다. 
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i sudo ss -tnp; echo; done
...
ESTAB 0      0      [::ffff:192.168.1.161]:10250 [::ffff:192.168.1.43]:60464 users:(("kubelet",pid=2890,fd=17))
...

 

Network Interfaces에서 Description이 "Amazon EKS ***" 인 항목이 EKS Owned ENI입니다. 

 

 

관련글 더보기