2주차 Networking - VPC CNI, AWS LB Ctrl, CoreDNS/ExternalDNS 실습편
Last updated
Last updated
스텝들
IAM 에서 Key값 넣어준다. (배포를 위한 권한)
SgIngreeSshCiDR에 나의 IP를 넣어준다. (다른 사용자가 SSH 접근 막기위해)
나머지 확인 눌러주시면 20분 뒤에 EKS 클러스터가 올라오게됩니다.
실습하기 편하게 PLUGINS들도 안에 다 설치되어있다! (AWS EC2 User Data 이용)
실습을 위한 EC2 접근 및 노드 접근 정책 설정
a. 넣어줬던 pem 파일을 이용해서 ssh를 하면 다음과 같이 정상적으로 접근 가능한것을 확인
`ssh -i .pem root@dns-address`
b. Node 들에 대한 private Ip들을 변수 지정합니다.
c. 노드 보안그룹에 eksctl-host에서 노드 에 접속 가능하게 룰 추가 및 접속 가능한지 확인
CNI 정보 확인
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
노드 IP 확인 및 파드 IP 확인
두개의 대역이 같은것을 확인
네트워크 관련 로그들 확인 (플러그인 과 ipamd)
`tree /var/log/aws-routed-eni`
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -br -c addr; echo; done
AWS 내에서도 동일하게 ENI 2장이 보인다 (메인 프라이빗 IPv4 주소)
파드가 없어서 보조 ip가 사용하는지 확인이 되지 않음 해당 ip들 맵핑은 실습B 스텝이후에 검증했다!
route table에 각각 노드에 watch를 걸기
watch -d "ip link | egrep 'eth|eni' ;echo;echo "[ROUTE TABLE]"; route -n | grep eni"
netshoot-pod를 생성시에 라우트 테이블에 [실습A]에서 할당되어있던 보조 프라이빗IPv4 가 할당 확인
두번째 노드에가 ENI를 확인 할 수 있었습니다. + 보조 프라입시 IPv4 5개 추가됨
pod의 IP 확인
각각 kubectl pod 가 보조 ip를 할당 받은것을 확인
`kubectl get pods -owide`
sudo nsenter -t $MyPID -n ip -c addr
목적: 별도의 NAT 없이 통신이 가능하다는것을 보여주기 위함
모든 노드에 TCP DUMP를 설정 해두고 파드간 통신시에 Tunneling 없이 동작하는지 확인
실험 설정:
노드들에TCP Dump를 설정
sudo tcpdump -i any -nn icmp
kubectl로 파드간 통신 생성
kubectl exec -it $PODNAME2 -- ping -c 2 $PODIP3
실험 결과:
아무 터널링 없이 파드간 통신이 이뤄지고있음이 확인
목적: 파드가 외부 통신을 할때 어떤 IP로 나가는지 확인
실험설정:
노드에서 tcpdump 설정
sudo tcpdump -i any -nn icmp
파드에서 외부로 ping
출력된 결과를 보고 iptables 설정을 통해서 어떤 일이 일어났는지 유추
실험결과:
연결 잘 되는 것으로 보인다.
iptables 관련 세부 실습을 추가로 진행해야 정확하게 어떻게 처리됐는지 확인이 가능하다.
일단 단편적으로 외부 IP는 아래와 같다.
kubectl exec -it $i -- curl -s ipinfo.io/ip;
목적: 노드에 파드 생성 갯수 제한을 확인
실험 설정:
t3.medium을 사용하는 노드를 이용 (ENI가 5개로 제한되어있고 보조 IP는 각각 5개씩으로 제한됨)
(MaxENI * (IPv4addr -1) ) = 17개의 IP가 사용 가능한데 aws-node 와 kube-proxy 2개 제외하면 15개 사용가능하다.
kubectl describe node | grep Allocatable: -A6
-> 노드 정보에 해당 정보가 있다.
파드 개수를 점점 증가시켜보고 워커 노드의 eni를 확인 예정
디플로이먼트 생성
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/2/nginx-dp.yaml kubectl apply -f nginx-dp.yaml
파드 watch 걸기
watch -d 'kubectl get pods -o wide'
파드 50개 증가테스트
kubectl scale deployment nginx-deployment --replicas=50
실험 관찰 결과:
생성되지 못하고있는 pod 관찰 가능합니다.
노드의 ETH가 3개로 늘어 났습니다.
실험 결과:
Secondary IP가 할당되지 못한 파드는 생성 실패
해결책은 Prefix Delegation을 참조할 수 있다.
목적: AWS 구성요소인 LoadBalancer를 EKS에서 컨트롤하기위한 Controller 배포
실험 설정:
IAM Policy (AWSLoadBalancerControllerIAMPolicy) 생성
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json
AWS Load Balancer Controller를 위한 ServiceAccount를 생성
eksctl create iamserviceaccount --cluster=$CLUSTER_NAME --namespace=kube-system --name=aws-load-balancer-controller --role-name AmazonEKSLoadBalancerControllerRole
--attach-policy-arn=arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts --approve
Role 설정 마무리
목적: NLB 설정 정상 작동 확인
실험 설정:
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/2/echo-service-nlb.yaml
배포: kubectl apply -f echo-service-nlb.yaml
실험 관찰:
AWS ELB도 정상 배포 확인!
실험 결과:
NLB=$(kubectl get svc svc-nlb-ip-type -o jsonpath={.status.loadBalancer.ingress[0].hostname})
curl -s $NLB
for i in {1..100}; do curl -s $NLB | grep Hostname ; done | sort | uniq -c | sort -nr
정상 접속 확인
목적: 서비스를 Ingress로 배포시에 정상적으로 AWS에 등록되는것을 확인
실험 설정:
게임 파드와 service Ingress 배포
kubectl apply -f ingress1.yaml
kubectl get-all -n game-2048
kubectl get ingress,svc,ep,pod -n game-2048
kubectl get targetgroupbindings -n game-2048
실험 관찰:
실험 결과:
배포 완료이후 리소스맵
aws에 정상적으로 ALB 등록 되어있었다.
게임도 정상적으로 올라와 있는것을 확인
목적: ExternalDNS 배포시에 정상적으로 도메인 이름 배포되는지 확인
실험 설정:
AWS Route 53 정보 확인
환경 변수 지정
실험 결과:
ExternalDNS 설치 및 나의 DOMAIN 설정확인
목적: NLB 와 DNS 연동 설정
실험 설정:
테트리스 서비스 배포
DNS 연동 설정
kubectl annotate service tetris "external-dns.alpha.kubernetes.io/hostname=tetris.$MyDomain"
Annotation 사용해서 손쉽게 dns 설정 완료
실험 결과:
도메인 정상 동작 및 웹사이트에서 도메인 확인