2주차 Networking - VPC CNI, AWS LB Ctrl, CoreDNS/ExternalDNS 실습편

1. 원클릭EKS 배포

  1. 스텝들

    1. IAM 에서 Key값 넣어준다. (배포를 위한 권한)

    2. SgIngreeSshCiDR에 나의 IP를 넣어준다. (다른 사용자가 SSH 접근 막기위해)

    3. 나머지 확인 눌러주시면 20분 뒤에 EKS 클러스터가 올라오게됩니다.

    4. 실습하기 편하게 PLUGINS들도 안에 다 설치되어있다! (AWS EC2 User Data 이용)

  2. 실습을 위한 EC2 접근 및 노드 접근 정책 설정

    a. 넣어줬던 pem 파일을 이용해서 ssh를 하면 다음과 같이 정상적으로 접근 가능한것을 확인

    1. `ssh -i .pem root@dns-address`

b. Node 들에 대한 private Ip들을 변수 지정합니다.

c. 노드 보안그룹에 eksctl-host에서 노드 에 접속 가능하게 룰 추가 및 접속 가능한지 확인

2. [실습] 네트워크 기본 정보 확인

  • CNI 정보 확인

  • kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

  • 노드 IP 확인 및 파드 IP 확인

    • 두개의 대역이 같은것을 확인

노드 IP
파드 IP
  • 네트워크 관련 로그들 확인 (플러그인 과 ipamd)

    • `tree /var/log/aws-routed-eni`

3. 노드에서 기본 네트워크 정보 확인

A. [실습] 보조 IPv4 주소를 파드가 사용하는지 확인

  • for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -br -c addr; echo; done

    121 노드의 네트워크 카드를 보여준다!
  • AWS 내에서도 동일하게 ENI 2장이 보인다 (메인 프라이빗 IPv4 주소)

  • 파드가 없어서 보조 ip가 사용하는지 확인이 되지 않음 해당 ip들 맵핑은 실습B 스텝이후에 검증했다!

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

kubectl 레벨에서 확인
해당 노드내에서 확인

4. 노드 간 파드 통신

A. [실습] 파드간 통신 테스트

  • 목적: 별도의 NAT 없이 통신이 가능하다는것을 보여주기 위함

  • 모든 노드에 TCP DUMP를 설정 해두고 파드간 통신시에 Tunneling 없이 동작하는지 확인

  • 실험 설정:

    • 노드들에TCP Dump를 설정

      • sudo tcpdump -i any -nn icmp

    • kubectl로 파드간 통신 생성

      • kubectl exec -it $PODNAME2 -- ping -c 2 $PODIP3

  • 실험 결과:

    • 아무 터널링 없이 파드간 통신이 이뤄지고있음이 확인

5. 파드에서 외부 통신

A. [실습] 파드에서 외부 통신

  • 목적: 파드가 외부 통신을 할때 어떤 IP로 나가는지 확인

  • 실험설정:

    • 노드에서 tcpdump 설정

      • sudo tcpdump -i any -nn icmp

    • 파드에서 외부로 ping

    • 출력된 결과를 보고 iptables 설정을 통해서 어떤 일이 일어났는지 유추

  • 실험결과:

    • 연결 잘 되는 것으로 보인다.

    • iptables 관련 세부 실습을 추가로 진행해야 정확하게 어떻게 처리됐는지 확인이 가능하다.

    • 일단 단편적으로 외부 IP는 아래와 같다.

      • kubectl exec -it $i -- curl -s ipinfo.io/ip;

6. 노드에 파드 생성 갯수 제한

A. [실습] 노드에 파드 생성 갯수 제한

  • 목적: 노드에 파드 생성 갯수 제한을 확인

  • 실험 설정:

    • 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개로 늘어 났습니다.

7. Service & AWS LoadBalancer Controller

A. [실습] AWS LoadBalancer Controller 배포 with IRSA

  • 목적: 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 설정 마무리

B. [실습] 서비스/파드 배포 테스트 with NLB

  • 목적: 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

    • 정상 접속 확인

8. Ingress

A. [실습] 서비스/파드 배포 테스트 with Ingress(ALB)

  • 목적: 서비스를 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 등록 되어있었다.

    • 게임도 정상적으로 올라와 있는것을 확인

9. ExternalDNS

A. [실습] ExternalDNS 설치

  • 목적: ExternalDNS 배포시에 정상적으로 도메인 이름 배포되는지 확인

  • 실험 설정:

    • AWS Route 53 정보 확인

    • 환경 변수 지정

  • 실험 결과:

    • ExternalDNS 설치 및 나의 DOMAIN 설정확인

B. [실습] Service(NLB) + 도메인 연동(ExternalDNS)

  • 목적: NLB 와 DNS 연동 설정

  • 실험 설정:

    • 테트리스 서비스 배포

    • DNS 연동 설정

      • kubectl annotate service tetris "external-dns.alpha.kubernetes.io/hostname=tetris.$MyDomain"

      • Annotation 사용해서 손쉽게 dns 설정 완료

  • 실험 결과:

    • 도메인 정상 동작 및 웹사이트에서 도메인 확인

Last updated