서비스란
파드를 통해 실행되는 앱을 네트워크에 노출(expose) 시키는 가상의 컴포넌트.
Pod와의 통신을 Endpoint 를 제공한다.
Why to use?
Pod 는 생성/삭제 될 때마다 새로운 Private IP 가 할당된다.
파드는 일시적(ephemeral)인 수명을 갖기 때문에 자주 IP 가 변하므로,
클라이언트 <-> Pod 간 내/외부 통신을 유지하기 어렵다.
따라서 고정 IP의 단일 네트워크 진입점이 필요하게 되었고 이를 'Service' 로 구현하게됐다.
Service Type 4
서비스는 총 4가지 유형으로 나뉜다.
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
Cluster IP (default)
Cluster 내부에서만 접근 가능하다.
L4 레이어 로드밸런서 역할을한다.
쿠버네티스는 서비스를 거치는 트래픽을 서비스 뒷단의 파드로 로드밸런싱한다.
* 로드밸런싱 기본 알고리즘은 Round Robin(RR) 이다. 이는 nginx, AWS ALB 의 기본 알고리즘과 같다.
Node Port
kubernetes node 에서 사용하는 nodeport(30,000 ~ 32,767)를 통해 Endpoint 를 노출한다.
즉, Node-IP:NodePort 로 요청을 전달하면, node -> service port -> pod 로 요청이 포워딩된다.
Load Balancer
외부에서 접근 가능한 로드밸런서를 연동한다.
k8s 에서 자체적으로 LB를 띄워주지 못하기 때문에 Cloud Provider (ex. AWS)의 NLB/ALB와 같은 로드밸런서와 연동이 필요하다.
External Name
서비스를 `externalName` 필드에 매핑한다.
클러스터의 DNS 서버를 설정하는데 이는 CNAME 을 반환하기 위한 것이다.
어떤 Proxy 설정도 없다.
kube-proxy
쿠버네티스 클러스터의 모든 노드는kube-proxy 를 실행한다.
kube-proxy 의 주요 역할 리버스 프록시 및 로드 밸런싱이다.
모든 노드에서 kube-proxy 실행이 필요하다 == 모든 노드는 kube-proxy 에 의해 관리되어야 한다.
=> kube-proxy 는 노드를 관리하기 위해 각각의 노드에 DaemonSet Pod 로 존재한다.
Reverse Proxy
iptables 를 생성 및 관리한다.
kube-proxy 는 kubernetes service object 가 생성/수정/삭제될 때 자동으로 알림을 받는다.
이때 변경된 ClusterIP에 따라 iptables 도 자동 업데이트 한다.
iptables 프록시 모드
Destination Network Address Translation(DNAT)
특정 서비스로 트래픽 유입시 해당 IP Packet 의 Destination IP 를 특정 Pod IP 로 변환해준다.
이렇게 목적지 아이피 주소를 변경해주는 매커니즘을 DNAT 이라한다.
(Service IP -> Pod IP)
IP에서 그치지 않고 Port 레벨 까지 포워딩 해주기 때문에 L4 Layer Reverse Proxy 역할을 한다고 볼 수 있다.
(Service Port -> Pod targetPort)
Load Balancing
구성은 ConfigMap 을 통해 이뤄진다.
kube-proxy 또한 별도의 인스턴스를 가지며 모든 서비스를 모니터링한다.
iptables
Linux iptables 는 역할에 따라 여러 종류의 테이블로 나뉜다.
- Filter Table
- NAT Table
- Mangle Table
- Raw Table
각 테이블은 Chaining 된다.
iptable chaining 결과에 따라 패킷 전달의 결과는 3가지중 하나가 된다.
- Accept
- Drop
- Reject
Filter Table
우리가 흔히 알고 있는 방화벽은 이 테이블로 구현된다.
패킷을 다음 체인으로 보낼지 말지를 결정한다.
NAT Table
Public <-> Private IP 변환에 사용되는 테이블이다.
Mangle Table
?
Raw Table
?
'기타 > Kubernetes' 카테고리의 다른 글
[k8s] Configuration.yaml (0) | 2023.08.11 |
---|---|
[k8s] VirtualBox k8s cluster 생성 실패 이슈 해결 (0) | 2023.08.09 |