이전 글에서는 Kubernetes의 Volume의 emptyDir, hostPath 개념과, PV/PVC 추상화 개념에 대해 알아보았습니다.
https://yubi5050.tistory.com/181
이번 글에서는 Kubernetes의 Service와 그 근간인 kube-proxy에 대해서 알아보려고 합니다.
Service란?
서비스란 Pod의 논리적 집합으로, 클러스터 외부/내부에서 Pod에 접근할 때 사용하는 리소스 타입 중 하나로, 재시작시마다 랜덤으로 IP가 지정되는 Pod의 고정 Endpoint 접근과, Loadbalcning 역할을 수행한다.
📌 Service의 특징
- 외부에서 클러스터 내의 여러개의 Pod에 접근할 수 있는 하나의 IP를 제공
- 들어오는 Traffic을 각 Pod로 포워딩 해주는 Proxy역할 (pod는 selector를 통해 결정)
- 들어오는 Traffic을 로드 밸런싱 하여 Pod의 분산하여 처리
- 클러스터 내에서 노드를 옮겨 다니며 동적으로 변하는 파드들에 고정적인 접근을 위한 방법
- 파드가 클러스터 안 다른 위치로 옮겨지더라도 해당 파드와 통신 가능
- Label Selectory를 통한 특정 Label을 가진 Pod 선택하여 서비스화
Service 타입
ClusterIP : Service의기본 타입으로 Cluster 내에서 해당 서비스 노출시 사용하는 방식
NodePort : 해당 서비스를 외부로 노출 시키고자 할 때 사용하는 방식
LoadBalancer : aws, gcp같은 클라우드 Loadbalancer를 이용하는 경우 사용 방식 (외부 IP 가진 로드밸런서 할당)
Service와 Kube-proxy
kube-proxy는 Service를 만들시, ClusterIP나 Nodeport로 접근할 수 있게 실제 조작을 하는 컴포넌트이다.
📌 Kube-proxy의 역할
쿠버네티스의 노드마다 실행되어 클러스터 내부 ip로 연결하려는 요청을 적절한 파드로 전달
- kube-proxy는 daemonset 형태로 존재하며, service 리소스 내부 구현을 담당
- endpoint 연결을 위한 iptables를 구성
- nodePort로의 접근과 Pod 연결을 구현 (iptables 구성)
- kube-proxy가 네트워크를 관리하는 모드로는 userspace, iptables, IPVS 3가지 방법 존재
📌 userspace 모드
- k8s 초기 버전에 사용됬던 방법
- 서비스 클러스터 IP요청 => iptables 거쳐 kube-proxy 전달 => 서비스 cluter ip가 적절한 파드연결
📌 iptables 모드
- kube-proxy가 iptables만 관리, 클라이언트 IP 요청 => iptables이 받아 적절한 파드에 직접 전달
- 직접전달로 요청 처리 성능이 좋으나, 연결요청 실패시 재시도 x (readneiss probe 헬스체크 결합하여 사용)
📌 IPVS 모드
- 기본적으로는 못쓰고 별도의 지원 모듈을 설정 후 사용 가능
- 커널 공간 동작 및 데이터 구조 해시 테이블로 저장
- 리눅스 커널에 있는 L4 로드 밸런싱 기술
- 로드 밸런싱 알고리즘 여러가지 제공 (round-robin, least connection dstination hashing 등)
즉 Kube Proxy는 Service에 대한 API 요청시 Iptables rule을 생성하고 Client로부터 요청을 수신 받는 역할 수행
마무리
이번 글에서는 Kuberenetes의 Service와 그 근간인 kube-proxy에 대해 알아보았습니다. 다음 글에서는 Kuberenetes의 kubectl 명령어에 대해 정리해보도록 하겠습니다.
참고 문헌
https://coffeewhale.com/k8s/network/2019/05/11/k8s-network-02/
'DevOps > Kubernetes' 카테고리의 다른 글
[K8S] k8s 정리 - (12) Kubernetes yaml 필드 정리 (0) | 2022.09.11 |
---|---|
[K8S] k8s 정리 - (11) Kubernetes 명령어 (kubectl) (0) | 2022.09.10 |
[K8S] k8s 정리 - (9) Kubernetes Volume (PV, PVC, emptyDir, hostPath) (0) | 2022.09.09 |
[K8S] k8s 정리 - (8) Kubernetes Pod (Container 구성, 리소스, 환경변수) (0) | 2022.09.09 |
[K8S] k8s 정리 - (7) Kubernetes Pod (Lifecycle, Probe, Handler) (0) | 2022.09.09 |