티스토리 뷰
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 범위를 지원하는지 확인해야함.
'쿠버네티스' 카테고리의 다른 글
[쿠버네티스] 9. 네트워크 5) Ingress (0) | 2024.12.13 |
---|---|
[쿠버네티스] 9. 네트워크 4) DNS (1) | 2024.12.13 |
[쿠버네티스] 9. 네트워크 2) CNI (0) | 2024.12.13 |
[쿠버네티스] 9. 네트워크 1) 쿠버네티스의 네트워크 기본 (0) | 2024.12.13 |
[쿠버네티스] 8. 스토리지 (4) | 2024.12.13 |