kubernetes network
Kubernetes의 네트워크는 클러스터 내에서 실행되는 **파드(Pod)**와 서비스(Service) 간의 통신을 원활하게 하기 위해 설계된 복잡하고 유연한 시스템입니다. Kubernetes는 기본적으로 분산 네트워킹을 지원하며, 모든 파드가 서로 통신할 수 있고, 필요할 경우 외부 트래픽도 처리할 수 있습니다.
Kubernetes 네트워크 모델은 단순하고 강력한 원칙을 기반으로 하지만, 실제 구성은 다양한 CNI(Container Network Interface) 플러그인과 네트워킹 구성 요소를 통해 구현됩니다. 이를 통해 클러스터 내부 및 외부 네트워크 연결이 원활하게 이루어지며, 트래픽 처리, 보안, 서비스 디스커버리 등 다양한 기능이 제공됩니다.
Kubernetes 네트워크의 주요 구성 요소
1. Kubernetes 네트워크 모델의 기본 원칙
Kubernetes의 네트워크 모델은 몇 가지 중요한 기본 원칙을 기반으로 합니다:
모든 파드는 모든 다른 파드와 통신할 수 있어야 한다 (IP 주소를 통해 직접).
노드(Node)의 IP 주소는 모든 파드와 통신할 수 있어야 한다.
파드가 실행되는 컨테이너는 동일한 네트워크 네임스페이스를 공유하며, 컨테이너 간 로컬 네트워크 통신은 localhost로 가능하다.
이러한 원칙을 기반으로, Kubernetes는 각 파드에 고유한 IP 주소를 할당하며, 네트워크 계층에서 이 IP를 통해 파드 간 직접 통신이 가능하게 합니다.
2. 파드(Pod) 네트워킹
파드는 Kubernetes의 최소 실행 단위로, 각각의 파드에는 고유한 IP 주소가 할당됩니다. 이 IP 주소는 파드가 클러스터 내 다른 파드와 직접 통신할 수 있도록 하는 핵심 요소입니다.
파드 IP: 각 파드는 자신의 고유 IP를 가지고 있으며, 이는 클러스터 내에서 고유합니다. 파드가 실행 중일 때 이 IP를 사용하여 다른 파드나 서비스와 통신할 수 있습니다.
파드 간 통신: Kubernetes 네트워크 모델에서는 별도의 네트워크 주소 변환 없이, 파드들이 클러스터 내에서 직접 통신할 수 있습니다. 이는 Kubernetes가 자동으로 네트워크 경로를 설정하고 관리하기 때문입니다.
파드가 삭제되거나 재시작되면 새로운 IP가 할당되므로, 고정된 IP가 필요한 경우에는 서비스(Service)와 같은 Kubernetes 리소스를 활용하여 해결합니다.
3. Service(서비스)
Kubernetes에서 **서비스(Service)**는 파드의 네트워크 엔드포인트를 정의하는 추상화된 객체로, 클러스터 내부 및 외부에서 파드에 접근할 수 있는 고정된 네트워크 엔드포인트를 제공합니다. 서비스는 파드의 IP가 변동될 때도 안정적인 통신을 가능하게 해줍니다.
ClusterIP: 클러스터 내부에서만 접근할 수 있는 IP 주소를 서비스에 부여합니다. 주로 클러스터 내부 파드 간 통신에 사용됩니다.
NodePort: 클러스터 외부에서 노드의 IP와 특정 포트를 통해 서비스에 접근할 수 있도록 합니다. 외부 트래픽이 노드로 라우팅될 수 있게 해줍니다.
LoadBalancer: 클라우드 환경에서 로드 밸런서를 생성하여 외부 트래픽을 적절한 파드로 분산시킵니다. 주로 AWS, GCP, Azure와 같은 클라우드 환경에서 사용됩니다.
Headless Service: DNS 기반의 직접적인 파드 통신을 가능하게 하며, StatefulSets와 같은 상태 저장 애플리케이션에 유용합니다.
서비스는 파드가 주기적으로 생성되고 소멸되는 상황에서도 일정한 엔드포인트로 트래픽을 전달할 수 있게 해줍니다.
4. kube-proxy
kube-proxy는 Kubernetes 클러스터 내에서 서비스와 파드 간의 네트워크 트래픽을 처리하는 네트워크 프록시입니다. 각 노드에서 실행되며, Kubernetes 서비스가 정의한 네트워크 규칙을 적용하여 트래픽이 올바른 파드로 라우팅되도록 합니다.
네트워크 규칙 설정: kube-proxy는 iptables, IPVS와 같은 네트워크 도구를 사용하여 네트워크 규칙을 설정하고, 클러스터 내 트래픽을 적절한 파드로 전달합니다.
로드 밸런싱: 다수의 파드가 연결된 서비스로 들어오는 트래픽을 분산시키는 역할을 합니다. 예를 들어, 동일한 서비스에 여러 파드가 연결된 경우, kube-proxy는 각 파드로 트래픽을 균등하게 분산시킵니다.
kube-proxy는 클러스터 내부에서 트래픽을 처리하고, 외부 네트워크에서 들어오는 트래픽을 노드로 전달하는 데 중요한 역할을 합니다.
5. Cluster Networking과 CNI(Container Network Interface)
Kubernetes 네트워킹은 플러그인 기반으로 동작하며, 이를 위해 **CNI(Container Network Interface)**라는 표준 인터페이스를 사용합니다. CNI는 Kubernetes에서 파드에 네트워크를 연결하고 관리하는 표준을 정의하며, 다양한 네트워크 플러그인을 지원합니다.
CNI 플러그인: Kubernetes에서 사용하는 네트워크 플러그인은 CNI 표준을 따릅니다. 대표적인 CNI 플러그인에는 Calico, Flannel, Weave, Cilium 등이 있습니다.
역할: 각 CNI 플러그인은 파드에 IP 주소를 할당하고, 파드 간 통신을 가능하게 하며, 클러스터 내에서 발생하는 네트워크 트래픽을 관리합니다.
네트워크 정책: 일부 CNI 플러그인은 네트워크 정책을 지원하여, 클러스터 내에서 특정 트래픽을 허용하거나 차단할 수 있습니다. 이를 통해 파드 간의 네트워크 보안을 강화할 수 있습니다.
CNI는 Kubernetes 네트워킹의 유연성과 확장성을 제공하며, 다양한 클라우드 환경이나 데이터센터에서 Kubernetes를 배포할 때 맞춤형 네트워킹을 설정할 수 있습니다.
6. 네트워크 정책 (Network Policy)
Kubernetes에서는 **네트워크 정책(Network Policy)**을 사용하여 파드 간 트래픽 제어를 할 수 있습니다. 네트워크 정책은 파드 간의 트래픽을 허용하거나 차단할 수 있으며, 이를 통해 보안 강화가 가능합니다.
역할: 네트워크 정책은 특정 파드 또는 서비스가 다른 파드나 네트워크 엔드포인트로 접근할 수 있는지를 정의합니다. 이로 인해 클러스터 내부에서 세분화된 트래픽 제어가 가능합니다.
기능:
Ingress 트래픽 제어: 특정 파드로 들어오는 트래픽을 제어.
Egress 트래픽 제어: 특정 파드에서 나가는 트래픽을 제어.
네트워크 정책은 클러스터에서 보안이 중요한 애플리케이션을 실행할 때 필수적인 역할을 하며, 이를 통해 공격 표면을 최소화하고 파드 간 불필요한 통신을 차단할 수 있습니다.
7. DNS
Kubernetes에서는 각 서비스와 파드가 DNS를 통해 서로를 쉽게 찾을 수 있도록 내부 DNS 서버를 제공합니다. Kubernetes의 DNS는 클러스터 내부에서 서비스와 파드를 이름 기반으로 쉽게 조회할 수 있게 해주며, 파드의 IP가 변경되더라도 안정적인 이름을 통해 접근이 가능합니다.
Service DNS: 각 서비스에는 고유한 DNS 이름이 있으며, 이를 통해 클러스터 내의 다른 파드가 해당 서비스에 접근할 수 있습니다.
파드 DNS: 파드가 네임스페이스 내에서 이름 기반으로 다른 파드나 서비스를 찾을 수 있습니다.
DNS는 클러스터 내부에서 서비스 디스커버리 기능을 제공하며, 애플리케이션이 동적으로 변하는 환경에서도 네트워크 연결을 유지할 수 있게 해줍니다.
8. 외부 트래픽 처리 (Ingress)
Ingress는 클러스터 외부에서 들어오는 트래픽을 Kubernetes 클러스터 내부의 특정 서비스로 라우팅하는 리소스입니다. Ingress는 L7 레벨에서 HTTP/HTTPS 트래픽을 처리하며, 외부 사용자에게 클러스터 내 애플리케이션을 노출하는 데 사용됩니다.
역할: Ingress는 도메인 기반 라우팅, SSL 종료(HTTPS), 로드 밸런싱과 같은 기능을 제공하며, 외부 트래픽을 적절한 서비스로 전달합니다.
**
Last updated