Kubernetes

Kubernetes Traffic

김 정출 2024. 10. 13. 20:20

Kubernetes Traffic

외부에서 Kubernetes 클러스터 내부의 Pod까지 트래픽이 도달하는 과정을 설명하면, 여러 네트워크 레이어와 Kubernetes 구성 요소들이 관여하게 됩니다.


1. DNS 또는 외부에서의 접근 (Ingress):

외부에서 Kubernetes 클러스터로 트래픽을 보내기 위한 첫 번째 단계는 클러스터를 외부에 노출하는 것입니다. 일반적으로 DNS 이름을 통해 외부 트래픽이 클러스터로 유입됩니다. 이 단계에서는 다음과 같은 옵션이 있을 수 있습니다:

  • Load Balancer (로드 밸런서): 클라우드 환경에서는 Kubernetes에서 제공하는 LoadBalancer 타입의 Service를 사용해 외부 로드 밸런서를 생성하고 외부 트래픽을 클러스터로 전달할 수 있습니다.
  • Ingress Controller: Ingress 리소스를 통해 외부 트래픽을 특정 서비스로 라우팅할 수 있습니다. Ingress는 HTTP(S) 트래픽에 대한 경로를 정의하며, NGINX Ingress Controller와 같은 Ingress Controller가 Ingress 리소스를 처리하고 트래픽을 적절한 서비스로 전달합니다.

2. Kubernetes Service:

외부에서 들어오는 트래픽은 보통 Service 리소스를 통해 Kubernetes 클러스터 내의 Pod에 전달됩니다. Kubernetes Service는 Pod를 추상화하여 여러 Pod의 집합을 한 지점에서 액세스할 수 있도록 해 줍니다.

  • NodePort: 이 서비스 타입은 클러스터의 각 노드에 지정된 고정 포트를 통해 외부에서 트래픽을 수신할 수 있도록 합니다. 외부 트래픽이 해당 포트로 들어오면, Kubernetes는 이를 내부 Pod로 라우팅합니다.
  • ClusterIP: 기본 서비스 타입으로, 클러스터 내부에서만 접근할 수 있는 가상 IP 주소를 제공합니다. 외부 트래픽이 ClusterIP 서비스로 직접 전달되지는 않지만, Ingress나 LoadBalancer가 ClusterIP로 트래픽을 전달할 수 있습니다.
  • LoadBalancer: 앞서 언급했듯이 클라우드 환경에서는 LoadBalancer 서비스를 통해 외부 트래픽을 자동으로 노드에 할당된 IP로 전달한 뒤, 이를 특정 Pod로 라우팅할 수 있습니다.

3. Service에서 Pod로의 트래픽 전달:

Kubernetes Service는 Pod로 트래픽을 전달할 때, kube-proxy가 중요한 역할을 합니다. kube-proxy는 각 노드에서 실행되는 네트워크 프록시로, 트래픽을 올바른 Pod로 라우팅합니다. 이 과정은 다음과 같이 동작합니다:

  • IPTables 모드: 대부분의 클러스터는 iptables를 사용하여 트래픽을 처리합니다. iptables 규칙은 서비스 IP와 연결된 Pod IP를 매핑하고, 이 규칙에 따라 트래픽을 적절한 Pod로 전달합니다.
  • IPVS 모드: 성능을 개선하기 위해 Kubernetes는 IPVS를 지원합니다. IPVS는 더 많은 트래픽을 효율적으로 처리할 수 있는 고성능 네트워크 라우팅 방법입니다.

이 단계에서는 서비스의 로드 밸런싱 방식에 따라 트래픽이 여러 Pod 중 하나로 라우팅됩니다. Service는 보통 Round Robin 방식이나 기타 로드 밸런싱 전략을 사용하여 트래픽을 고르게 분산합니다.

4. Pod 내부에서의 트래픽 처리:

트래픽이 Pod에 도달하면, Pod 내부의 컨테이너에서 이 트래픽을 처리합니다. Pod는 애플리케이션을 실행하는 단위로, 보통 애플리케이션은 지정된 포트를 열어 트래픽을 수신합니다.

  • 컨테이너 네트워크 인터페이스 (CNI): Kubernetes에서는 Pod들이 서로 통신하기 위해 네트워크 플러그인을 사용합니다. 플러그인에는 Calico, Flannel, Weave 등이 있으며, 이러한 CNI 플러그인이 각 Pod에 IP 주소를 할당하고, 네트워크를 통해 Pod 간 통신을 가능하게 합니다.

결론: 트래픽 흐름의 요약

  1. 외부 트래픽이 DNS 또는 로드 밸런서로 클러스터로 유입됩니다.
  2. 이 트래픽은 Ingress Controller 또는 Service를 통해 내부로 전달됩니다.
  3. kube-proxy가 네트워크 규칙에 따라 트래픽을 적절한 Pod로 라우팅합니다.
  4. 트래픽은 Pod 내부의 컨테이너로 전달되어 처리됩니다.

이 과정에서 중요한 개념은 Kubernetes가 추상화된 네트워크 레이어를 제공하여, 클러스터 내의 Pod들이 클러스터 외부와 안정적으로 통신할 수 있게 한다는 것입니다.