IT/Container&k8s

[k8s] Network

Hayley Shim 2023. 10. 29. 00:38

안녕하세요. CloudNet@ K8S Study를 진행하며 해당 내용을 이해하고 공유하기 위해 작성한 글입니다. DevOps 이정훈님의 도서 ‘24단계 실습으로 정복하는 쿠버네티스’ 의 내용을 바탕으로 스터디를 하며 어떻게 k8s에 적용할지 고민하며 정리해봤습니다.

사전 작업

 

쿠버네티스 네트워크

1. AWS VPC CNI

K8S CNI : Container Network Interface는 k8s 네트워크 환경을 구성해줍니다.

AWS VPC CNI : 파드의 IP를 할당해줍니다. 파드의 IP 네트워크 대역과 노드의 IP 대역이 같아서 직접 통신이 가능합니다.

  • 파드간 통신 시 일반적으로 K8S CNI는 오버레이(VXLAN, IP-IP 등) 통신을 하고, AWS VPC CNI는 동일 대역으로 직접 통신을 합니다.
  • Calico CNI는 host networking namespace에 설치되고 각각의 노드는 virtual router로 역할을 합니다. AWS 네트워크 경우 ENI IP 주소만 알고 pod가 어디에 있는지 모릅니다. 기존 방식에서는 오버레이 네트워크를 통해 이를 해결하는데 Calico 경우 VXLAN, IP-IP 통신을 지원합니다.
Calico CNI의 오버레이(VXLAN, IP-IP 등) 통신
  • Cluster가 하나의 VPC에 존재할 경우, Calico CNI는 pod에서 pod 간 바로 통신되도록 지원합니다.
클러스터가 단일 VPC에 존재할 경우 Calico CNI를 통한 동일 대역 통신
  • 클러스터가 Multiple VPC에 존재할 경우 Calico CNI는 오버레이 네트워크를 통한 통신을 지원합니다.
클러스터가 멀티 VPC에 존재할 경우 Calico CNI를 통한 오버레이 네트워크 통신
  • 다른 CNI(Calico 등)과 달리 AWS VPC CNI는 네트워크 통신의 최적화(성능, 지연)를 위해서 노드와 파드의 네트워크 대역을 동일하게 설정합니다.
  • 각 pod 들은 underlying VPC 서브넷의 IP 주소를 할당받고 pod ip는 instance의 ENI 상의 secondary IP로 설정됩니다. 노드 상의 pod의 수가 ENI에서 지원되는 secondary IP의 수를 초과하게된다면 ENI가 자동으로 node에 추가 할당됩니다.
  • AWS VPC CNI는 오버레이 네트워크가 필요없이 이미 pod ip를 알고 있기 때문에 단일 VPC, 멀티 VPC에서 바로 pod 간 통신을 지원할 수 있게됩니다.
클러스터가 단일 VPC에 존재할 경우 AWS VPC CNI를 통한 동일 대역 통신
클러스터가 멀티 VPC에 존재할 경우 AWS VPC CNI를 통한 동일 대역 통신
  • Secondary IPv4 address : 인스턴스 유형에 최대 ENI 갯수와 할당 가능 IP 수를 조합하여 선정합니다.
인스턴스 타입에 따른 최대 ENI와 Pod의 개수
 

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

  • network 네임스페이스는 호스트(root)와 파드별(per pod)로 구분됩니다.
  • 특정한 pod(kube-proxy, aws-node)는 호스트(root)의 IP를 그대로 사용합니다.
  • ENI0, ENI1 으로 2개의 ENI는 자신의 IP 외 추가적으로 5개의 보조 private IP를 가질 수 있습니다.
  • coredns pod는 veth로 호스트에는 eniY@ifN 인터페이스와 pod에 eth0와 연결되어 있습니다.
 
  • 파드가 생성되면, 워커 노드 eniY@ifN 추가되고 라우팅 테이블에도 정보가 추가됩니다.

3. 노드 간 파드 통신

  • AWS VPC CNI 경우 별도의 오버레이(Overlay) 통신 기술 없이, VPC Native 하게 파드간 직접 통신이 가능합니다.
클러스터가 단일 VPC에 존재할 경우 AWS VPC CNI를 통한 동일 대역 통신
  • 파드간 통신 테스트 및 확인 : 별도의 NAT 동작 없이 통신 가능 확인
 

4. 파드에서 외부 통신

iptable 에 SNAT 을 통하여 노드의 eth0 IP로 변경되어서 외부와 통신됩니다.

VPC CNI 의 External source network address translation (SNAT) 설정에 따라, 외부(인터넷) 통신 시 SNAT 하거나 혹은 SNAT 없이 통신을 할 수 있습니다. [참고]

클러스터가 멀티 VPC에 존재할 경우 AWS VPC CNI를 통한 동일 대역 통신
 
 

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

  • Secondary IPv4 addresses : 인스턴스 유형에 최대 ENI 갯수와 할당 가능 IP 수를 조합하여 선정합니다.
  • 워커 노드의 인스턴스 타입 별 파드 생성 갯수가 제한됩니다. 인스턴스 타입 별 ENI 최대 갯수와 할당 가능한 최대 IP 갯수에 따라서 파드 배치 갯수가 결정됩니다. 단, aws-node 와 kube-proxy 파드는 호스트의 IP를 사용함으로 최대 갯수에서 제외합니다.
  • 최대 파드 생성 갯수 : (Number of network interfaces for the instance type × (the number of IP addressess per network interface — 1)) + 2
For a list of the maximum number of Pods supported by each instance type, see eni-max-Pods.txt on GitHub.

노드의 인스턴스 정보 확인 : t3.medium 사용 시

 

최대 파드 생성 및 확인

 
  • 해결 방안 : Prefix Delegation, WARM & MIN IP/Prefix Targets, Custom Network

6. max-pod 설정

  • 워커 노드 1대에 50대 이상의 파드가 배포해봅니다.

참고

  • LimitRange : k8s에서 하나 또는 소수의 pod가 사용가능한 모든 리소스를 과점할 수 있는 우려가 있습니다. 그래서 네임스페이스별로 pod 또는 container 수준에서 자원 제약조건을 관리하기 위하여 정책을 정의합니다. 해당 정책이 적용되면 해당 적책 내의 제약조건을 벗어난 리소스를 요청하는 pod 또는 컨테이너는 생성이 거부됩니다.
  • kubelet의 max-pods args
  • AWS VPC CNI(ENABLE_PREFIX_DELEGATION|WARM_PREFIX_TARGET)
 

7. Service & AWS LoadBalancer Controller

Service 종류

  • Cluster IP : ClusterIP는 클러스터 내부에 새로운 IP를 할당하고 여러 개의 Pod을 바라보는 로드밸런서 기능을 제공합니다.
ClusterIP
  • NodePort : 클러스터 외부(노드)에서 접근할 수 있도록 NodePort 서비스를 만들 수 있습니다.
NodePort
  • LoadBalancer : NodePort의 단점은 노드가 사라졌을 때 자동으로 다른 노드를 통해 접근이 불가능하다는 점입니다. 예를 들어, 3개의 노드가 있다면 3개 중에 아무 노드로 접근해도 NodePort로 연결할 수 있지만 어떤 노드가 살아 있는지는 알 수가 없습니다. Load Balancer가 알아서 살아 있는 노드에 접근하면 NodePort의 단점을 없앨 수 있습니다.
LoadBalancer

EC2 instance profiles 설정 및 AWS LoadBalancer 배포

 

8. Ingress

클러스터 내부의 서비스(ClusterIP, NodePort, Loadbalancer)를 외부로 노출(HTTP/HTTPS)하는 역할을 합니다.

Ingress

서비스/파드 배포 테스트 with Ingress(ALB)

 

아래와 같이 ALB 대상 그룹에 등록된 대상 확인합니다.

ALB에서 파드 IP로 직접 전달합니다.

파드를 3개로 증가시켜봅니다.

$ kubectl scale deployment -n game-2048 deployment-2048 --replicas 3
deployment.apps/deployment-2048 scaled
 
 
blog migration project

written in 2023.3.13

https://medium.com/techblog-hayleyshim/k8s-network-b8f1f104c2b1