Cluster Networking
- Pod 내 Container간 통신
- veth0(VNI)는 하나의 IP를 사용하며, 각 컨테이너끼리는 port 번호로 서로를 구분
2. Pod-to-Pod 통신
- Pod 하나는 고유한 IP 주소를 가지며, IP 주소로 서로 통신
3. Pod-to-Serivce 통신
- Pod는 죽었다가 살아날 수 있고, IP 주소가 동일할 것이라는 보장이 없기 때문에, Service 앞단에 reverse-proxy나 Load Balancer를 둠으로써 통신이 가능
- service 정의 시 selector를 통해 트래픽을 전달할 Pod를 결정
4. External-to-Service 통신
Service
- Pod는 클러스터 내에서 노드를 옮기며 IP가 변경됨
- 동적으로 변하는 Pod의 IP를 특정하기 위한 방법이 Service
- label과 label selector를 활용하여, 어떤 Pod를 Service로 묶을지 정의
Service Type (서비스를 외부 IP 주소에 노출하는 방법)
- ClusterIP : 클러스터 내부에서만 접근. 실서비스에서 단독 사용 X
- 기본적으로 외부와 통신 불가
- 외부와 통신을 위해서는
- netfilter chain rule을 통해 IP로 들어온 패킷을 각 Pod에 포워딩하는 설정을 하거나
- worker node 내 reverse proxy를 생성하여 ClusterIP로 패킷 포워딩
- 위 세팅을 EKS에서 진행하기 위해서는 EKS cluster 생성 시에 ssh 접근을 위한 값들을 입력해주어야 함
- NodePort : 모든 Node에서 특정 포트를 열고, 이 포트로 보내지는 모든 트래픽을 서비스로 forwarding
- 포트당 한 서비스만 할당
- 30000~32767 사이 포트만 사용 가능
- Node의 IP주소가 바뀌면 이를 반영해야 함
- LoadBalancer : 모든 트래픽이 로드밸런스를 거쳐 서비스로 포워딩
- AWS EKS에서 LoadBalancer 타입은 NLB를 프로비저닝 (L7을 사용하려면 Ingress 타입으로 배포)
- Ingress : 도메인 및 경로를 기반으로 들어오는 패킷을 특정 서비스로 포워딩
- AWS EKS에서 Ingress 타입은 ALB를 프로비저닝함
- ingress 사용 이전에 clusterIP나 NodePort 타입의 서비스가 생성되어 있어야 함
- worker node 내부에 ingress를 감지하여 로드밸런서를 프로비저닝하는 ingress controller가 있어야 함
ETCD
- 2379 포트에서 클라이언트 통신을 받고, 2380포트에서 서버간 통신
Reference
- https://medium.com/google-cloud/understanding-kubernetes-networking-pods-7117dd28727
- https://medium.com/finda-tech/aws-eks%EC%97%90%EC%84%9C-service-%ED%83%80%EC%9E%85-%EB%B3%84-ingress-%ED%85%8C%EC%8A%A4%ED%8A%B8-b911f129c8d5
- https://medium.com/swlh/kubernetes-services-simply-visually-explained-2d84e58d70e5
'Docker & k8s' 카테고리의 다른 글
[K8S] 5. Kubernetes Service Proxy (0) | 2022.02.03 |
---|---|
[K8S] 3. Kubernetes Network Commands (0) | 2022.02.03 |
[K8S] 2. Kubernetes Commands (0) | 2022.02.03 |
[K8S] 1. Kubernetes Core Component (0) | 2022.02.03 |
도커란? (Docker) (0) | 2020.12.17 |