티스토리 뷰

1. 쿠버네티스 서비스란?

1) 서비스의 정의

- 쿠버네티스에서 Pod를 안정적으로 접근할 수 있는 네트워크 엔드포인트를 제공

- Pod는 동적으로 생성되고 삭제되므로, 서비스는 고정된 IP주소와 DNS이름을 제공하여 클라이언트가 Pod에 안정적으로 접근  

2) 유형

(1)ClusterIP

- 기본 서비스유형

- 클러스터 내부에서만 접근 가능

- Pod 간 통신에 사용

- DB 와 같은 내부 애플리케이션에서 사용 

(2) NodePort

- 클러스터 외부에서 접근 가능하도록 노드의 고정포트를 노출

- <NodeIP>:<NodePort> 형식으로 접근

- 웹서버와 같은 외부 어플리케이션에서 사용

(3) LoadBalancer 

- 로드밸런서를 통해 외부 트래픽을 서비스로 라우팅

- 클라우드 제공자와 연동이 가능

- NodePort와 ClusterIP를 기반으로 동작하며, 클라우드 환경에서도 사용 가능하다. 

(4) ExternalName

- 외부 DNS 이름과 서비스를 매핑

- 클러스터 외부의 리소스에 접근할 때 사용 

3) 서비스 네트워킹 작동 방식 

(1) 서비스 IP 할당 

- Kubernetes API서버는 --service-cluster-ip-range로 정의된 CIDR범위에서 서비스 IP를 할당 

ex) --service-cluster-ip-range=10.96.0.0/12 => 할당 IP 10.103.132.104

- 할당된 IP 주소는 클러스터 내 모든 노드에서 접근 가능하며, kube-proxy가 이를 관리

(2) Pod to Service 통신 

- Pod는 서비스를 통해 다른 Pod에 접근

- kube-proxy는 트래픽을 받아서 적절한 Pod로 전달

2. kube-proxy

1) 정의

- kube-proxy: 각 노드에서 실행되며, Kubernetes API 서버를 모니터링하여 서비스 및 엔드포인트 변경 사항을 감지 

- 감지된 정보를 기반으로 네트워크 규칙(iptables 등)을 설정하여 트래픽을 라우팅 

2) 역할

- Kubernetes API 서버로부터 서비스와 엔드포인트(backend Pod) 정보를 가져옴.

- 해당 정보를 기반으로 네트워크 트래픽을 적절한 Pod로 라우팅하기 위한 규칙을 설정 

3) 작동방식

(1) 서비스 생성 시

- 사용자 kubernetes 서비스 생성 시, API 서버는 서비스에 대한 정보 저장 

- 각 노드에서 실행 중인 kube-proxy는 API 서버로부터 새로운 서비스와 엔드포인트 정보를 감지

- kube-proxy는 iptables또는 IPVS를 사용하여 트래픽 라우팅 규칙을 생성(ClusterIP 서비스의 IP와 포트를 backend Pod의 IP와 포트로 매핑)

(2) 서비스 삭제 시 

- 사용자가 서비스를 삭제하면 API 서버는 해당정보를 업데이트

- kube-proxy가 감지하여, 관련 iptable또는 IPVS 규칙 삭제

4) iptables를 통한 트래픽 라우팅 

(1) iptables 규칙 생성 

- kube-proxy는 기본적으로 iptables를 사용하여 NAT 테이블에 DNAT규칙을 추가 

- ex) Cluster 서비스 IP가 Destination으로 등록된 패킷을 Pod IP 도착지로 바꾸어 패킷을 Pod로 보낸다. 

- ex) NodeIP로 들어온 패킷을 적절한 Pod IP 도착지로 전송

(2) iptables 규칙 확인

sudo iptables -t nat -L

5) kube-proxy의 모드

(1) iptables: 기본 모드로, iptables를 사용하여 NAT 테이블에 규칙을 추가

(2) ipvs: 고성능 네트워크 환경에서 사용되며 linux ipvs를 활용하여 로드밸런싱을 수행 

(3) userspace: 구식 방식으로 각 서비스에 대해 사용자 공간에서 포트를 열고 트래픽을 수동으로 프록시 처리 

6) kube-proxy 로그 확인

kubectl logs <kube-proxy-pod-name> -n kube-system

cat /var/log/kube-proxy.log

3. CIDR 범위 설정 

1) Pod CIDR 

- 각 Pod는 --pod-network-cidr에 설정된 범위 내에서 고유한 IP 주소를 할당받는다. 

(1) Pod Cidr 설정 방법  

## 쿠버네티스 클러스터 생성할 때, kubeadm 명령어에서 옵션으로 설정 가능 
kubeadm init --pod-network-cidr=10.244.0.0/16

(2) 확인 방법

## API 서버에서 설정 확인 가능
ps aux | grep kube-apiserver

출력 예시 
....
--pod-network-cidr=10.244.0.0/16
....

2) cluster 서비스 CIDR

- 쿠버네티스 서비스에 할당될 주소 IP 범위로, Cluster 서비스는 이 범위 내에서 IP를 할당 받는다.

(1) 클러스터 서비스 설정 

kubeadm init --service-cluster-ip-range=10.96.0.0/12

(2) 확인방법

kubeadm init --service-cluster-ip-range=10.96.0.0/12

#출력예시
....
--service-cluster-ip-range=10.96.0.0/12
....

3) 환경설정 파일

- /etc/kubernetes/manifests/kube-apiserver.yaml 파일에서 클러스터 ip와 Pod ip CIDR를 설정할 수 있다. 

4) 주의사항

(1) Pod CIDR와 Service CIDR 중복 불가

(2) 클러스터 초기화 후 변경 불가

- CIDR는 클러스터 초기화 시 설정해야한다. 변경하려면 클러스터를 다시 구성해야 한다.

(3) 네트워크 플러그인 호환성

- 사용 중인 CNI 플러그인이 지정된 CIDR 범위를 지원하는지 확인해야함. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함