쿠버네티스(kubernetes)파드(pod)간 네트워킹 테스트

쿠버네티스 다른 파드간 네트워킹

파드

파드(Pod) 는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.(하나이상의 컨테이너 그룹)

클러스터의 모든 파드는 고유한 IP주소를 갖는다. 이는 즉 파드간 연결을 명시적으로 만들 필요가 없으며 또한 컨테이너 포트를 호스트 포트에 매핑할 필요가 거의 없음을 의미한다.

파드 네트워킹 이해

Kubernetes의 파드에는 클러스터 내의 고유한 IP 주소가 할당되어 파드 간의 직접 통신이 가능합니다. 기본적으로 각 파드는 격리되어 있으며 자체 IP 주소를 갖고 있어 보안 통신이 가능하고 포트 충돌을 방지할 수 있습니다. 이러한 IP 주소는 외부 액세스를 위해 특정 구성이 이루어지지 않는 한 Kubernetes 클러스터 네트워크 내에서만 연결할 수 있습니다.

하나의 파드 내에서 모든 컨테이너들은 localhost로 통신할 수 있다.

docker가 컨테이너 시작시 veth0 가상네트워크 인터페이스를 생성하는데 쿠버네티스가 pod를 생성 할 때 veth0가상 인터페이스를 서로 공유하기 때문에 같은 네트워크 상에 존재할 수 있다.

각각의 컨테이너들은 veth0을 공유하며 다른 포트로 네트워킹한다.

쿠버네티스 파드에서, 컨테이너를 호스팅하기 위해 먼저 “퍼즈”컨테이너라는 인프라 컨테이너가 생성된다.

쿠버네티스는 이 퍼즈라는 컨테이너를 만들어 다른 컨테이너 및 외부통신을 수행한다.

그리고 쿠버네티스는 퍼즈 컨테이너를 사용하여 워커 컨테이너가 충돌하거나 재시작하여도 네트워킹 구성을 잃지 않도록 한다.

왼쪽노드에서 오른쪽노드로 네트워킹 한다고 했을때 라우터가 오른쪽(10.100.0.3)에 172.17.0.2IP를 갖는 Pod가 있다는 사실을 알고 있다면 적절하네 패킷을 전송 할 수 있을 것이다.

하지만 네트워킹을 한다고 했을때 다른 노드에도 같은 IP주소(172.17.0.21)가 있을수도 있기 때문에 문제가 된다.

그래서 쿠버네티스는 CNI(Container Network Interface)를 사용한다.

리눅스 컨테이너를 위한 네트워킹이며 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준으로 사용된다.

Calico, Canal, Flannel, Weave Net등 다양한 CNI네트워크가 존재한다.

아래와 같이 네트워킹을 구성하였고,

10.2.3.112노드의 컨테이너에서 10.2.3.114의 nginx 컨테이너를 실행하여 접속하는 테스트를 진행 한다.

슬립상태를 유지하는 컨테이너 생성

busybox_pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    env: test
spec:
  containers:
  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["sleep", "3600"]
  nodeSelector:
    key: gpu

nignx서버 파드를 생성

nginx_pod.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx-web
  name: nginx-web
spec:
  containers:
  - image: nginx
    name: nginx-web
    ports:
    - containerPort: 80
  nodeSelector:
   key: storage

마스터노드에서 kubectl create 명령으로 pod를 생성한다.

kubectl create -f {file}

wide옵션을 통하여 생성 완료 확인 및 상태가 Running인지 확인한다. 그리고 각각 할당된 IP주소 확인.

그리고 잠시 CNI구성을 살펴본다.

쿠버네티스의 모든노드에서 kube-system네임스페이스의 canal프로세스가 잘 실행되고 있다.

10.2.3.114의 ip route를 통하여 라우팅 규칙을 직접 확인해 보자

할당된 10.42.3.44를 확인 할 수 있다.

wget명령어로 해당주소의 80 포트로 데이터를 받아와 열어보면 데이터를 받아온것을 확인 할 수 있다.

Leave a Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다