WEB BE Repository/kubernetes, k8s

[쿠버네티스 튜토리얼] 5. 쿠버네티스 네트워크 동작원리

조금씩 차근차근 2025. 12. 21. 00:39

쿠버네티스 네트워킹은 Pod 간 통신, 서비스 디스커버리, 외부 접근 등을 포함한다.
앞서 서비스, 인그레스 등을 다뤘지만, 이번에는 내부 네트워크 동작 원리에 초점을 맞춰 간략히 정리한다.

Pod간 통신 관점

Pod IP 및 통신

  • Kubernetes에서 각 Pod는 고유 IP를 갖는다 (Pods are given unique IPs).
  • 클러스터 내 모든 Pod는 하나의 가상 네트워크에 연결되어 있으며, IP를 통해 서로 직접 통신 가능하다.
    • (클러스터의 CNI 플러그인, k3s 기본은 Flannel VXLAN이 이를 구현)
  • 즉, Pod A에서 Pod B의 IP로 요청을 보내면, 노드 경계와 상관없이 네트워크 패킷이 전달된다. 이는 kube-proxy와 CNI가 협력하여 이루어진다.
  • 그러나 직접 Pod IP를 사용해 통신하는 것은 Pod 생멸이 빈번하기에 바람직하지 않고, 서비스를 통해 간접 통신하는 패턴이 일반적이다.

Service와 DNS 재관

  • Service를 만들면 clusterIP (가상IP)가 생성되고, DNS 이름도 할당된다.
  • 예를 들어 "my-service"라는 서비스가 "default" 네임스페이스에 있다면
    • DNS 이름: my-service.default.svc.cluster.local (간단히 my-service로도 조회 가능, Pod의 DNS search 설정에 의해).
    • 이 DNS 이름을 조회하면 clusterIP를 반환하고, 클러스터 내 kube-proxy가 해당 IP로 오는 트래픽을 실제 백엔드 Pod들로 전달한다 (iptables 또는 IPVS 사용).
  • 이렇게 서비스 디스커버리가 이루어져, Pod 수가 동적으로 변해도 클라이언트는 서비스 이름만으로 통신할 수 있다.

CoreDNS

  • k3s 클러스터에는 CoreDNS가 기본으로 설치되어, Service와 Pod의 DNS 엔트리를 관리한다.
  • CoreDNS는 Kubernetes API를 감시하여 새 서비스/Pod 발생 시 DNS 레코드를 추가하는 플러그인을 사용한다.
  • Pod가 조회 시 /etc/resolv.conf에 설정된 클러스터 DNS(CoreDNS 서비스 IP)를 통해 질의하고, CoreDNS가 적절히 응답한다.

외부 통신 (out)

  • 클러스터 내부 Pod가 인터넷 등 외부로 나갈 때는, 기본적으로 노드 IP를 통해 NAT되어 나가게 된다 (쿠버네티스 MASQUERADE 동작).
  • 특별한 네트워크 정책 없으면 Pod에서 curl google.com 같은 외부통신이 가능하며, 노드의 네트워크를 통해 나간다.

외부 통신 (in)

  • 외부에서 클러스터로 들어오는 통신은 앞서 본 NodePortLoadBalancer, Ingress 등을 통해서만 가능하다.
  • 기본적으로 클러스터 Pod 네트워크는 외부에서 접근 불가 (사설)이며, NodePort나 LoadBalancer Service가 노드 방화벽 규칙을 만들어 포트를 열어준다.
  • k3s ServiceLB는 LoadBalancer 서비스시 각 노드 hostPort 포워딩 Pod를 생성하여 동작한다.

    Network Policy

  • 쿠버네티스에서는 NetworkPolicy를 통해 Pod 간 트래픽을 제어할 수 있다.
  • 이는 쿠버네티스의 방화벽 규칙이라고 생각하면 된다.
  • 기본 설정에서는 모든 Pod 간 통신이 열려있지만, NetworkPolicy 리소스를 만들면 특정 Pod의 인바운드/아웃바운드 트래픽을 제한할 수 있다. (k3s는 kube-router netpol controller를 내장)

클러스터 아키텍처 관점

클러스터는 크게 다음과 같은 구성으로 분류한다

  • Control Plane
    • API server
    • scheduler
    • etcd
    • controller manager
  • Worker Node
    • kubelet
    • kube-proxy
    • container runtime
    • pods

k3s single-node에서는 모두 한 노드에 있지만, multi-node에서는 control plane와 nodes가 네트워크로 연결된다.

kube-proxy

각 노드에서 실행되며, Service의 clusterIP를 위한 iptables 규칙을 관리한다.
client가 clusterIP:port로 패킷을 보내면, kube-proxy가 endpoints 중 하나로 DNAT해준다. (SessionAffinity 등 고려)

CNI (Container Network Interface)

CNI는 Pod 네트워크 구현 모듈이다.
k3s default flannel은 overlay 네트워크로 각 Pod에 IP를 할당하고, 노드 간 VXLAN으로 패킷을 전달한다.

요약

Kubernetes 네트워킹의 기본은 flat Pod network서비스를 통한 서비스 디스커버리이다.

  • 모든 Pod는 (Policy 없으면) 서로 통신 가능하며, 서비스는 안정적인 이름과 가상 IP로 Pod들을 묶어주는 역할을 한다
  • DNS는 서비스와 Pod 이름 해석을 지원하여 사람이 읽기 좋은 이름으로 접근하게 해준다.
  • 외부 접근은 NodePort/LoadBalancer/Ingress로 제어되고, 보안적으로도 ClusterIP만 있는 서비스는 외부에 노출되지 않는다.

배운 개념

  • Pod Network(모든 Pod IP 통신), Service ClusterIP 동작
  • DNS 구성
  • Ingress Controller 역할 (L7)
  • NetworkPolicy로 통신 제어 가능함 등.