ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes (K8S): Network - 1. Container Networking
    공부합시다!/Kubernetes 2022. 12. 27. 13:56
    728x90

    이제부터 K8S에서 가장 어렵다는 Network에 대해서 공부해 보겠습니다.

    기본적으로 Subnet, Router, Bridge, Routing, IPtables에 대한 개념을 알고 계셔야 합니다.

    모르시는 분들이 보면 더 힘들어지니 Pass 하시기 바랍니다.

     

    하나의 POD에는 하나의 Container만을 실행하는 것을 권장합니다.

    만일 단일 POD에 여러대의 Container를 생성했다면 Container는 어떻게 통신을 할까요?

     

    Docker때 공부했던 Host Network를 POD안으로 집어넣으시면 됩니다.

    즉 POD가 Host의 역할을 한다고 생각하시면 되세요!

    아래 그림을 참조하면서 설명을 드리겠습니다.

     

    1. pause container 

     1.1. pause는 별도로 생성하는 container가 아니라 Pod 생성시 자동으로 생성됨.

     1.2. Pod 삭제시 자동으로 삭제되며 Pod와 동일한 Life Cycle을 갖음.

     1.3. 따라서 1개의 Pod에는 반드시 1개의 Pause Container가 존재하며 K8S에서 가장 많이 사용되는 Container.

     1.4. 역할

      1.4.1. Network Namespace 생성,유지,공유 합니다.

      1.4.2. IPC Namespace 생성,유지,공유 합니다.

      1.4.3. Pod내 특정 Container가 비정상 종료되어 발생할 수 있는 Namespace 문제 발생 방지

     

    2. pause container 동작 과정

     2.1. Pod가 생성되고 함께 pause container가 생성될때, pause container에 NIC  eth0 가 생성됨.

     2.2. Pod가 생성되는 Node에도 네트워크 서비스를 위한 Network namspace 이미 존재함.

     2.3. 이 Node에도 새로운 가상의 인터페이스 veth0 가 생성되며, pause container의 인터페이스와 직접 연결됨.

     2.4. Pod가 생성될때마다 Node에 가상 인터페이스가 생겨서 Pod의 pause container와 1:1로 연결됨을 의미함. 

     2.5 이후 DHCP에 의해서  pause container는 해당 인터페이스에 새로운 IP주소를 자동으로 할당받게 됨.

     2.6. 동일한 port를 사용하려는 container가 존재한다면 포트 충돌로 서비스가 내려가게 됨.

     

    3. Test

     

     3.1. nginx와 centos를 실행하는 test.yml 파일 작성

     

    # vi test.yml
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: test
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
      - name: centos
        image: centos:7
        command: ["/bin/bash","-c","while true; do sleep 1000; done"]
        imagePullPolicy: IfNotPresent

    test.yml

     

     3.2. test.yml 파일 적용 및 확인

    # kubectl apply -f test.yml
    # kubectl get pod
    # kubectl describe pod test

     

     3.3. centos container 접속 후 nginx 접근

    # kubectl exec test -c centos -it -- bash
    반드시 pod 명시 후 -c 옵션으로 container 지정
    default nginx 임으로 그냥 접속하면 nginx container에 접속됨

     

    4. 동일 Node 내의 다른 POD or 다른 Node의 POD 통신

     4.1. 두 경우 모두 IP로 통신 가능

     4.2. 단 node가 다른 경우 Routing 필요하게 됨.

     4.3. 이래서 cni(container network interface)가 필요하게 됩니다.

     

    728x90
Designed by Tistory.