워크로드 클러스터에 Whereabouts과 함께 Multus 배포

Whereabouts는 클러스터의 모든 노드에서 포드에 IP 주소를 동적으로 할당하는 IPAM(IP 주소 관리) CNI 플러그인입니다. 동일한 노드의 포드에만 IP 주소를 할당하는 host-local과 같은 다른 IPAM 플러그인과 비교하여 whereabouts는 클러스터 전체에 IP 주소를 할당합니다.

이 항목에서는 whereabouts를 사용하여 지정한 범위에서 IP 주소가 할당된 포드에 보조 네트워크 인터페이스를 연결하는 방법을 보여줍니다. 예를 들어 Antrea 또는 Calico를 기본 CNI로 사용하고 macvlan 또는 ipvlan을 사용하여 만든 보조 인터페이스와 Whereabouts을 IPAM CNI로 사용합니다.

사전 요구 사항

  • 다음이 설치된 부트스트랩 시스템:
  • vSphere, Amazon Web Services(AWS) 또는 Azure에서 실행되는 Tanzu Kubernetes Grid 관리 클러스터 및 워크로드 클러스터.
    • Whereabouts에는 프레임 정의 노드 크기에 설명된 대로 크기 large 또는 extra-large의 워크로드 클러스터 Worker 노드가 필요합니다.

Whereabouts 패키지 설치

워크로드 클러스터에 Whereabouts 패키지를 설치하고 이를 사용하도록 클러스터를 구성하려면 다음을 수행합니다.

  1. Whereabouts를 구성하고 설치합니다.

    1. Whereabouts 매개 변수를 검색하는 구성 파일을 생성합니다.

      tanzu package available get whereabouts.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
      
      
      참고

      whereabouts 구성 요소를 배포할 네임스페이스는 kube-system입니다. 사용자 지정된 네임스페이스 설치가 실패합니다.

      여기서 PACKAGE-VERSION은 설치하려는 Whereabouts 패키지의 버전이며 FILE-PATH는 구성 파일을 저장할 위치입니다(예: whereabouts-data-values.yaml). 위 명령은 기본값이 포함된 whereabouts-data-values.yaml 구성 파일을 생성합니다.

    2. tanzu package available list 명령을 실행하여 사용 가능한 Whereabout 패키지 버전을 표시합니다. 예를 들면 다음과 같습니다.

      tanzu package available list whereabouts.tanzu.vmware.com -A
       NAME                           VERSION               RELEASED-AT                     NAMESPACE
       whereabouts.tanzu.vmware.com   0.5.1+vmware.2-tkg.1  2022-30-04 18:00:00 +0000 UTC   tanzu-package-repo-global
      
      
      참고

      네트워크 제한 환경에서 작업하는 경우 사용자 지정 이미지 레지스트리에 연결할 수 있는지 확인합니다.

    3. --values-schema와 함께 tanzu package available get 명령을 실행하여 설정할 수 있는 필드 값을 확인합니다.

      tanzu package available get whereabouts.tanzu.vmware.com/VERSION --values-schema -o FORMAT
      

      형식 설명: VERSIONtanzu package available list 출력에 표시된 버전입니다. FORMATyaml 또는 json입니다.

    4. whereabouts-data-values.yaml 구성 파일을 원하는 필드 값으로 채웁니다.

  2. whereabouts-data-values.yaml 파일에서 모든 주석을 제거합니다.

    yq -i eval '... comments=""' whereabouts-cni-default-values.yaml
    
  3. tanzu package install을 실행하여 패키지를 설치합니다.

    tanzu package install whereabouts --package whereabouts.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file whereabouts-data-values.yaml --namespace TARGET-NAMESPACE
    

    여기서:

    • TARGET-NAMESPACE는 Whereabouts 패키지를 설치하려는 네임스페이스입니다. 예: my-packages 또는 tanzu-cli-managed-packages 네임스페이스.

      • --namespace 플래그가 지정되지 않은 경우 Tanzu CLI는 default 네임스페이스에 패키지를 설치합니다.
      • 지정된 네임스페이스가 이미 존재해야 합니다(예: kubectl create namespace my-packages 실행).
    • AVAILABLE-PACKAGE-VERSION은 위에서 검색한 버전(예: 0.5.1+vmware.2-tkg.1)입니다.
  4. tanzu package installed get을 실행하여 설치된 패키지의 상태를 확인합니다.

    tanzu package installed get whereabouts -o <json|yaml|table>
    
  5. IPAM 유형으로 Whereabouts를 사용하여 Multus CNI에서 사용할 네트워크 인터페이스의 CNI 구성을 정의하는 NetworkAttachmentDefinition의 사용자 지정 리소스 정의(CRD)를 생성합니다.

    1. CRD 규격을 생성합니다. 예를 들어, 이 multus-cni-crd.yamlmacvlan CNI를 구성하고 IPAM 유형이 whereaboutsmacvlan-conf 라는 NetworkAttachmentDefinition을 지정합니다.

      ---
      apiVersion: "k8s.cni.cncf.io/v1"
      kind: NetworkAttachmentDefinition
      metadata:
        name: macvlan-conf
      spec:
        config: '{
          "cniVersion": "0.3.1",
          "plugins": [
            {
            "type": "macvlan",
            "capabilities": { "ips": true },
            "master": "eth0",
            "mode": "bridge",
            "ipam": {
              "type": "whereabouts",
              "range": "192.168.20.0/24",
              "range_start": "192.168.20.10",
              "range_end": "192.168.20.100",
              "gateway": "192.168.20.1"
              }
            } ]
          }'
      
    2. 리소스를 생성합니다. 예: kubectl create -f multus-cni-crd.yaml

  6. 주석 k8s.v1.cni.cncf.io/networks를 사용하여 추가하려는 추가 네트워크를 지정하는 포드를 생성합니다.

    1. 포드 규격을 생성합니다. 예: my-multi-cni-pod.yaml:

      apiVersion: v1
      kind: Pod
      metadata:
        name: pod0
        annotations:
          k8s.v1.cni.cncf.io/networks: macvlan-conf
      spec:
        containers:
        - name: pod0
          command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
          image: docker.io/kserving/tools:latest
      
      
    2. 포드를 생성합니다. 예를 들어 kubectl create -f my-multi-cni-crd.yaml는 포드 pod0을 생성합니다.

    3. 포드가 생성되면 다음과 같은 세 가지 네트워크 인터페이스가 있습니다.

      • lo 루프백 인터페이스
      • eth0 Antrea 또는 Calico CNI에서 관리하는 기본 포드 네트워크
      • net1 주석 k8s.v1.cni.cncf.io/networks: macvlan-conf를 통해 생성된 새 인터페이스.
      참고

      기본 네트워크에는 eth0이라는 이름이 지정되고 추가 네트워크 포드 인터페이스에는 net1, net2 등의 이름이 지정됩니다.

    4. pod0에서 kubectl describe pod를 실행하고, 주석 k8s.v1.cni.cncf.io/network-status가 모든 네트워크 인터페이스를 표시하는지 확인합니다.

      예:

      $ kubectl describe pod pod0
      
      Name:         pod0
      Namespace:    default
      Priority:     0
      Node:         tcecluster-md-0-6476897f75-rl9vt/10.170.109.225
      Start Time:   Thu, 25 August 2022 15:31:20 +0000
      Labels:       <none>
      Annotations:  k8s.v1.cni.cncf.io/network-status:
                     [{
                         "name": "",
                         "interface": "eth0",
                         "ips": [
                             "100.96.1.80"
                         ],
                         "mac": "66:39:dc:63:50:a3",
                         "default": true,
                         "dns": {}
                     },{
                         "name": "default/macvlan-conf",
                         "interface": "net1",
                         "ips": [
                             "192.168.20.11"
                         ],
                         "mac": "02:77:cb:a0:60:e3",
                         "dns": {}
                     }]
                   k8s.v1.cni.cncf.io/networks: macvlan-conf
      
      

      그런 다음 kubectl exec sample-pod -- ip a show dev net1을 실행하여 대상 인터페이스가 위의 주석에 나열된 IP로 실행 중인지 확인합니다. 다음 단계에서 생성할 다른 포드의 구성을 검증하려면 이 단계를 반복합니다.

  7. 추가 노드 2개 즉, 동일한 노드에서 pod1과 다른 노드에서 pod2를 생성합니다. 이러한 포드를 사용하여 단일 노드 내에서 네트워크 액세스를 확인하고 클러스터 전체에서 노드를 확인합니다.

클러스터에서 포드 간 네트워크 트래픽 검증

이제 동일한 노드의 포드와 클러스터 전체의 포드 사이의 네트워크 액세스를 확인할 수 있습니다.

  1. 동일한 노드에 있는 포드 간 네트워크 액세스가 작동하는지 확인합니다. 예를 들어 다음 명령은 할당된 IP 주소를 통해 pod0pod1에 연결할 수 있음을 확인합니다.

      kubectl exec -it pod0 -- ping -c 3 192.168.20.12
      PING 192.168.20.12 (192.168.20.12) 56(84) bytes of data.
      64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.237 ms
      64 bytes from 192.168.20.12: icmp_seq=2 ttl=64 time=0.215 ms
      64 bytes from 192.168.20.12: icmp_seq=3 ttl=64 time=0.156 ms
    
    --- 192.168.20.12 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2030ms
    rtt min/avg/max/mdev = 0.156/0.202/0.237/0.037 ms
    
  2. 다른 노드에 있는 포드 간 네트워크 액세스가 작동하는지 확인합니다. 예를 들어 다음 명령은 할당된 IP 주소를 통해 pod0pod2에 연결할 수 있음을 확인합니다.

      kubectl exec -it pod0 -- ping -c 3 <192.168.20.13
      PING 192.168.20.13 (192.168.20.13) 56(84) bytes of data.
      64 bytes from 192.168.20.13: icmp_seq=1 ttl=64 time=0.799 ms
      64 bytes from 192.168.20.13: icmp_seq=2 ttl=64 time=0.626 ms
      64 bytes from 192.168.20.13: icmp_seq=3 ttl=64 time=0.655 ms
    
    --- 192.168.20.13 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2030ms
    rtt min/avg/max/mdev = 0.626/0.693/0.799/0.078 ms
    
check-circle-line exclamation-circle-line close-line
Scroll to top icon