본문 바로가기

Kubenetes/Kubernetes Internal

쿠버네티스 인터널 - 3 (실행중인 Pod의 이해 및 내부 네트워크)

3. 실행중인 포드의 이해

 

포드를 실행하고 있는 워커노드에 ssh로 접속할 수 있고, 도커 컨테이너에 실행중인 목록을 조사해 볼수 있다.

노드 내에 있다면 docker ps 명령을 사용해 실행 중인 모든 컨테이너를 나열 할 수 있다.

 

두 개의 컨테이너를 갖는 포드는 동일한 리눅스 네임스페이스를 공유하는 세 개의 컨테이너를 실행한다.

 

4. Inter-Pod Networking

 

4.1 네트워크는 어떤 모습이어야 하는가.

 

쿠버네티스는 특정 네트워크 기술을 사용하라고 요구하지 않지만 포드는 동일한 워커노드에 위치하는지 여부에 관계없이 다른 포드(컨테이너)들과 커뮤니케이션 할 수 있어야 한다.

 

포드가 통신하는데 사용하는 네트워크는 포드가 자신의 것으로 보는 IP 주소가 문제되는 포드의 IP 주소와 정확히 동일한 네트워크여야 한다.

 

쿠버네티스 위임 포드는 NAT가 없는 네트워크를 통해 연결되어 있다.

이는 동일한 네트워크 스위치에 연결된 컴푸터에서 실행되는 것처럼 간단하고 정확하게 포드 내부에서 실행되는 애플리케이션의 네트워킹을 만들기 때문에 중요하다.

 

포드간에 NAT가 없으면 내부에서 실행되는 애플리케이션이 다른 포드에서 자체 등록할 수 있다.

 

4.2 네트워크의 동작 원리 깊이 알아보기

 

 

ㅁ 동일한 노드상의 포드 간의 통신 활성화

 

노드 상의 포드는 가상 이더넷 인터페이스 쌍을 통해 동일한 브릿지로 연결된다.

인프라스트럭처 컨테이너가 시작되기 전에 가상 이더넷 인터페이스 쌍(veth 쌍)은 컨테이너를 위해 생성된다. 인터페이스 쌍 중 하나의 인터페이스는 호스트의 네임스페이스에 존재한다.(노드에서 ifconfig를 실행해보면 vethXXX가 목록으로 나타난다.)

 

반면에 다른 인터페이쌍은 컨테이너의 네트워크 네임스페이스로 옮겨지고 eth0로 이름도 변경된다. 두 개의 가상 인터페이스는 파이프의 두 종단과 비슷하다. (또는 이더넷 케이블로 연결된 두 개의 네트워크 장치) 한쪽에서 나오면 다른 한쪽으로 들어가고 그의 반대도 동일함.

 

호스트의 네트워크 네임스페이스의 인터페이스는 컨테이너 런타임에서 사용하도록 구성된 네트워크 브릿지에 연결된다 컨테이너의 eth0 인터페이스는 브릿지의 주소 범위내에서 IP 주소를 할당한다.

 

컨테이너 내부에서 실행되고 있는 애플리케이션은 eth0 네트워크 인터페이스(컨테이너의 네임스페이스에 있는 인터페이스)로 보내는 모든 것이 호스트 네임스페이스의 다른 veth 인터페이스에서 나오고 브릿지로 전송된다. 이것은 브릿지로 연결된 모든 네트워크 인터페이스에서 수신할 수 있음을 의미한다.

 

포드 A가 포드 B로 네트워크 패킷을 보내면 그 패킷은 포드 A의 쌍을 통해 브릿지로 이동한 다음 포드 B의 쌍을 통해 이동한다. 노드의 모든 컨테이너는 동일한 브릿지에 연결되므로 서로 통신할 수 있다. 

 

 ㅁ 서로 다른 노드상의 포드와의 통신 활성화

 

 

통신을 위해 서로 다른 노드상의 포드를 위해 브릿지는 어떻게든 연결해야 한다.

포드 IP 주소가 전체 클러스터에서 유일해야 한다.  여러 노드의 포드가 동일한 IP를 획득하는 것을 예방하려면 노드의 브릿지가 겹치지 않는 주소 범위를 사용해야 한다.

 

위 그림에서 보듯이 노드 A의 브릿지는 10.1.1.0/24 IP 범위를 사용하고 노드 B의 브릿지는 10.1.2.0/24 IP 범위를 사용하므로 IP 주소 충돌이 발생하지 않는다.

 

위 그림에서 노드의 물리적 네트워크 인터페이스도 브릿지에 연결돼야 함을 보여준다. 10.1.2.0/24로 향하는 모든 패킷이 라우팅 되도록 노드 A의 라우팅 테이블을 구성해야 하고 그에 반해 10.1.1.0/24로 보낸 패킷을 노드 A로 라우팅되로고 노드 B의 라우팅 테이블을 구성해야 한다.

 

ㅁ 컨테이너 네트워크 인터페이스 소개

 

컨테이너를 네트워크에 쉽게 연결하기 위해 CNI(Container Network Interface)라는 프로젝트가 시작됐다. CNI는 쿠버네티스가 외부에 있는 CNI 플러그임을 사용하도록 구성할 수 있다. 이 플러그인에는 다음과 같은 것이 있다.

 

 ㅇ 캘리코(Calico)

 ㅇ 프란넬(Flannel)

 ㅇ 로마나(Romana)

 ㅇ 위브넷(Weave Net)

 ㅇ 그 밖의 것

 

이 플러그인에 대한 설명은

 

https://kubernetes.io/docs/concepts/cluster-administration/addons/ 

 

Installing Addons

Caution: This section links to third party projects that provide functionality required by Kubernetes. The Kubernetes project authors aren't responsible for these projects. This page follows CNCF website guidelines by listing projects alphabetically. To ad

kubernetes.io

를 참고해라.