본문 바로가기

Computer Science/Kubernetes(CKA) 자격증 준비

Kubernetes 정리 201: Prerequisite - Network Namespaces

1. Process Namespace

그렇다면 네임스페이스란 무엇인가요? 호스트가 집이라면 네임스페이스는 각 자녀에게 할당하는 집 안의 방입니다. 이 방은 각 어린이에게 프라이버시를 제공하는 데 도움이 됩니다. 각 어린이는 자신의 방 안에 있는 것만 볼 수 있고 방 밖에서 일어나는 일은 볼 수 없습니다. 그 방만 생각한다면, 그들은 집에 사는 유일한 사람입니다. 그러나 부모는 집안의 모든 방과 집안의 다른 영역을 볼 수 있습니다. 원하는 경우 집안의 두 방을 연결할 수 있습니다. 컨테이너를 생성할 때 컨테이너가 격리되어 있는지 확인하고 호스트의 다른 프로세스나 다른 컨테이너를 볼 수 없도록 해야 합니다. 그래서 네임스페이스를 사용하여 호스트에 특별한 공간을 만듭니다. 컨테이너 안에서는 컨테이너는 자신이 실행하는 프로세스만 보고 자체 호스트에 있다고 생각합니다. 그러나 default 호스트는 컨테이너 내부에서 실행되는 프로세스를 포함하여 모든 프로세스를 볼 수 있습니다.

이것은 컨테이너 내에서 프로세스를 조회할 때 볼 수 있습니다. 프로세스 ID가 1인 단일 프로세스가 표시됩니다. default 호스트에서 동일한 프로세스를 루트 사용자로 나열하면 컨테이너 내부에서 실행 중인 프로세스와 함께 이번에는 다른 프로세스 ID를 사용하여 다른 모든 프로세스가 표시됩니다. 컨테이너 내부와 외부에서 서로 다른 프로세스 ID로 실행되는 동일한 프로세스입니다. 네임스페이스가 작동하는 방식입니다.

 

2. Network Namespace

네트워킹과 관련하여 호스트에는 로컬 영역 네트워크에 연결하는 자체 인터페이스가 있습니다. 호스트에는 나머지 네트워크에 대한 정보가 포함된 자체 라우팅 및 ARP 테이블이 있습니다. 컨테이너에서 이러한 모든 세부 정보를 봉인하려고 합니다. 컨테이너가 생성되면 네트워크 네임스페이스를 생성하므로 호스트의 네트워크 관련 정보를 볼 수 없습니다. 네임스페이스 내에서 컨테이너는 자체 가상 인터페이스, 라우팅 및 ARP 테이블을 가질 수 있습니다. 컨테이너에는 자체 인터페이스가 있습니다.

3. Create Network Namespace

Linux 호스트에서 새 네트워크 네임스페이스를 만들려면 ip netns add 커맨드를 실행합니다. 이 경우 두 개의 네트워크 네임스페이스를 생성합니다. 네트워크 네임스페이스를 조회하려면 ip netns 커맨드를 실행합니다.

 

3. Exec in Network Namespace

내 호스트의 인터페이스를 조회하기 위해 ip link 커맨드를 실행합니다. 호스트에 루프백 인터페이스와 80 인터페이스가 있는 것을 확인했습니다. 이제 red 또는 blue 네임스페이스 내에서 동일한 커맨드를 어떻게 실행하나요? 커맨드 앞에 ip netns exec 커맨드를 붙인 다음 네임스페이스 이름(red)을 붙입니다. 이제 red 네임스페이스 내에서 ip link 커맨드가 실행됩니다. 이를 수행하는 또 다른 방법은 원래 ip link 커맨드에 -n 옵션을 추가하는 것입니다. 이 둘은 동일합니다. 두 번째는 더 간단하지만 네임스페이스 내에서 ip 커맨드를 실행하려는 경우에만 작동한다는 점을 기억하세요.

보시다시피 루프백 인터페이스만 나열되며 호스트에서 80 인터페이스는 볼 수 없습니다. 따라서 네임스페이스를 사용하여 컨테이너가 호스트 인터페이스를 보지 못하도록 성공적으로 방지했습니다.

4. ARP and Routing Table

ARP 테이블도 마찬가지입니다. 호스트에서 ARP 커맨드를 실행하면 항목 목록이 표시되지만 컨테이너 내부에서 실행하면 항목이 표시되지 않습니다.

 

5. Virtual Cabel

현재로서는 이러한 네트워크 네임스페이스에는 네트워크 연결이 없고 자체 인터페이스가 없으며 호스트 네트워크를 볼 수 없습니다. 네임스페이스 자체 간의 연결 설정을 먼저 살펴보겠습니다. 케이블을 사용하여 두 개의 물리적 머신을 각 머신의 인터넷 인터페이스에 연결하는 것과 마찬가지로 가상 이더넷 쌍 또는 가상 케이블을 사용하여 두 개의 네임스페이스를 함께 연결할 수 있습니다. 흔히 파이프라고 부르지만 저는 양쪽 끝에 두 개의 인터페이스가 있는 가상 케이블이라고 부르고 싶습니다.

케이블을 생성하려면 유형을 veth로 설정하고 ip link at 커맨드를 실행하고 두 끝 veth red 및 veth blue를 지정합니다. 다음 단계는 각 인터페이스를 적절한 네임스페이스에 연결하는 것입니다. 그렇게 하려면 ip link set veth red netns red 커맨드를 사용하십시오. 마찬가지로 blue 인터페이스를 blue 네임스페이스에 연결합니다. 그런 다음 이러한 각 네임스페이스에 IP 주소를 할당할 수 있습니다. 일반적인 ip addr 커맨드를 사용하여 IP 주소를 할당하지만 각 네임스페이스 내에서 사용합니다. red 네임스페이스에 ip 192.168.15.1을 할당합니다. 그런 다음 blue 네임스페이스에 ip 192.168.15.2를 할당했습니다. 그런 다음 각 네임스페이스 내의 각 장치에 대해 ip link setup 커맨드를 사용하여 인터페이스를 불러옵니다. 링크가 작동하고 이제 네임스페이스가 서로 연결할 수 있습니다.

red 네임스페이스에서 ping을 시도하여 blue네임스페이스의 ARP 테이블을 보면 MAC 주소가 있는 192.168.15.2에서 blue 이웃을 식별하는 것을 볼 수 있습니다. 마찬가지로 blue 네임스페이스에 ARP 테이블을 나열하면 red 이웃으로 식별되는 것을 볼 수 있습니다. 이것을 호스트의 ARP 테이블과 비교하면 호스트 ARP 테이블은 우리가 생성한 이러한 새 네임스페이스에 대해 전혀 모르고 그 안에 생성한 인터페이스에 대해 전혀 모른다는 것을 알 수 있습니다.

6. Linux Bridge

이제 네임스페이스가 두 개뿐이었을 때는 효과가 있었습니다. 네임스페이스가 더 많으면 어떻게 해야 할까요? 그들 모두가 서로 의사 소통을 할 수 있게 하려면 어떻게 해야 할까요? 실제 세계에서와 마찬가지로 호스트 내부에 가상 네트워크를 만듭니다. 네트워크를 생성하려면 스위치가 필요하므로 가상 네트워크를 생성하려면 가상 스위치가 필요합니다. 따라서 호스트 내에 가상 스위치를 생성하고 여기에 네임스페이스를 연결합니다. 그러나 호스트 내에서 가상 스위치를 어떻게 생성하나요? Linux 브리지라고 하는 네이티브 솔루션과 open V switch 등 여러 가지 솔루션을 사용할 수 있습니다. 이 예에서는 Linux 브리지 옵션을 사용합니다.

내부 브리지 네트워크를 생성하기 위해 유형이 bridge로 설정된 ip link add 커맨드를 사용하여 호스트에 새 인터페이스를 추가합니다. 이름은 v-net-0입니다. 우리 호스트에 관한 한 그것은 80 인터페이스와 같은 또 다른 인터페이스일 뿐입니다. 다른 인터페이스와 함께 ip link 커맨드의 출력에 나타납니다. 현재 꺼져 있으므로 켜야 합니다. ip link setup 커맨드를 사용하여 켭니다.