Kubernetes 컨테이너에 대한 네트워킹 개념

완료됨

Kubernetes는 컨테이너화된 워크로드의 배포, 크기 조정 및 관리를 자동화하기 위한 이식 가능한 확장 가능한 오픈 소스 플랫폼입니다. 오케스트레이션 플랫폼인 Kubernetes는 PaaS(Platform as a Service) 및 IaaS(Infrastructure as a Service) 제품과 같은 사용 편의성과 유연성을 제공합니다.

Important

Kubernetes 네트워킹을 구성하려면 가상 네트워크, 부하 분산 장치 및 역방향 프록시와 같은 개념을 이해해야 합니다.

클러스터 및 노드

Kubernetes는 클러스터를 기반으로 합니다. 단일 가상 머신이 있는 대신 하나의 노드로 작동하는 노드라는 여러 가상 머신을 사용합니다. Kubernetes는 주 노드와 하나 이상의 작업자 노드로 구성된 클러스터 아키텍처를 사용합니다. 주 노드는 API 서버, 스케줄러 및 컨트롤러 관리자와 같은 컨트롤 플레인 구성 요소를 실행합니다. 작업자 노드는 kubelet, kube-proxy 및 컨테이너 런타임과 같은 데이터 평면 구성 요소를 실행합니다.

Diagram showing how Kubernetes uses a cluster architecture that consists of a primary node and one or more worker nodes.

Kube-proxy 구성 요소는 로컬 클러스터 네트워킹을 담당하며 각 노드에서 실행됩니다. 이 구성 요소는 각 노드에 고유한 IP 주소가 있는지 확인합니다. 또한 IP 테이블 및 IP 가상 서버를 사용하여 트래픽의 라우팅 및 부하 분산을 처리하는 규칙을 구현합니다. 이 프록시는 DNS 서비스를 자체적으로 제공하지 않습니다. CoreDNS를 기반으로 하는 DNS 클러스터 추가 기능이 권장되며 기본적으로 설치됩니다.

Pod

Kubernetes Pod는 컨테이너 및 애플리케이션을 논리 구조로 그룹화합니다. 이러한 pod는 인텔리전스를 포함하지 않으며 하나 이상의 애플리케이션 컨테이너로 구성됩니다. 각 애플리케이션 컨테이너에는 IP 주소, 네트워크 규칙 및 노출된 포트가 있습니다.

Diagram showing how a Kubernetes pod groups containers and applications into a logical structure.

Kubernetes 배포는 Pod의 진화입니다. 배포는 Pod를 ‘스케일 아웃’할 수 있는 인텔리전트 개체로 래핑합니다. 복잡한 네트워킹 규칙을 구성할 필요 없이 더 많은 로드를 지원하도록 애플리케이션을 쉽게 복제하고 스케일링할 수 있습니다.

추상화 계층 리소스

애플리케이션에 대한 액세스 또는 애플리케이션 구성 요소 간의 액세스를 허용하기 위해 Kubernetes는 가상 네트워킹에 추상화 계층을 제공합니다. Kubernetes 노드는 Pod에 대한 인바운드 및 아웃바운드 연결을 제공하는 가상 네트워크에 연결됩니다. kube-proxy 구성 요소는 각 노드에서 실행되어 이러한 네트워크 기능을 제공합니다.

Kubernetes에서:

  • 서비스는 IP 주소 또는 DNS 이름을 통해 특정 포트에 직접 액세스할 수 있도록 논리적으로 Pod를 그룹화합니다.
  • ServiceTypes를 사용하면 원하는 서비스 형식을 지정할 수 있습니다.
  • 부하 분산 장치를 사용하여 트래픽을 분산할 수 있습니다.
  • 또한 수신 컨트롤러를 사용하여 애플리케이션 트래픽의 계층 7 라우팅을 달성할 수 있습니다.
  • 클러스터 노드에 대한 아웃바운드(송신) 트래픽을 제어할 수 있습니다.
  • 네트워크 정책을 사용하면 Pod에 대한 네트워크 트래픽의 보안 및 필터링이 가능합니다.

Kubernetes의 네트워크

Kubernetes에는 클러스터에 대한 네트워킹을 구현하는 방법에 대한 특정 요구 사항이 있습니다. 구성 선택은 클러스터 네트워크에 앱을 노출하는 방법과 데이터를 저장하는 방법에 대한 옵션에 영향을 줍니다. 통신을 간소화하기 위해 Kubernetes는 사용자가 다음 방법으로 네트워킹을 구성하는 것을 권장합니다.

  • Pod는 NAT(Network Address Translation)를 사용하지 않고 여러 노드를 통해 서로 통신할 수 있습니다.
  • 노드와 Pod는 NAT 없이 서로 통신할 수 있습니다.
  • 노드의 에이전트는 모든 노드 및 Pod를 통해 통신할 수 있습니다.

컨테이너의 구성과 데이터는 여러 실행 간에 지속되지 않습니다. 컨테이너를 삭제한 후 컨테이너가 볼륨을 사용하도록 구성되지 않은 한 모든 정보가 사라집니다. 컨테이너의 네트워크 구성 및 컨테이너에 할당된 모든 IP 주소의 경우도 동일합니다.

배포는 Pod의 논리적 그룹화입니다. 실제 워크로드로 간주하지 않으며 IP 주소가 할당되지 않습니다. 각 Pod에는 IP 주소가 자동으로 할당되며 Pod가 제거되면 손실됩니다. 이 동작으로 인해 수동 네트워크 구성 전략이 복잡해집니다.

Windows 컨테이너에 대한 Kubernetes 네트워킹 옵션

Windows 컨테이너를 사용하여 Kubernetes를 배포하는 경우 두 가지 네트워킹 옵션인 서비스수신 컨트롤러가 있습니다. 이러한 옵션을 사용하기 위해 Windows는 CNI(Container Network Interface) 플러그 인에 따라 달라집니다.

애플리케이션 워크로드에 대한 네트워크 구성을 간소화하기 위해 Kubernetes에서는 서비스를 사용해 Pod 집합을 논리적으로 함께 그룹화하고 네트워크 연결을 제공합니다. 서비스는 Pod 그룹의 진입점으로 작동하며 고정 IP 주소를 제공합니다. 트래픽은 그룹에 대한 서비스에 도착하고 Pod에 라운드 로빈 패턴으로 배포됩니다. 시간이 지남에 따라 Pod에 대한 IP 주소가 변경됨에 따라 서비스는 변경 내용을 추적하여 Pod에 대한 네트워크 트래픽의 올바른 흐름을 보장합니다.

Kubernetes에서 실행되는 컨테이너화된 애플리케이션은 인터넷을 통해 데이터를 보내고 받아야 합니다. Kubernetes는 수신 및 송신 구성 요소를 통해 이 통신을 지원합니다. 수신 컨트롤러는 서비스에 연결할 수 있는 트래픽 및 원본을 지정합니다. 송신 컨트롤러를 사용하면 인터넷 게이트웨이를 통해 외부 엔터티에 앱을 연결할 수 있습니다.

CNI 플러그 인을 사용하면 Kubernetes가 컨테이너 네트워킹에 서로 다른 네트워크 인터페이스를 사용할 수 있습니다. 플러그 인은 Pod를 네트워크에 연결하고 Pod IP 주소를 할당합니다. HNS(Windows 호스트 네트워킹 서비스) 및 HCS(호스트 컴퓨팅 서비스)와 상호 작용하여 Windows 컨테이너에 대한 네트워크 리소스를 만들고 관리합니다. 플러그 인의 몇 가지 예로는 Calico, Flannel 및 Azure CNI가 있습니다.

Kubernetes ServiceTypes

원하는 서비스를 구성하려면 다음 Kubernetes ServiceTypes 중 하나를 지정할 수 있습니다.

  • ClusterIP 는 클러스터 내에서 사용할 내부 IP 주소를 만듭니다. 이 서비스는 클러스터 내의 다른 워크로드를 지원하는 내부 전용 애플리케이션에 적합합니다. 서비스에 대한 형식을 명시적으로 지정하지 않는 경우 사용되는 기본값입니다.

Diagram showing how ClusterIP creates an internal IP address for use within the cluster.

  • NodePort 는 노드 IP 주소 및 포트를 사용하여 애플리케이션에 직접 액세스할 수 있도록 기본 노드에 포트 매핑을 만듭니다.

Diagram showing how NodePort creates a port mapping on the underlying node that allows the application to be accessed directly with the node IP address and port.

  • LoadBalancer 는 부하 분산 장치 리소스를 만들고, 외부 IP 주소를 구성하고, 요청된 Pod를 부하 분산 장치 백 엔드 풀에 연결합니다. 고객의 트래픽이 애플리케이션에 도달할 수 있도록 하기 위해 원하는 포트에 부하 분산 규칙을 만듭니다.

Diagram showing how LoadBalancer creates a load balancer resource, configures an external IP address, and connects the requested pods to the load balancer backend pool.

인바운드 트래픽의 HTTP/S 부하 분산의 경우 또 다른 옵션은 수신 컨트롤러를 사용하는 것입니다.

  • ExternalName은 애플리케이션 액세스가 용이할 수 있도록 특정 DNS 항목을 만듭니다.

Kubernetes 수신

Kubernetes 수신 구성 요소는 클러스터 외부에서 클러스터 내의 서비스로 HTTP 및 HTTPS 트래픽에 대한 경로를 노출합니다. 수신 경로는 ‘수신 규칙’을 사용하여 정의합니다. Kubernetes 클러스터는 해당 경로를 정의하지 않고 들어오는 모든 트래픽을 거부합니다.

Diagram showing how the Kubernetes ingress component exposes routes for HTTP and HTTPS traffic from outside a cluster to services inside the cluster.

수신 컨트롤러

수신 컨트롤러는 Kubernetes 서비스에 대해 구성 가능한 트래픽 라우팅을 제공하는 소프트웨어의 한 조각입니다. Kubernetes 수신 리소스는 개별 Kubernetes 서비스에 대한 수신 규칙 및 라우팅을 구성하는 데 사용됩니다. 수신 컨트롤러 및 수신 규칙을 사용하면 단일 IP 주소를 사용하여 Kubernetes 클러스터의 여러 서비스에 트래픽을 라우팅할 수 있습니다. 사용자 환경에서 컨트롤러를 배포한 후 수신 매니페스트를 만들고 배포할 수 있습니다. Kubernetes는 수신 컨트롤러를 사용하여 클러스터의 수신 구성을 관리하고 몇 가지 기능을 제공합니다.

수신 규칙

수신 규칙은 트래픽이 발생한 위치 및 클러스터 내에서 트래픽을 보낼 위치를 정의합니다. 수신 배포 매니페스트 파일에서 수신 규칙을 정의합니다. 이러한 규칙은 매니페스트 파일의 규칙 키에 정의됩니다. 각 규칙은 규칙을 설명하는 값 집합입니다.

수신 주석

주석을 사용하면 워크로드의 수신 구성과 같은 비식별 메타데이터를 연결할 수 있습니다. 주석은 리소스의 특정 구성을 정의하는 내부 레이블이라고 생각할 수 있습니다. 예를 들어 이름 다시 쓰기 또는 페이로드 제한을 지원하는 특정 수신 컨트롤러를 사용하는 것이 좋습니다.

네트워크 정책

Kubernetes는 Pod 간의 트래픽 흐름을 제어하는 네트워크 정책 기능을 제공합니다. 할당된 레이블, 네임스페이스 및 트래픽 포트에 대한 설정에 따라 트래픽을 허용하거나 거부할 수 있습니다. 네트워크 정책은 Kubernetes Pod에서 트래픽을 제어하는 데 이상적인 클라우드 네이티브 접근 방식을 제공합니다.