


CloudFormation을 통해 인프라를 배포합니다. 구성된 인프라의 아키텍처는 아래와 같습니다.

# 디폴트 네음스페이스 적용
kubectl ns default
# 클러스터 배포 확인
kubectl cluster-info
eksctl get cluster
eksctl get nodegroup --cluster $CLUSTER_NAME
# 환경변수 확인
export | egrep 'ACCOUNT|AWS_|CLUSTER|KUBERNETES|VPC|Subnet'
# 노드 정보 확인
kubectl get node --label-columns=node.kubernetes.io/instance-type,ekmazonaws.com/capacityType,topology.kubernetes.io/zone
# 노드 IP 주회 및 노드의 프라이빗 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
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-2b -o jsonpath={.items[0].status.addresses[0].address})
N3=$(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 "export N1=$N1" >> /etc/profile
echo "export N2=$N2" >> /etc/profile
echo "export N3=$N3" >> /etc/profile
echo $N1, $N2, $N3

# Secondary Group Rule 추가
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text)
echo $NGSGID
echo "export NGSGID=$NGSGID" >> /etc/profile
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32

# 핑테스트 (EC2 -< Worker Nodes)
ping -c 1 $N1
ping -c 1 $N2
ping -c 1 $N3

EKS -> 클러스터 선택 -> 추가기능 탭에서 Addon을 확인할 수 있습니다.

# 모든 파드의 커네이너 이미지 정보 확인
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c
# Addon 정보 확인
eksctl get addon --cluster $CLUSTER_NAME
# K8s 버전별 Addon 지원 확인
eksctl utils describe-addon-versions --kubernetes-version 1.29 | grep AddonName | wc -l
eksctl utils describe-addon-versions --kubernetes-version 1.28 | grep AddonName | wc -l

# 파드 모니터링
watch -d kubectl get pod -A
# CNI 정보 확인
ubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i tree /var/log/aws-routed-eni; echo; done
ssh ec2-user@$N1 sudo cat /var/log/aws-routed-eni/plugin.log | jq
# kube-proxy 모드 확인
kubectl describe cm -n kube-system kube-proxy-config | grep mode
# 파드 정보 확인
kubectl get pod -n kube-system -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase
# ENI & veth pair 정보 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -br -c addr; echo; done
# kube-proxy iptables 확인
ssh ec2-user@$N1 sudo iptables -t nat -S
# coredns 파드 IP 조회
kubectl get pod -n kube-system -l k8s-app=kube-dns -owide
# 노드 IP 조회
kubectl get node -owide
# 호스트 Routing Table 조회 -> veth coredns IP 일치 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c route; echo; done

# 테스트용 파드 생성
cat <<EOF | kubectl create -f -
> apiVersion: apps/v1
> kind: Deployment
> metadata:
> name: netshoot-pod
> spec:
> replicas: 3
> selector:
> matchLabels:
> app: netshoot-pod
> template:
> metadata:
> labels:
> app: netshoot-pod
> spec:
> containers:
> - name: netshoot-pod
> image: nicolaka/netshoot
> command: ["tail"]
> args: ["-f", "/dev/null"]
> terminationGracePeriodSeconds: 0
> EOF
# 파드 생성 확인
kubectl get pod -o wide
# 호스트 라우팅 테이블 조회 -> 워크노드 1 veth 인터페이스 생성 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c route; echo; done


파드에 접속하여 파드 간 통신을 확인합니다.

파드에서 외부 통신이 필요하면 iptables의 SNAT를 통해 외부와 통신합니다.

파드와 노드 각각에서 외부와 통신하는 공인 IP 주소가 동일합니다.