2025. 1. 15. 00:08ㆍ쿠버네티스/쿠버네티스
1. None 네트워크
- 특징: 컨테이너가 네트워크에 연결되지 않으며, 외부 세계와 완전히 격리됩니다.
- 동작: 컨테이너 내부에는 루프백 인터페이스(lo)만 생성되며, IP 주소가 할당되지 않습니다. 따라서 외부 네트워크로의 접속이나 다른 컨테이너와의 통신이 불가능합니다.
- 사용 사례: 네트워크 연결이 필요 없는 배치 작업(batch job)이나 보안이 중요한 환경에서 사용됩니다.
- 예시 명령어:
docker run --network none ubuntu
https://learning-ocean.com/tutorials/docker/docker-docker-none-network/
Docker - Docker None Network - Learning-Ocean
Docker Networking (Null Network, None Network) none network in docker means when you don\'t want any network interface for
learning-ocean.com
https://docs.docker.com/engine/network/drivers/none/
None network driver
How to isolate the networking stack of a container using the none driver
docs.docker.com
2. Host 네트워크
- 특징: 컨테이너가 호스트의 네트워크 스택을 공유하며, 별도의 네트워크 격리가 없습니다.
- 동작:
- 컨테이너는 호스트와 동일한 IP 주소를 사용하며, 포트 매핑(port mapping)이 필요하지 않습니다.
- 동일한 포트를 사용하는 여러 컨테이너를 실행할 수 없으므로 포트 충돌 문제가 발생할 수 있습니다.
- 사용 사례: 높은 성능이 요구되거나, 호스트 네트워크에 직접 접근해야 하는 애플리케이션(예: 모니터링 도구)에서 사용됩니다.
- 예시 명령어:
docker run --network host nginx
https://www.geeksforgeeks.org/what-is-docker-network-host/
What Is Docker Network Host ? - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
https://docs.docker.com/engine/network/drivers/host/
Host network driver
All about exposing containers on the Docker host's network
docs.docker.com
3. Bridge 네트워크
- 특징: 도커가 기본적으로 제공하는 네트워크 모드로, 소프트웨어 브리지를 통해 컨테이너 간 통신을 지원합니다.
- 동작:
- 각 컨테이너는 독립적인 IP 주소를 할당받으며, 기본적으로 172.17.0.0/16 서브넷을 사용합니다.
- NAT(Network Address Translation)를 통해 외부 인터넷과 통신할 수 있습니다.
- 다른 브리지 네트워크에 연결된 컨테이너와는 격리됩니다.
- 사용 사례: 개발 및 테스트 환경에서 로컬 컨테이너 간 통신을 설정할 때 유용합니다.
- 예시 명령어:
docker run --network bridge nginx
https://docs.docker.com/engine/network/drivers/bridge/
Bridge network driver
All about using user-defined bridge networks and the default bridge
docs.docker.com
https://www.geeksforgeeks.org/what-is-docker-network-bridge/
What is Docker Network Bridge? - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
포트 매핑 (Port Mapping)
컨테이너 내부 애플리케이션에 외부에서 접근하려면 포트를 매핑해야 합니다.
동작 방식
- 도커는 iptables를 사용하여 NAT 규칙을 생성합니다.
- 호스트의 특정 포트를 컨테이너 내부 포트로 전달합니다.
예시
docker run -p 8080:80 nginx
https://iximiuz.com/en/posts/docker-publish-container-ports/
What Actually Happens When You Publish a Container Port
Have you ever wondered what actually happens when you ask Docker to publish a port? How port publishing implementation differs between Docker Engine and Docker Desktop? How to publish a port with containerd? How nerdctl and Lima implement port forwarding?
iximiuz.com
도커(Docker)는 리눅스의 iptables를 활용하여 네트워크 격리, 포트 매핑(port mapping), 그리고 NAT(Network Address Translation)와 같은 네트워킹 기능을 제공합니다. 아래는 도커와 관련된 iptables 설정 및 명령어에 대한 설명입니다.
1. iptables와 도커의 관계
- 도커는 컨테이너 네트워킹을 위해 자동으로 iptables 규칙을 생성합니다.
- 주요 체인:
- DOCKER: 도커가 생성한 기본 체인으로, 포트 매핑 및 NAT 규칙이 포함됩니다.
- DOCKER-USER: 사용자가 커스텀 규칙을 추가할 수 있는 체인입니다. 이 체인은 DOCKER 체인보다 먼저 실행됩니다
2. 기본 iptables 체인과 규칙
- 도커가 생성하는 주요 iptables 규칙은 다음과 같습니다:
(1) NAT 테이블
-
- NAT 테이블은 네트워크 주소 변환(Network Address Translation)을 처리합니다.
- 주요 규칙:
# PREROUTING 체인: 외부에서 들어오는 패킷을 컨테이너로 전달
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
# POSTROUTING 체인: 컨테이너에서 나가는 패킷의 출발지 주소를 호스트 주소로 변환
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
(2) FORWARD 체인
- 컨테이너 간 통신 또는 외부 네트워크와의 통신을 허용합니다.
- 주요 규칙
# 컨테이너 간 트래픽 허용
-A FORWARD -i docker0 -o docker0 -j ACCEPT
# 외부에서 컨테이너로 들어오는 트래픽 허용
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 컨테이너에서 외부로 나가는 트래픽 허용
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
3. 포트 매핑과 iptables
도커는 -p 플래그를 사용하여 호스트와 컨테이너 간 포트를 매핑합니다. 예를 들어, docker run -p 8080:80 명령어는 호스트의 포트 8080을 컨테이너의 포트 80에 연결합니다.
iptables에서의 동작
포트 매핑은 NAT 테이블의 PREROUTING 및 DOCKER 체인을 통해 구현됩니다:
# PREROUTING: 외부에서 들어오는 트래픽을 컨테이너로 전달
-A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
# POSTROUTING: 컨테이너에서 나가는 트래픽의 출발지 주소를 호스트 주소로 변환
-A POSTROUTING -s 172.17.0.2/32 ! -o docker0 -j MASQUERADE
위 규칙은 다음과 같은 동작을 수행합니다:
- 외부에서 호스트의 8080 포트로 들어온 요청은 컨테이너의 내부 IP(172.17.0.2)와 포트(80)로 전달됩니다.
- 컨테이너에서 나가는 트래픽은 호스트 IP를 사용하여 외부 네트워크와 통신합니다
4. 사용자 정의 iptables 규칙 추가
사용자는 DOCKER-USER 체인을 활용하여 커스텀 방화벽 규칙을 추가할 수 있습니다.
예제: 특정 IP만 허용
다음 명령어는 특정 IP(192.168.1.1)만 도커 컨테이너에 접근할 수 있도록 설정합니다:
# 특정 IP만 허용하고 나머지는 차단
iptables -I DOCKER-USER -i eth0 ! -s 192.168.1.1 -j DROP
예제: 특정 포트 차단
호스트의 특정 포트를 차단하려면 다음과 같이 설정합니다:
# TCP 포트 8080 차단
iptables -I DOCKER-USER -p tcp --dport 8080 -j DROP
5. iptables 규칙 확인 및 관리
규칙 확인
현재 설정된 iptables 규칙을 확인하려면 다음 명령어를 사용합니다:
sudo iptables -t nat -L # NAT 테이블 확인
sudo iptables -L # 필터 테이블 확인
https://docker-docs.uclv.cu/network/iptables/
Packet filtering and firewalls
How Docker works with packet filtering, iptables, and firewalls
docs.docker.com
https://dustinspecker.com/posts/iptables-how-docker-publishes-ports/
iptables: How Docker Publishes Ports
The next question to answer after writing How do Kubernetes and Docker create IP Addresses?! is “How does Docker handle publishing ports?” In the previous post, we created our own network namespaces, virtual interfaces, and assigned IP addresses to the
dustinspecker.com
https://blog.ipspace.net/kb/DockerSvc/30-nat-iptables/
Docker Implementation of Published Ports « ipSpace.net blog
The default single-host Docker networking implementation uses iptables NAT table to implement published ports (Docker Swarm uses a load balancer on every swarm member), and in this part of the article we’ll decode the intricate setup it has to use to get
blog.ipspace.net
https://www.endpointdev.com/blog/2024/06/docker-and-iptables/
Docker and iptables | End Point Dev
Introduction on how to use iptables to block access to Docker containers.
www.endpointdev.com
https://docker-docs.uclv.cu/network/iptables/
Packet filtering and firewalls
How Docker works with packet filtering, iptables, and firewalls
docs.docker.com
How to configure docker networking with docker-compose to enable remote access to docker container via IP?
This question seems to be quite common but I’ve never found a satisfactory answer to it. In addition w.r.t. setting up the network with docker-compose instead of plain docker there is additional confusion e.g. cause of Support IPAM gateway in version 3.x
forums.docker.com
https://inspirit941.tistory.com/415
CKA 대비 kubernetes 스터디 - 8. Networking (1)
알아둬야 할 Linux Networking Prerequisite 내용. Basics : Linux Networking A가 B에게 통신하려면? Switch에 연결한다. -> switch는 두 개의 시스템을 연결하는 네트워크를 생성한다. switch에 연결하기 위해서는, 각
inspirit941.tistory.com
https://dev-chicken.tistory.com/66#google_vignette
https://www.cncf.co.kr/community/container-network-interface/
**CNI(Container Network Interface)**는 컨테이너 환경에서 네트워크를 구성하고 관리하기 위한 표준 인터페이스입니다. 이는 다양한 컨테이너 런타임(예: Kubernetes, Mesos 등)과 네트워크 플러그인 간의 상호작용을 표준화하여 컨테이너 네트워킹의 복잡성을 줄이고 유연성을 제공합니다.
CNI의 주요 개념
1. 표준화된 인터페이스
- CNI는 컨테이너 런타임과 네트워크 플러그인이 통합될 수 있도록 명확한 사양을 정의합니다.
- 이를 통해 컨테이너 생성 시 네트워크 연결, 삭제 시 네트워크 리소스 해제 등의 작업을 자동화합니다
2. 유연성과 확장성
- CNI는 플러그인 기반 아키텍처를 채택하여 다양한 네트워크 요구사항에 맞게 확장 가능합니다.
- JSON 형식의 설정 파일을 사용해 네트워크 구성을 정의하고 관리합니다
3. 경량 아키텍처
- CNI는 간단하고 효율적인 설계를 통해 빠르고 유연한 네트워크 구성을 지원하며, 불필요한 복잡성을 줄입니다
CNI의 동작 방식
컨테이너 런타임의 역할
- 각 컨테이너에 대해 네트워크 네임스페이스(Network Namespace)를 생성합니다.
- 컨테이너가 연결해야 할 네트워크를 식별합니다.
- CNI 플러그인을 호출해 ADD 명령으로 네트워크를 설정하고, 컨테이너 삭제 시 DEL 명령으로 정리합니다.
플러그인의 역할
- ADD, DEL, CHECK 명령을 지원하며, 각 명령은 컨테이너 ID와 네트워크 네임스페이스 등의 매개변수를 받습니다.
- IP 주소를 할당하고, 필요한 라우팅 정보를 설정합니다.
- 작업 결과를 표준 형식으로 반환하여 런타임과의 일관성을 유지합니다
CNI 플러그인
CNI는 기본적으로 여러 플러그인을 지원하며, 각 플러그인은 특정 네트워크 요구사항에 맞게 설계되었습니다.
기본 제공 플러그인
- Bridge: Linux 브릿지를 생성해 컨테이너를 연결.
- MACVLAN/IPVLAN: 물리적 인터페이스와 직접 연결.
- Host-local: 로컬 IP 주소 할당.
- Portmap: 포트 매핑을 관리
서드파티 플러그인
- Calico: 대규모 클러스터에서 강력한 보안 및 정책 관리 제공.
- Flannel: 간단한 오버레이 네트워크 구현.
- Cilium: eBPF 기반 고성능 패킷 필터링 및 L7 정책 지원
CNI와 Docker의 차이점
Docker는 자체적인 네트워킹 표준인 CNM(Container Network Model)을 사용하며, CNI와는 다른 방식으로 작동합니다:
- CNM은 Docker에 특화된 설계로, CNI와 호환되지 않습니다.
- Kubernetes는 Docker 컨테이너를 생성할 때 기본적으로 CNI 플러그인을 호출하여 추가적인 네트워크 구성을 수행합니다
Kubernetes와 CNI
Kubernetes는 CNI를 사용해 Pod 간 통신 및 외부 네트워크 연결을 관리합니다:
- kubelet(컨테이너 런타임 관리자)이 각 노드에서 CNI 플러그인을 호출하여 Pod의 네트워크를 설정합니다.
- IPAM(IP Address Management)을 통해 Pod에 고유 IP 주소를 할당하고 라우팅 테이블을 구성합니다
CNI의 장점
- 표준화: 다양한 런타임과 플러그인이 호환 가능.
- 유연성: 사용자 환경에 맞게 플러그인 선택 가능.
- 확장성: 멀티 노드 및 대규모 클러스터에서도 안정적으로 작동
결론적으로, CNI는 현대적인 컨테이너 환경에서 필수적인 기술로 자리 잡았으며, Kubernetes와 같은 플랫폼에서 특히 중요한 역할을 담당합니다.
Kubernetes 클러스터의 네트워킹 요구사항
Kubernetes 클러스터는 마스터 노드와 워커 노드로 구성됩니다. 각 노드는 최소 하나 이상의 네트워크 인터페이스를 가져야 하며, 해당 인터페이스는 IP 주소가 설정되어 있어야 합니다. 또한, 모든 호스트는 고유한 호스트 이름과 MAC 주소를 가져야 합니다. 이는 특히 기존 가상 머신(VM)을 복제하여 생성한 경우 주의해야 할 사항입니다.
필수적으로 열어야 할 포트
Kubernetes 클러스터에서 다양한 구성 요소가 통신하기 위해 특정 포트를 열어야 합니다. 주요 포트는 다음과 같습니다:
- API 서버 (마스터 노드)
- 포트 6443: Kubernetes API 서버가 외부 요청(kubectl, 워커 노드, 외부 사용자 등)을 수신하는 데 사용됩니다.
- Kubelet (마스터 및 워커 노드)
- 포트 10250: 마스터와 워커 노드 모두에서 Kubelet이 사용하는 포트입니다.
- 스케줄러 (마스터 노드)
- 포트 10259: kube-scheduler가 사용하는 포트입니다.
- 컨트롤러 매니저 (마스터 노드)
- 포트 10257: kube-controller-manager가 사용하는 포트입니다.
- ETCD 데이터베이스
- 포트 2379: ETCD 서버가 클라이언트 요청을 수신하는 데 사용됩니다.
- 포트 2380: 여러 마스터 노드 간 ETCD 통신에 사용됩니다.
- NodePort 서비스 (워커 노드)
- 포트 범위 30000~32767: 외부 트래픽을 처리하기 위해 워커 노드에서 서비스가 사용하는 포트 범위입니다.
네트워크 보안 구성
- 방화벽, IP 테이블 규칙 또는 클라우드 환경(GCP, Azure, AWS)의 네트워크 보안 그룹에서 위의 포트를 열어야 합니다.
- TLS 암호화를 통해 데이터 통신의 무결성과 기밀성을 보장해야 합니다
멀티 마스터 환경
멀티 마스터 환경에서는 위에서 언급한 모든 포트를 각 마스터 노드에서 열어야 하며, 추가적으로 ETCD 간 통신을 위한 포트(2380)를 열어야 합니다
네트워크 디버깅 및 관리
- kubectl get nodes 명령으로 클러스터의 각 노드 정보를 확인할 수 있습니다.
- kubectl get pods -o wide 명령을 사용하여 Pod의 IP 주소와 위치를 확인할 수 있습니다.
- 네트워크 연결 문제를 조사할 때 kubectl exec 명령으로 Pod 내부에 접속하여 ping, nslookup 같은 네트워크 진단 도구를 사용할 수 있습니다
추가 고려사항
- Kubernetes는 Pod 간 통신을 위해 컨테이너 네트워크 인터페이스(CNI) 플러그인을 사용합니다. Calico, Flannel과 같은 CNI 플러그인을 설치하여 네트워크 정책을 설정하거나 성능을 최적화할 수 있습니다
- Pod 네트워크 CIDR 범위는 호스트 네트워크와 겹치지 않도록 설정해야 합니다
이러한 설정은 Kubernetes 클러스터의 안정성과 보안을 유지하는 데 필수적이며, 클러스터 배포 전 반드시 확인해야 합니다.
https://www.getambassador.io/blog/kubernetes-networking-guide-top-engineers
https://www.getambassador.io/blog/kubernetes-networking-guide-top-engineers
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
'쿠버네티스 > 쿠버네티스' 카테고리의 다른 글
Networking - weave cni (0) | 2025.01.15 |
---|---|
Networking - Pod Networking (0) | 2025.01.15 |
Storage - Container Storage Interface (CSI) (0) | 2025.01.13 |
Storage - Introduction to Docker Storage (0) | 2025.01.13 |
Secrets test/Encrypting Confidential Data at Rest (0) | 2025.01.09 |