2주차 Networking - VPC CNI, AWS LB Ctrl, CoreDNS/ExternalDNS
1. 도입
이번주는2주차(3.10) : Networking - VPC CNI, AWS LB Ctrl, CoreDNS/ExternalDNS 에 대해 알아보자
인프런에서도 강의를 같이 진행하고 있다. 네트워크 내용들에 대해서 2, 3번 보게 되었다! 스터디에서 트러블 슈팅시에 꿀팁들을 난무하셔서 든든했다! 확실히 스터디에서 인프런에서 다루지 않은 심화내용들을 권장해주신다.
해당 스터디원들의 누적된 공헌들의 합을 내가 지금 받고 있는것으로 감개무량하다! (감사합니다!)
2. 선수 지식
K8S
K8S CNI
K8S SERVICE
K8S CoreDNS
K8S ExternalDNS
K8S Policy
K8S TOOLS
kube-ops-view
네트워크 관련 툴
iptables
masquerade
추가 이해가 필요한 요소들
eBPF
Istio
3. Amazon EKS 원클릭 배포 환경 가이드
a. 기본 인프라 환경
실습을 위한 VPC 생성
3개의 가용 영역에 퍼블릭 서브넷 3개, 프라이빗 서브넷 3개 생성
작업용 EC2 생성
b. AWS EKS 클러스터 설치
EC2의 User Data 스크립트 실행
export | egrep 'ACCOUNT|AWS_|CLUSTER|KUBERNETES|VPC|Subnet
| egrep -vSECRET|KEY
하면 환경 변수 정보 모두 확인 가능하다.k8s 사이드 툴들을 사용하기위해 1.28을 사용했다.
eks 클러스터 설치 (oidc, iam role, endpoint)
c. Amazon EKS 노드 그룹 구성
관리형 노드 그룹
3개의 가용영역에 워커노드 3개
d. 추가 설치
ADD-ON
최신 버전들 설치 해줄수 있다.
VPC ID 와 서브넷 ID 등 필요한 정보 변수 선언
4. Amazon VPC CNI
Amazon EKS는 VPC CNI 플러그인을 통해 클러스터 네트워킹 환경을 구성
a. 소개
AWS VPC와 유기적인 연결이 된다!!
POD IP 네트워크 대역과 노드(워커)의 IP 대역이 같아서 직접 통신이 가능하다.
파드간 통신시 K8S CNI는 오버레이 통신함 그와 반면에 AWS CNI는 동일 대역으로 직접 통신한다. (오버헤드 발생 VS 오버헤드 없다)
다른 워커 노드들과 통신이 바로바로 된다.
b. 아키텍쳐
Primary IP Address가 무엇인가?
할당된 ENI다.
위화면에서 프라이빗 IPv4 주소로 나타난다
Secondary IP Address가 무엇인가?
Kubelet을 통해 늘어난 pod 에게 secondary Ip들을 할당한다.
보조 프라이빗 IPv4 주소로 나타난다.
왜 CoreDNS는 Veth로 다른 ENI를 사용하는것처럼 보이냐? (그림은 공인 IP가 노출되서 제거했습니다.)
호스트의 네트워크 네임스페이스를 사용하지 않아서 다르다!
다른 파드들은 호스트의 네트워크 네임스페이스를 공유한다.
컨테이너 내용이라서 넘어가겠다!
실습사항 워커 노드에 파드를 여러개 띄우게 되면 그에따라 secondary IP들과 ENI 가 추가되었다.
해당 실습은 ip link를 watch 해두고 eksctl로 pod들을 생성했다.
POD들을 삭제하니 ENI가 줄어들었다!
c. 통신 흐름
노드 간 파드 통신을 확인하는 실습
AWS 상에는 Virtual Router가 파드간 통신을 연결시킨다.
TCP 덤프를 뽑아서 여기서 Tunneling 없이 동작하는지 확인
tcp 덤프를 노드에 다 설정해두고
tcpdump -i any -nn(모든 인터페이스) icmp (ping packet)
ping 할때, 터널링 없다! 원본 패킷을 가져온다 !!
첫번쨰 eni를 사용해서 통신이 되는것을 확인할 수 있었다!
d. 구성의 최대 파드 개수 실습 (두번째 중요한 이슈)
워커 노드에 생성가능한 최대 파드 갯수 제한이 있다.
VPC CNI
t3.medium 최대 ENI 갯수 제한으로 파드 갯수가 제한된다!
c5.large 쓰면 IPV4 prefix로 최대 할당 가능 IP 개수 늘릴수 있습니다.
실습시에 실제로 pod를 최대한도치를 넘겼더니 pod 생성이 되지 않는것을 확인!
대역 위임 Prefix를 이용하면 최대 파드 배치수 추가 가능
EKS 워크숍을 확인하면 가능하다!
5. Service & AWS LoadBalancer Controller
Service는 Node들에 고정 진입점을 설정할 수 있게 해주는 k8s 구성요소입니다.
위와 같은 iptables 로직을 거치지 않고 aws load balancer Controller의 장점은 효율적이다!
하지만 AWS 구성요소인 NLB에게 EKS의 구성요소가 있다는 것을 알리고 권한을 주려고하면 Load Balancer Controller 파드가 필요하다. (IAM ROLE을 주는것이 CONTROLLER)
IAM Policy가 버전마다 달라지니 주의가 필요
설치 완료후 cluster role 확인 필요하다.
AWS 에 들어가서 해당 ROLE의 신뢰관계에 들어가보면 Principal 값에 EKS 값이 들어있는지 확인 가능하다.
a. 서비스/파드 배포 테스트 with NLB 실습
실제로 DEPLOY 해두고 targetgroupbinding 정보 와 서비스내용 확인
K8S 리소스를 수정했더니 AWS의 로드밸런서의 리소스 설정의 값이 수정이 된것을 확인
보안그룹 추가도 가능
AWS LB 화면에서 POD의 IP가 LB의 설정에 들어와있는것을 확인!!!
b. Pod Readiness Gate
k8s 기능인데 ALB 와 NLB의 헬스체크에 의해 정상일 경우 파드로 전달할 수 있는 기능
c. Ingress 실습 서비스/파드 배포 테스트 with Ingress(ALB)
L7 계층에서 HTTP 동작 - 부하분산 해준다
AWS LoadBalancer Controller + Ingress (ALB) IP 모드 동작 with AWS VPC CNI
ALB 대상 그룹에 대상 확인하는것을 확인
리소스맵 보면 맵을 다 그려준다!
d. ExternalDNS
접속 주소가 복잡하다 → 사용자가 편한 주소(도메인 주소)로 맵핑해준다.
LoadBalancer controller 처럼 role이 필요하다
ExternalDNS CTRL 권한 주는 방법은 3가지가 있다.
Node IAM Role (보안적 취약함)
Static Credentials
IRSA (권고사항)
Controller 생성 실습:
AWS Route 53 정보 확인 & 변수 지정
externalDNS 배포진행
권장사항 —policy=upsert-only (A/TXT레코드 설정 날라갈 수 있으니 필수로 지정하고 사용합시다)
도메인 체크시에 정상적으로 표기확인 (NLB 맵핑 + DNS 맵핑 확인)
kubectl annotate service tetris “external-dns.alpha.kubernetes.io/hostname=tetris.$MyDomain
dig로 확인 했을때 됨
전세계 도메인 체커
Ingress 의 annotation을 통해 domain추가가 가능해진다!
tls 의 설정도 추가로 해주면 가능하다!
e. Network Policies with VPC CNI
K8s Network Policy API를 구현을 작년에 EKS에서 수용할 수 있다!!!!!!
eBPF → 커널에서 일어나서 성능이 좋다
NODE AGENT가 eBPF에 조작을 가해준다.
설정하는 방법
POLICY ENABLE 하기
실습 내용
4개의 파드를 만들고
4개의 파드는 접근을 할수 없게끔 정책을 설정
트래픽이 통과 되지 않음
동일 네임스페이스 수신 허용
수신 확인
송신 트래픽 거부:
통신 안되는것을 확인!!
느낀점
인프런과 비슷한 구성이였지만 해당 스터디에서 최신 업데이트까지 포함해서 알아야할 내용들을 압축전달 받은 느낌이다!
서종호님께 다시한번 감사의 말씀을 드린다!
Last updated