Post

kubernetes 질문

kubernetes 질문

책 : 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커

질문

1. 쿠버네티스에서 호스트 전용 네트워크는 뭐야?

쿠버네티스에서 “호스트 전용 네트워크”는 파드(Pod)가 노드의 네트워크 네임스페이스를 공유하는 네트워크 모드를 의미합니다.
이는 파드가 노드의 IP 주소를 사용하고, 노드의 네트워크 인터페이스를 통해 직접 통신할 수 있음을 의미합니다.
이 모드는 파드가 노드와 동일한 네트워크 환경을 사용해야 할 때 유용할 수 있지만, 보안 및 네트워크 격리 측면에서 주의가 필요합니다.
일반적으로 쿠버네티스에서는 각 파드가 자체 네트워크 네임스페이스를 가지며, 이는 파드 간의 네트워크 격리를 제공합니다.
호스트 전용 네트워크를 사용할 경우 이러한 격리가 사라지므로, 사용 시 주의가 필요합니다.

2. 네트워크 네임스페이스가 뭐야?

네트워크 네임스페이스(Network Namespace)는 리눅스 커널에서 제공하는 기능으로, 하나의 운영 체제 내에서 서로 독립적인 네트워크 환경을 만들 수 있게 해줍니다.
각 네트워크 네임스페이스는 자체적인 네트워크 인터페이스, IP 주소, 라우팅 테이블 등을 가질 수 있으며, 이를 통해 서로 다른 네트워크 네임스페이스 간의 네트워크 격리가 가능합니다.
이 기능은 컨테이너 기술에서 매우 유용하게 사용되며, 각 컨테이너가 독립적인 네트워크 환경을 가질 수 있도록 지원합니다.
예를 들어, 쿠버네티스에서는 각 파드가 자체 네트워크 네임스페이스를 가지며, 이를 통해 파드 간의 네트워크 트래픽이 격리됩니다.
네트워크 네임스페이스를 사용하면 동일한 호스트에서 실행되는 여러 애플리케이션이 서로 간섭 없이 독립적으로 네트워크를 사용할 수 있습니다.

3. 리눅스에서 eth0, eth1 같은걸 네트워크 네임스페이스라고 하는거야?

리눅스에서 eth0, eth1 같은 것은 네트워크 인터페이스를 나타내며, 네트워크 네임스페이스와는 다릅니다.
네트워크 인터페이스는 물리적 또는 가상 네트워크 장치를 나타내며, 네트워크 트래픽을 송수신하는 데 사용됩니다.
네트워크 네임스페이스는 이러한 네트워크 인터페이스를 격리된 환경에서 사용할 수 있도록 하는 컨테이너와 같은 개념입니다.
즉, 네트워크 네임스페이스는 여러 네트워크 인터페이스를 포함할 수 있으며, 각 네임스페이스는 자체적인 네트워크 인터페이스 집합을 가질 수 있습니다.
예를 들어, 하나의 리눅스 시스템에서 여러 네트워크 네임스페이스를 생성하고, 각 네임스페이스에 eth0, eth1 등의 네트워크 인터페이스를 할당할 수 있습니다.
이렇게 하면 각 네임스페이스는 독립적인 네트워크 환경을 가지게 되어, 서로 다른 네임스페이스 간의 네트워크 트래픽이 격리됩니다.

4. pod에서 NAT 네트워크와 호스트 전용 네트워크의 차이점은 뭐야?

쿠버네티스에서 파드(Pod)가 사용하는 네트워크 모드에는 여러 가지가 있으며, 그 중 NAT(Network Address Translation) 네트워크와 호스트 전용 네트워크는 서로 다른 방식으로 네트워크를 처리합니다. 다음은 두 모드의 주요 차이점입니다:

  1. NAT 네트워크:
    • 격리: 각 파드는 자체 네트워크 네임스페이스를 가지며, 이는 파드 간의 네트워크 격리를 제공합니다.
    • IP 주소: 파드는 클러스터 내에서 고유한 IP 주소를 가지며, 외부 네트워크와 통신할 때 NAT를 통해 IP 주소가 변환됩니다.
    • 보안: 파드 간의 네트워크 트래픽이 격리되어 있어 보안 측면에서 유리합니다.
    • 유연성: 클러스터 내에서 파드의 IP 주소가 외부에 노출되지 않으므로, 클러스터 외부와의 통신을 제어하기 쉽습니다.
  2. 호스트 전용 네트워크:
    • 공유: 파드는 노드의 네트워크 네임스페이스를 공유하며, 노드의 IP 주소를 사용합니다.
    • IP 주소: 파드는 노드와 동일한 IP 주소를 사용하므로, 외부 네트워크와 직접 통신할 수 있습니다.
    • 보안: 네트워크 격리가 없으므로, 파드 간의 트래픽이 노드 수준에서 공유됩니다. 이는 보안 측면에서 주의가 필요합니다.
    • 성능: 네트워크 격리가 없기 때문에, 네트워크 성능이 향상될 수 있습니다. 이 두 모드는 파드의 네트워크 요구 사항에 따라 선택할 수 있으며, 일반적으로 NAT 네트워크는 보안과 격리가 필요한 경우에, 호스트 전용 네트워크는 성능이 중요한 경우에 사용됩니다.

5. 하나의 노드에 실행 중인 여러 pod가 호스트 전용 네트워크를 사용하면 포트를 사용해서 각각의 pod들을 구분해서 통신하는거야?

네, 하나의 노드에서 실행 중인 여러 파드가 호스트 전용 네트워크를 사용할 경우, 각 파드는 노드의 네트워크 네임스페이스를 공유하게 됩니다.
이 상황에서는 파드 간의 네트워크 격리가 없기 때문에, 포트 번호를 사용하여 각 파드를 구분하고 통신할 수 있습니다. 각 파드는 동일한 IP 주소(즉, 노드의 IP 주소)를 사용하지만, 서로 다른 포트 번호를 통해 네트워크 트래픽을 구분합니다.
따라서, 특정 파드에 접근하려면 해당 파드가 사용하는 포트 번호를 알아야 합니다.
이는 네트워크 서비스가 포트 번호를 기반으로 요청을 라우팅하는 방식과 유사합니다.
이 방식은 네트워크 격리가 없기 때문에 보안 측면에서 주의가 필요하며, 포트 충돌을 방지하기 위해 각 파드가 사용하는 포트를 잘 관리해야 합니다.
일반적으로 쿠버네티스에서는 파드 간의 네트워크 격리를 제공하기 위해 NAT 네트워크를 사용하는 것이 더 일반적입니다.

6. kubectl expose 명령어가 하는 일을 설명해 줘

kubectl expose 명령어는 쿠버네티스에서 특정 리소스를 외부에 노출시키기 위해 사용됩니다. 이 명령어는 주로 파드(Pod), 레플리카셋(ReplicaSet), 디플로이먼트(Deployment) 등의 리소스를 서비스(Service)로 노출시켜, 클러스터 내 또는 외부에서 접근할 수 있도록 합니다.

kubectl expose 명령어의 주요 기능은 다음과 같습니다:

  1. 서비스 생성: 지정된 리소스를 기반으로 새로운 서비스 객체를 생성합니다. 이 서비스는 클러스터 내에서 해당 리소스에 대한 네트워크 접근을 관리합니다.
  2. 포트 매핑: 원본 리소스의 포트를 서비스의 포트로 매핑하여, 외부에서 접근할 수 있도록 합니다. 기본적으로는 원본 리소스의 포트를 그대로 사용하지만, 필요에 따라 다른 포트를 지정할 수도 있습니다.
  3. 서비스 유형 지정: 서비스의 유형을 지정할 수 있습니다. 예를 들어, ClusterIP, NodePort, LoadBalancer 등의 유형을 선택하여 서비스가 어떻게 외부에 노출될지를 결정할 수 있습니다.
  4. 라벨 선택: 서비스가 선택할 파드를 결정하기 위해 라벨 셀렉터를 사용합니다. 기본적으로는 원본 리소스의 라벨을 사용하지만, 필요에 따라 다른 라벨을 지정할 수도 있습니다.

예를 들어, 다음 명령어는 my-pod라는 파드를 NodePort 유형의 서비스로 노출시킵니다:

  • kubectl expose pod my-pod –type=NodePort –name=my-service

이 명령어는 my-pod 파드를 대상으로 하는 my-service라는 이름의 서비스를 생성하며, 클러스터 외부에서 접근할 수 있도록 NodePort 유형을 사용합니다.

7. 스토리지 중 nfs가 뭐야?

NFS(Network File System)는 네트워크를 통해 파일을 공유할 수 있도록 해주는 분산 파일 시스템입니다.
NFS를 사용하면 여러 컴퓨터가 네트워크를 통해 동일한 파일 시스템에 접근할 수 있으며, 로컬 디스크에 있는 것처럼 파일을 읽고 쓸 수 있습니다.
주로 유닉스 및 리눅스 환경에서 사용되며, 파일 서버와 클라이언트 간의 파일 공유를 용이하게 합니다.

8. nfs를 설정하는 방법을 알려줘

NFS(Network File System)를 설정하는 방법은 운영 체제에 따라 다를 수 있지만, 일반적인 리눅스 환경에서의 설정 방법을 설명하겠습니다.

서버 측 설정

  1. NFS 패키지 설치
    • NFS 서버 패키지를 설치합니다. 대부분의 리눅스 배포판에서는 다음 명령어를 사용합니다:

      sudo apt-get install nfs-kernel-server

  2. NFS 공유 디렉토리 설정
    • 공유할 디렉토리를 생성하거나 기존 디렉토리를 사용합니다. 예를 들어 /srv/nfs 디렉토리를 공유하려면:

      sudo mkdir -p /srv/nfs

  3. /etc/exports 파일 수정
    • NFS 서버가 공유할 디렉토리를 지정합니다. /etc/exports 파일을 열고 다음과 같은 형식으로 추가합니다:

      /srv/nfs 192.168.1.0/24(rw,sync,no_subtree_check)

    • 여기서 192.168.1.0/24는 네트워크 주소이며, rw는 읽기/쓰기 권한을 의미합니다.

  4. NFS 서버 시작 및 설정 적용
    • NFS 서버를 시작하고 설정을 적용합니다:

      1
      2
      
        sudo systemctl start nfs-kernel-server
        sudo exportfs -a
      

클라이언트 측 설정

  1. NFS 패키지 설치
    • 클라이언트 측에서도 NFS 패키지를 설치해야 합니다:

      sudo apt-get install nfs-common

  2. NFS 마운트
    • NFS 서버의 공유 디렉토리를 마운트합니다. 예를 들어 /mnt/nfs에 마운트하려면:

      sudo mount 192.168.1.100:/srv/nfs /mnt/nfs

    • 여기서 192.168.1.100은 NFS 서버의 IP 주소입니다.

  3. 자동 마운트 설정
    • /etc/fstab 파일에 자동 마운트를 설정할 수 있습니다. 다음 형식으로 추가합니다:

      192.168.1.100:/srv/nfs /mnt/nfs nfs defaults 0 0

    • 이 설정을 통해 NFS 서버와 클라이언트 간에 파일을 공유할 수 있습니다. 네트워크 환경에 따라 IP 주소 및 네트워크 설정을 조정해야 할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.