# 노드 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
# 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
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i stat -fc %T /sys/fs/cgroup/; echo; done
# 노드 별 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
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
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입니다.
[AEWS3기] 2주차 - EKS Networking (2) (0) | 2025.02.14 |
---|---|
[AEWS3기] 2주차 - EKS Networking (1) (0) | 2025.02.13 |
[AEWS3기] 1주차 - Amazon EKS 설치 및 기본 사용 (3) (0) | 2025.02.05 |
[AEWS3기] 1주차 - Amazon EKS 설치 및 기본 사용 (2) (0) | 2025.02.05 |
[AEWS3기] 1주차 - Amazon EKS 설치 및 기본 사용 (1) (0) | 2025.02.04 |