본문으로 건너뛰기

Kube-proxy


Pod 간 통신

  • Kubernetes에서 모든 Pod는 다른 모든 Pod에 도달할 수 있다.
  • 이는 클러스터에 배포된 Pod Networking Solution에 의해 가능하다.
    • Pod Network는 내부 가상 네트워크로, 모든 노드에 퍼져있어 모든 Pod를 연결한다.

예시

노드 A에 웹 애플리케이션 Pod, 노드 B에 데이터베이스 Pod가 실행 중일 경우:

  • 웹 애플리케이션 Pod는 DB Pod의 IP를 통해 직접 접근 가능하다.
  • 하지만 Pod의 IP는 변동될 수 있어, Service를 통해 접근하는 것이 안정적이다.

Service와 Kube-Proxy의 역할

Service

  • ServicePod와 달리 네트워크 인터페이스나 리슨 프로세스가 없는, Kubernetes 메모리에 존재하는 가상의 개념이다.
  • Service는 고정된 ClusterIP를 제공해 Pod들의 IP 변경에도 안정적으로 접근 가능하게 한다.

Kube-Proxy

  • kube-proxy는 각 노드에서 실행되는 프로세스이다.
  • 새로운 Service가 생성되면 이를 감지하고, 각 노드에 해당 Service트래픽을 전달할 규칙을 자동으로 생성한다.
  • 규칙 생성 방식 중 하나가 iptables 규칙이다.
    • 예: Service IP가 10.96.0.12, Pod IP가 10.32.0.15일 때
      → “목적지가 10.96.0.12라면 10.32.0.15로 포워딩” 규칙을 iptables에 추가.
  • 따라서 kube-proxyPod가 아닌 Service에 대한 실제 네트워크 트래픽 처리자 역할을 한다.

설치

Kubeadm Setup

설치

  • kubeadm으로 클러스터 설치 시 kube-proxyDaemonSet(Pod) 형태로 자동으로 설치된다.

설정 조회

kubectl get configmap kube-proxy -n kube-system -o yaml
  • kube-system 네임스페이스에 ConfigMap 객체로 설정이 저장되어 있다.
  • 설정을 바꾸고 싶다면 위 ConfigMap을 변경하고, kubectl rollout restart daemonset kube-proxy -n kube-system 으로 DaemonSet을 다시 실행해주어야 한다.

Manual Setup (Kubernetes The Hard Way)

설치

wget https://dl.k8s.io/v1.31.14/bin/linux/amd64/kube-proxy

sudo mv kube-scheduler /usr/local/bin/
sudo chmod +x /usr/local/bin/kube-proxy

sudo nano /etc/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Network Proxy
Documentation=https://kubernetes.io/docs/concepts/services-networking/service/
After=network.target

[Service]
ExecStart=/usr/local/bin/kube-proxy \
--config=/var/lib/kube-proxy/kube-proxy-config.yaml \
--v=2
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start kube-proxy
sudo systemctl enable kube-proxy
  • 위 명령어는 kube-proxy를 바이너리를 직접 다운로드하여 설치하는 명령어이다.
  • /usr/local/bin/ 으로 이동시켜 PATH에 등록한다.
  • 이에 시스템 전역 실행 파일로 사용가능한 것이다.

설정 조회

cat /etc/systemd/system/kube-proxy.service
  • systemd에 설치했기 때문에 위 경로에서 설정을 조회하고 수정할 수 있다.
  • 해당 파일을 수정한 뒤 아래 명령어 수행해야 적용된다.
    • sudo systemctl daemon-reload
    • sudo systemctl restart kube-proxy

레퍼런스