Search
Duplicate
🐍

Kubernets Network basic & Service

Category
S/W 엔지니어
Tags
k8s
Service
Network
Kubernetes
Created time
2022/09/22

Kubernetes 네트워킹 기본

동일 pod 내에서 container 간 통신은 localhost(127.0.0.1)로 가능.
1.
동일 cluster 내에서 pod 간 통신은 서로 다른 node에 있다 하더라도 NAT(Network Address Translation)없이 가능
참고로, node 간에도 NAT 없이 통신 가능(pod <> pod, node <> node 모두 k8s mandatory)

Service

기본 사항

서비스(Service) 존재 이유 : 아래 문제를 해결하기 위해
pod는 하루살이다(ephemeral) : pod는 언제 사라질지 모름.
k8s는 pod에 IP 할당을 pod가 스케줄된 후에, 그리고 시작되기 전에 함 : client는 pod의 IP를 알 수 없음.
수평 확장은 여러 pod가 동일 서비스를 제공 가능함을 의미함 : client는 단일 IP로 서비스에 접근할 수 없음.
모든 서비스(Service)는 자신만의 IP(Cluster IP, VIP(Virtual IP)), port를 가짐(예외 : headless service. ClusterIP : None 설정)
pod에 대한 자체적 load balancer 기능 포함(노드 내 pod 간, 노드 외 pod 간에 관계 없이)
자체 DNS 이름을 가짐(metadata.name 참조).
3개 타입이 있음: ClusterIP, NodePort, LoadBalancer
L4에서 동작함.

서비스 타입 별 설명

1. ClusterIP 타입
Service 기본값
이 자체 만으로는 클러스터 외부에서 해당 Service에 접근 불가
2. NodePort 타입
클러스터의 각 노드에 서비스 IP와 PORT에 대응하는 port를 할당 - 할당 가능 번호는 30000 ~ 32767
ClusterIP 의 IP, port 뿐 아니라, Node의 IP 및 해당 node port로도 접근 가능 - 일반적으로 자동 로드밸런서를 제공하지 않는 온프레미스 등에 사용
3. LoadBalancer 타입
NodePort 의 확장 - 외부(e.g. 클라우드 공급자)에서 제공하는 load balancer를 사용
보통 해당 load balancer에는 public IP를 가지며, 모든 커넥션을 service로 전달
서비스 별로 생성됨(One important reason is that each LoadBalancer service requires its own load balancer with its own public IP address)

서비스 내부 구조 : kube-proxy

client에서 Service로의 모든 인입은 kube-proxy 프로세스가 처리.
kube-proxy는 Service로의 connection 발생 시 pod로 연결(설명은 userspace 모드로 설명했지만 기본값으로 실제는 iptables 모드로 동작(w/ netfilter. 성능상 이유). kube-proxy는 iptables로 rule 설정을 담당)
kube-proxy는 service내 pod가 하나 이상일 경우 load balancing도 담당(When a service is backed by more than one pod, the proxy performs load balancing across those pods)
userspace 모드 : round robin
iptables 모드 : random
Service에 할당된 IP, port는 가상이기에 이를 참조하는 모든 packet은 kube-proxy가 실제(pod) IP, port로 변환. 따라서 Service로는 ping도 불가.
kube-proxy는 service의 변경 뿐 아니라 Endpoints 객체의 변경도 함께 모니터링함(Endpoints 객체는 해당 서비스의 모든 pod에 대한 IP/port 목록을 가짐)

Service 생성 과정

1.
Service 생성 명령 전달 to API server
2.
Service는 가상 IP 할당받음
3.
API Server가 각 노드의 kube-proxy에 service가 생성됨을 알림
4.
kube-proxyiptables 규칙 설정을 통해 자신의 노드에 해당 서비스의 주소에 대한 설정(destination이 서비스의 IP/port인 패킷을 가로채서, destination이 해당 서비스의 한 pod를 가리키도록 설정)

References