네트워크 기능 운영자

이 페이지에서는 Google Distributed Cloud Connected와 함께 제공되는 전문 네트워크 기능 Kubernetes 연산자를 설명합니다. 이 연산자는 Distributed Cloud가 고성능 워크로드를 실행할 수 있도록 하는 커스텀 리소스 정의 (CRD) 집합을 구현합니다.

네트워크 기능 운영자 및 SR-IOV 기능은 Distributed Cloud 연결 서버에서 사용할 수 없습니다.

네트워크 기능 연산자를 사용하면 다음 작업을 할 수 있습니다.

  • 노드에서 기존 네트워크 기기를 폴링합니다.
  • 노드의 각 네트워크 기기의 IP 주소와 물리적 링크 상태를 쿼리합니다.
  • 노드에 추가 네트워크 인터페이스를 프로비저닝합니다.
  • 고성능 워크로드를 지원하는 데 필요한 노드의 실제 머신에서 하위 수준 시스템 기능을 구성합니다.
  • PCI Express 네트워크 인터페이스에서 단일 루트 입력/출력 가상화 (SR-IOV)를 사용하여 여러 가상 인터페이스로 가상화합니다. 그런 다음 이러한 가상 네트워크 인터페이스를 사용하도록 Distributed Cloud 연결 워크로드를 구성할 수 있습니다.

SR-IOV용 Distributed Cloud 연결 지원은 다음 오픈소스 프로젝트를 기반으로 합니다.

기본 요건

네트워크 기능 운영자는 Distributed Cloud Edge Network API에서 네트워크 구성을 가져옵니다. 이를 허용하려면 다음 명령어를 사용하여 네트워크 기능 운영자 서비스 계정에 Edge 네트워크 뷰어 역할(roles/edgenetwork.viewer)을 부여해야 합니다.

gcloud projects add-iam-policy-binding ZONE_PROJECT_ID \
  --role roles/edgenetwork.viewer \
  --member "serviceAccount:CLUSTER_PROJECT_ID.svc.id.goog[nf-operator/nf-angautomator-sa]"

다음을 바꿉니다.

  • ZONE_PROJECT_ID를 Distributed Cloud Edge Network API 리소스를 보유하는 Google Cloud 프로젝트의 ID로 바꿉니다.
  • CLUSTER_PROJECT_ID를 대상 Distributed Cloud 연결된 클러스터를 보유한 Google Cloud 프로젝트의 ID로 바꿉니다.

네트워크 기능 운영자 리소스

Distributed Cloud connected 네트워크 함수 연산자는 다음 Kubernetes CRD를 구현합니다.

  • Network: 포드가 내부 및 외부 리소스와 통신하는 데 사용할 수 있는 가상 네트워크를 정의합니다. 이 리소스에서 VLAN을 지정하기 전에 Distributed Cloud Edge Network API를 사용하여 해당 VLAN을 만들어야 합니다. 자세한 내용은 네트워크 만들기를 참고하세요.
  • NetworkInterfaceState: 네트워크 인터페이스 상태를 검색하고 링크 상태와 IP 주소에 대해 네트워크 인터페이스를 쿼리할 수 있습니다.
  • NodeSystemConfigUpdate: 커널 옵션, Kubelet 플래그와 같은 하위 수준 시스템 기능을 구성할 수 있습니다.
  • SriovNetworkNodePolicy: SR-IOV 가상화 네트워크 인터페이스 그룹을 선택하고 그룹을 Kubernetes 리소스로 인스턴스화합니다. 이 리소스는 NetworkAttachmentDefinition 리소스에서 사용할 수 있습니다.
  • SriovNetworkNodeState: Distributed Cloud 노드에서 SriovNetworkNodePolicy 리소스의 프로비저닝 상태를 쿼리할 수 있습니다.
  • NetworkAttachmentDefinition. Distributed Cloud 포드를 Distributed Cloud 연결 노드의 하나 이상의 논리적 또는 물리적 네트워크에 연결할 수 있습니다. 이 리소스에서 VLAN을 지정하기 전에 Distributed Cloud Edge Network API를 사용하여 해당 VLAN을 만들어야 합니다. 자세한 내용은 네트워크 만들기를 참고하세요.

네트워크 기능 연산자를 사용하면 SR-IOV 가상 함수를 사용하지 않는 보조 네트워크 인터페이스를 정의할 수도 있습니다.

리소스 Network

Network 리소스는 Distributed Cloud 연결 랙 내의 가상 네트워크를 정의합니다. Distributed Cloud 연결 클러스터 내의 포드는 이를 사용하여 내부 및 외부 리소스와 통신할 수 있습니다.

Network 리소스는 쓰기 가능한 필드로 노출된 네트워크 인터페이스에 대해 다음과 같은 구성 가능한 매개변수를 제공합니다.

  • spec.type: 이 네트워크의 네트워크 전송 계층을 지정합니다. 유일하게 유효한 값은 L2입니다. nodeInterfaceMatcher.interfaceName 값도 지정해야 합니다.
  • spec.nodeInterfaceMatcher.interfaceName: 이 네트워크와 함께 사용할 타겟 Distributed Cloud 연결 노드의 실제 네트워크 인터페이스 이름입니다.
  • spec.gateway4: 이 네트워크의 네트워크 게이트웨이 IP 주소입니다.
  • spec.l2NetworkConfig.prefixLength4: 이 네트워크의 CIDR 범위를 지정합니다.
  • annotations.networking.gke.io/gdce-vlan-id: 이 네트워크의 VLAN ID를 지정합니다.
  • annotations.networking.gke.io/gdce-vlan-mtu: (선택사항) 이 네트워크의 MTU 값을 지정합니다. 생략하면 상위 인터페이스에서 MTU 값을 상속합니다.
  • annotations.networking.gke.io/gdce-lb-service-vip-cidr: 부하 분산 서비스의 가상 IP 주소 범위를 지정합니다. 값은 CIDR 블록 또는 명시적 주소 범위 값일 수 있습니다. 이 주석은 레이어 3의 경우 필수이고 레이어 2 부하 분산의 경우 선택사항입니다.

다음 예시는 리소스의 구조를 보여줍니다.

apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: vlan200-network
  annotations:
    networking.gke.io/gdce-vlan-id: 200
    networking.gke.io/gdce-vlan-mtu: 1500
    networking.gke.io/gdce-lb-service-vip-cidrs: "10.1.1.0/24"
spec:
  type: L2
  nodeInterfaceMatcher:
    interfaceName: gdcenet0.200
  gateway4: 10.53.0.1

부하 분산 서비스에 여러 가상 IP 주소 범위를 지정하려면 networking.gke.io/gdce-lb-service-vip-cidrs 주석을 사용합니다. 이 주석의 값은 쉼표로 구분된 목록 또는 JSON 페이로드로 제공할 수 있습니다. 예를 들면 다음과 같습니다.

[
  {
    "name": "test-oam-3",
    "addresses": ["10.235.128.133-10.235.128.133"],
    "autoAssign": false
  }
  ,
  {
    "name": "test-oam-4",
    "addresses": ["10.235.128.134-10.235.128.134"],
    "autoAssign": false
  },
  {
    "name": "test-oam-5",
    "addresses": ["10.235.128.135-10.235.128.135"],
    "autoAssign": false
  }
]

JSON 페이로드를 사용하는 경우 축약된 JSON 형식을 사용하는 것이 좋습니다. 예를 들면 다음과 같습니다.

apiVersion: networking.gke.io/v1
  kind: Network
  metadata:
    annotations:
      networking.gke.io/gdce-lb-service-vip-cidrs: '[{"name":"test-oam-3","addresses":["10.235.128.133-10.235.128.133"],"autoAssign":false},{"name":"test-oam-4","addresses":["10.235.128.134-10.235.128.134"],"autoAssign":false},{"name":"test-oam-5","addresses":["10.235.128.135-10.235.128.135"],"autoAssign":false}]'
      networking.gke.io/gdce-vlan-id: "81"
    name: test-network-vlan81
  spec:
    IPAMMode: Internal
    dnsConfig:
      nameservers:
      - 8.8.8.8
    gateway4: 192.168.81.1
    l2NetworkConfig:
      prefixLength4: 24
    nodeInterfaceMatcher:
      interfaceName: gdcenet0.81
    type: L2

autoAssign 필드는 생략하면 기본값이 false입니다.

리소스 NetworkInterfaceState

NetworkInterfaceState 리소스는 노드에서 실제 네트워크 인터페이스를 검색하고 이러한 인터페이스를 통해 흐르는 네트워크 트래픽에 관한 런타임 통계를 수집할 수 있는 읽기 전용 리소스입니다. Distributed Cloud는 클러스터의 각 노드에 대해 NetworkInterfaceState 리소스를 만듭니다.

Distributed Cloud 연결 머신의 기본 구성에는 gdcenet0라는 랙 선택 네트워크 도터 카드(rNDC)의 결합된 네트워크 인터페이스가 포함됩니다. 이 인터페이스는 eno1np0eno2np1 네트워크 인터페이스를 결합합니다. 각각 하나의 분산 클라우드 ToR 스위치에 연결됩니다.

NetworkInterfaceState 리소스는 읽기 전용 상태 필드로 노출된 다음 네트워크 인터페이스 정보 카테고리를 제공합니다.

일반 정보:

  • status.interfaces.ifname: 대상 네트워크 인터페이스의 이름입니다.
  • status.lastReportTime: 타겟 인터페이스의 마지막 상태 보고 시간 및 날짜입니다.

IP 주소 구성 정보:

  • status.interfaces.interfaceinfo.address: 타겟 인터페이스에 할당된 IP 주소입니다.
  • status.interfaces.interfaceinfo.dns: 대상 인터페이스에 할당된 DNS 서버의 IP 주소입니다.
  • status.interfaces.interfaceinfo.gateway: 대상 인터페이스를 제공하는 네트워크 게이트웨이의 IP 주소입니다.
  • status.interfaces.interfaceinfo.prefixlen: IP 프리픽스의 길이입니다.

하드웨어 정보:

  • status.interfaces.linkinfo.broadcast: 대상 인터페이스의 브로드캐스트 MAC 주소입니다.
  • status.interfaces.linkinfo.businfo: bus:slot.function 형식의 PCIe 기기 경로입니다.
  • status.interfaces.linkinfo.flags: 인터페이스 플래그입니다(예: BROADCAST).
  • status.interfaces.linkinfo.macAddress: 대상 인터페이스의 유니캐스트 MAC 주소입니다.
  • status.interfaces.linkinfo.mtu: 타겟 인터페이스의 MTU 값입니다.

수신 통계:

  • status.interfaces.statistics.rx.bytes: 대상 인터페이스에서 수신한 총 바이트입니다.
  • status.interfaces.statistics.rx.dropped: 타겟 인터페이스에서 삭제된 총 패킷 수입니다.
  • status.interfaces.statistics.rx.errors: 타겟 인터페이스의 총 패킷 수신 오류입니다.
  • status.interfaces.statistics.rx.multicast: 타겟 인터페이스에서 수신한 총 멀티캐스트 패킷입니다.
  • status.interfaces.statistics.rx.overErrors: 대상 인터페이스의 오류를 통한 총 패킷 수신입니다.
  • status.interfaces.statistics.rx.packets: 대상 인터페이스에서 수신한 총 패킷입니다.

전송 통계:

  • status.interfaces.statistics.tx.bytes: 타겟 인터페이스에서 전송된 총 바이트입니다.
  • status.interfaces.statistics.tx.carrierErrors: 대상 인터페이스에서 발생한 총 캐리어 오류입니다.
  • status.interfaces.statistics.tx.collisions: 타겟 인터페이스에서 발생한 총 패킷 충돌입니다.
  • status.interfaces.statistics.tx.dropped: 타겟 인터페이스에서 삭제된 총 패킷 수입니다.
  • status.interfaces.statistics.tx.errors: 대상 인터페이스의 총 전송 오류입니다.
  • status.interfaces.statistics.tx.packets: 대상 인터페이스에서 전송한 총 패킷 수입니다.

다음 예시는 리소스의 구조를 보여줍니다.

apiVersion: networking.gke.io/v1
kind: NetworkInterfaceState
metadata:
  name: MyNode1
nodeName: MyNode1
status:
  interfaces:
  - ifname: eno1np0
    linkinfo:
      businfo: 0000:1a:00.0
      flags: up|broadcast|multicast
      macAddress: ba:16:03:9e:9c:87
      mtu: 9000
    statistics:
      rx:
        bytes: 1098522811
        errors: 2
        multicast: 190926
        packets: 4988200
      tx:
        bytes: 62157709961
        packets: 169847139
  - ifname: eno2np1
    linkinfo:
      businfo: 0000:1a:00.1
      flags: up|broadcast|multicast
      macAddress: ba:16:03:9e:9c:87
      mtu: 9000
    statistics:
      rx:
        bytes: 33061895405
        multicast: 110203
        packets: 110447356
      tx:
        bytes: 2370516278
        packets: 11324730
  - ifname: enp95s0f0np0
    interfaceinfo:
    - address: fe80::63f:72ff:fec4:2bf4
      prefixlen: 64
    linkinfo:
      businfo: 0000:5f:00.0
      flags: up|broadcast|multicast
      macAddress: 04:3f:72:c4:2b:f4
      mtu: 9000
    statistics:
      rx:
        bytes: 37858381
        multicast: 205645
        packets: 205645
      tx:
        bytes: 1207334
        packets: 6542
  - ifname: enp95s0f1np1
    interfaceinfo:
    - address: fe80::63f:72ff:fec4:2bf5
      prefixlen: 64
    linkinfo:
      businfo: 0000:5f:00.1
      flags: up|broadcast|multicast
      macAddress: 04:3f:72:c4:2b:f5
      mtu: 9000
    statistics:
      rx:
        bytes: 37852406
        multicast: 205607
        packets: 205607
      tx:
        bytes: 1207872
        packets: 6545
  - ifname: enp134s0f0np0
    interfaceinfo:
    - address: fe80::63f:72ff:fec4:2b6c
      prefixlen: 64
    linkinfo:
      businfo: 0000:86:00.0
      flags: up|broadcast|multicast
      macAddress: 04:3f:72:c4:2b:6c
      mtu: 9000
    statistics:
      rx:
        bytes: 37988773
        multicast: 205584
        packets: 205584
      tx:
        bytes: 1212385
        packets: 6546
  - ifname: enp134s0f1np1
    interfaceinfo:
    - address: fe80::63f:72ff:fec4:2b6d
      prefixlen: 64
    linkinfo:
      businfo: 0000:86:00.1
      flags: up|broadcast|multicast
      macAddress: 04:3f:72:c4:2b:6d
      mtu: 9000
    statistics:
      rx:
        bytes: 37980702
        multicast: 205548
        packets: 205548
      tx:
        bytes: 1212297
        packets: 6548
  - ifname: gdcenet0
    interfaceinfo:
    - address: 208.117.254.36
      prefixlen: 28
    - address: fe80::b816:3ff:fe9e:9c87
      prefixlen: 64
    linkinfo:
      flags: up|broadcast|multicast
      macAddress: ba:16:03:9e:9c:87
      mtu: 9000
    statistics:
      rx:
        bytes: 34160422968
        errors: 2
        multicast: 301129
        packets: 115435591
      tx:
        bytes: 64528301111
        packets: 181171964
     .. <remaining interfaces omitted>
   lastReportTime: "2022-03-30T07:35:44Z"

리소스 NodeSystemConfigUpdate

NodeSystemConfigUpdate 리소스를 사용하면 노드의 운영체제 구성을 변경하고 Kubelet 플래그를 수정할 수 있습니다. sysctl 변경사항 이외의 변경사항을 적용하려면 노드를 재부팅해야 합니다.

이 리소스를 인스턴스화할 때는 nodeSelector 필드에 타겟 노드를 지정해야 합니다. nodeSelector 필드에 각 타겟 노드의 모든 키-값 쌍을 포함해야 합니다. 이 필드에 대상 노드를 두 개 이상 지정하면 대상 노드가 한 번에 하나씩 업데이트됩니다.

주의: nodeName 필드는 지원 중단되었습니다. 이를 사용하면 로컬 컨트롤 플레인 노드를 비롯한 타겟 노드가 즉시 재부팅되어 중요한 워크로드가 중지될 수 있습니다.

NodeSystemConfigUpdate 리소스는 Distributed Cloud 연결에 특정한 다음 구성 필드를 제공합니다.

  • spec.containerRuntimeDNSConfig.ip: 비공개 이미지 레지스트리의 IP 주소 목록을 지정합니다.
  • spec.containerRuntimeDNSConfig: 각 Distributed Cloud 연결 노드에서 컨테이너 런타임 환경이 사용하는 맞춤 DNS 항목 목록을 지정합니다. 각 항목은 다음 필드로 구성됩니다.

    • ip: 타겟 IPv4 주소를 지정합니다.
    • domain: 해당 도메인을 지정합니다.
    • interface: ip 필드에 지정된 IP 주소에 연결할 수 있는 네트워크 이그레스 인터페이스를 지정합니다. CustomNetworkInterfaceConfig, Network (주석으로), NetworkAttachmentDefinition(주석으로) 리소스를 통해 정의된 인터페이스를 지정할 수 있습니다. 이 기능은 미리보기 수준 기능입니다.
  • spec.kubeletConfig.cpuManagerPolicy: Kubernetes CPUManager 정책을 지정합니다. 유효한 값은 NoneStatic입니다.

  • spec.kubeletConfig.topologyManagerPolicy: Kubernetes TopologyManager 정책을 지정합니다. 유효한 값은 None, BestEffort, Restricted, SingleNumaMode입니다.

  • spec.osConfig.hugePagesConfig: NUMA 노드별 huge page 구성을 지정합니다. 유효한 값은 2MB1GB입니다. 요청된 대량 페이지 수는 시스템의 두 NUMA 노드에 균등하게 분산됩니다. 예를 들어 각각 1GB인 Huge Page를 16개 할당하면 각 노드에 8GB가 사전 할당됩니다.

  • spec.osConfig.isolatedCpusPerSocket: 소켓당 격리된 CPU 수를 지정합니다. cpuManagerPolicyStatic로 설정된 경우에 필요합니다. 격리된 CPU의 최대 수는 노드의 총 CPU 수의 80% 미만이어야 합니다.

  • spec.osConfig.cpuIsolationPolicy: CPU 격리 정책을 지정합니다. Default 정책은 워크로드용으로 예약된 CPU에서 systemd 작업만 격리합니다. Kernel 정책은 CPU를 isolcpus로 표시하고 각 CPU에 rcu_nocb, nohz_full, rcu_nocb_poll 플래그를 설정합니다.

  • spec.sysctls.NodeLevel: 네트워크 기능 연산자를 사용하여 노드에서 전역으로 구성할 수 있는 sysctls 매개변수를 지정합니다. 구성 가능한 매개변수는 다음과 같습니다.

    • fs.inotify.max_user_instances
    • fs.inotify.max_user_watches
    • kernel.sched_rt_runtime_us
    • kernel.core_pattern
    • net.ipv4.tcp_wmem
    • net.ipv4.tcp_rmem
    • net.ipv4.tcp_slow_start_after_idle
    • net.ipv4.udp_rmem_min
    • net.ipv4.udp_wmem_min
    • net.ipv4.tcp_rmem
    • net.ipv4.tcp_wmem
    • net.core.rmem_max
    • net.core.wmem_max
    • net.core.rmem_default
    • net.core.wmem_default
    • net.netfilter.nf_conntrack_tcp_timeout_unacknowledged
    • net.netfilter.nf_conntrack_tcp_timeout_max_retrans
    • net.sctp.auth_enable
    • net.sctp.sctp_mem
    • net.ipv4.udp_mem
    • net.ipv4.tcp_mem
    • net.ipv4.tcp_slow_start_after_idle
    • net.sctp.auth_enable
    • vm.max_map_count

    tuning 컨테이너 네트워킹 인터페이스 (CNI) 플러그인을 사용하여 안전한 sysctls 매개변수와 안전하지 않은 sysctls 매개변수를 모두 특정 포드 또는 네임스페이스로 범위 지정할 수도 있습니다.

NodeSystemConfigUpdate 리소스는 다음과 같은 읽기 전용 일반 상태 필드를 제공합니다.

  • status.lastReportTime: 타겟 인터페이스의 상태가 보고된 가장 최근 시간입니다.
  • status.conditions.lastTransitionTime: 인터페이스의 조건이 변경된 가장 최근 시간입니다.
  • status.conditions.observedGeneration: 초기 조건이 기반한 .metadata.generation 값을 나타냅니다.
  • status.conditions.message: 인터페이스 조건의 변경사항을 설명하는 정보 메시지입니다.
  • status.conditions.reason: 인터페이스 조건의 마지막 변경 이유를 나타내는 프로그래매틱 식별자입니다.
  • status.conditions.status: 조건의 상태 설명자입니다. 유효한 값은 True, False, Unknown입니다.
  • status.conditions.type: camelCase의 조건 유형입니다.

다음 예시는 리소스의 구조를 보여줍니다.

apiVersion: networking.gke.io/v1
kind: NodeSystemConfigUpdate
metadata:
  name: node-pool-1-config
  namespace: default
spec:
  nodeSelector:
    baremetal.cluster.gke.io/node-pool: node-pool-1
    networking.gke.io/worker-network-sriov.capable: true
  sysctls:
    nodeLevel:
      "net.ipv4.udp_mem" : "12348035 16464042 24696060"
  kubeletConfig:
    topologyManagerPolicy: BestEffort
    cpuManagerPolicy: Static
  osConfig:
    hugePagesConfig:
      "TWO_MB": 0
      "ONE_GB": 16
    isolatedCpusPerSocket:
      "0": 10
      "1": 10

리소스 SriovNetworkNodePolicy

SriovNetworkNodePolicy 리소스를 사용하면 Distributed Cloud에 연결된 실제 머신에 SR-IOV 가상 함수 (VF) 그룹을 할당하고 해당 그룹을 Kubernetes 리소스로 인스턴스화할 수 있습니다. 그런 다음 NetworkAttachmentDefinition 리소스에서 이 리소스를 사용할 수 있습니다.

PCIe 공급업체 및 기기 ID, PCIe 기기 주소 또는 Linux 열거 기기 이름으로 각 타겟 VF를 선택할 수 있습니다. SR-IOV 네트워크 연산자는 각 물리적 네트워크 인터페이스를 구성하여 타겟 VF를 프로비저닝합니다. 여기에는 네트워크 인터페이스 펌웨어 업데이트, Linux 커널 드라이버 구성, 필요한 경우 Distributed Cloud 연결 머신 재부팅이 포함됩니다.

노드에서 사용할 수 있는 네트워크 인터페이스를 검색하려면 nf-operator 네임스페이스에서 해당 노드의 NetworkInterfaceState 리소스를 조회하면 됩니다.

다음 예시는 리소스의 구조를 보여줍니다.

apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: mlnx6-p2-sriov-en2
  namespace: sriov-network-operator
spec:
  deviceType: netdevice
  isRdma: true
  mtu: 9000
  nicSelector:
    pfNames:
    - enp134s0f1np1
  nodeSelector:
    edgecontainer.googleapis.com/network-sriov.capable: "true"
  numVfs: 31
  priority: 99
  resourceName: mlnx6_p2_sriov_en2

이전 예에서는 MTU 값이 9000 (허용되는 최대값)인 enp134s0f1np1라는 네트워크 인터페이스의 두 번째 포트에서 최대 31개의 VF를 만듭니다. SR-IOV를 지원하는 모든 Distributed Cloud 연결 노드에 있는 노드 선택기 라벨 edgecontainer.googleapis.com/network-sriov.capable를 사용합니다.

이 리소스 사용에 관한 자세한 내용은 SriovNetworkNodeState을 참고하세요.

리소스 SriovNetworkNodeState

SriovNetworkNodeState 읽기 전용 리소스를 사용하면 분산 클라우드 연결 노드에서 SriovNetworkNodePolicy 리소스의 프로비저닝 상태를 쿼리할 수 있습니다. 노드에 있는 SriovNetworkNodePolicy 리소스의 전체 구성과 노드에 있는 활성 VF 목록을 반환합니다. status.syncStatus 필드는 노드에 정의된 모든 SriovNetworkNodePolicy 리소스가 올바르게 적용되었는지 여부를 나타냅니다.

다음 예시는 리소스의 구조를 보여줍니다.

apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodeState
metadata:
  name: MyNode1
  namespace: sriov-network-operator
spec:
  dpConfigVersion: "1969684"
  interfaces:
  - mtu: 9000
    name: enp134s0f1np1
    numVfs: 31
    pciAddress: 0000:86:00.1
    vfGroups:
    - deviceType: netdevice
      mtu: 9000
      policyName: mlnx6-p2-sriov-en2
      resourceName: mlnx6_p2_sriov_en2
      vfRange: 0-30
status:

Status:
  Interfaces:
    Device ID:    1015
    Driver:       mlx5_core
    Link Speed:   25000 Mb/s
    Link Type:    ETH
    Mac:          ba:16:03:9e:9c:87
    Mtu:          9000
    Name:         eno1np0
    Pci Address:  0000:1a:00.0
    Vendor:       15b3
    Device ID:    1015
    Driver:       mlx5_core
    Link Speed:   25000 Mb/s
    Link Type:    ETH
    Mac:          ba:16:03:9e:9c:87
    Mtu:          9000
    Name:         eno2np1
    Pci Address:  0000:1a:00.1
    Vendor:       15b3
    Vfs:
  - Vfs:
    - deviceID: 101e
      driver: mlx5_core
      mac: c2:80:29:b5:63:55
      mtu: 9000
      name: enp134s0f1v0
      pciAddress: 0000:86:04.1
      vendor: 15b3
      vfID: 0
    - deviceID: 101e
      driver: mlx5_core
      mac: 7e:36:0c:82:d4:20
      mtu: 9000
      name: enp134s0f1v1
      pciAddress: 0000:86:04.2
      vendor: 15b3
      vfID: 1
      .. <omitted 29 other VFs here>
  syncStatus: Succeeded

이 리소스 사용에 관한 자세한 내용은 SriovNetworkNodeState을 참고하세요.

리소스 NetworkAttachmentDefinition

NetworkAttachmentDefinition 리소스를 사용하면 Distributed Cloud 포드를 Distributed Cloud 연결 노드의 하나 이상의 논리적 또는 물리적 네트워크에 연결할 수 있습니다. Multus-CNI 프레임워크와 다음 플러그인을 활용합니다.

주석을 사용하여 적절한 SriovNetworkNodePolicy 리소스의 이름을 참조합니다. 이 주석을 만들 때는 다음을 수행하세요.

  • k8s.v1.cni.cncf.io/resourceName 키를 사용합니다.
  • 값에 gke.io/ 접두사를 사용하고 그 뒤에 타겟 SriovNetworkNodePolicy 리소스의 이름을 사용합니다.

networking.gke.io/gdce-vlan-id 주석을 사용하여 타겟 네트워크의 VLAN ID를 지정합니다. 이 주석은 필수입니다.

다음 예는 리소스의 구조를 보여줍니다. IPv4 네트워킹

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: sriov-net1
  namespace: mynamespace
  annotations:
    k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx6_p2_sriov_en2
    networking.gke.io/gdce-vlan-id: 225

spec:
  config: '{
  "type": "sriov",
  "cniVersion": "0.3.1",
  "name": "sriov-network",
  "ipam": {
    "type": "host-local",
    "subnet": "10.56.217.0/24",
    "routes": [{
      "dst": "0.0.0.0/0"
    }],
    "gateway": "10.56.217.1"
  }
}'

IPv6 네트워킹의 경우:

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: sriov-210-den102
  annotations:
    k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx6_p0_sriov_en
    networking.gke.io/gdce-vlan-id: 225
spec:
  config: '{
  "type": "sriov",
  "cniVersion": "0.3.1",
  "name": "sriov-210-den102",
  "vlan": 210,
  
  "ipam": {
    "type": "host-local",
    "rangeStart": "2001:4860:1025:102:ffff:0220::2",
    "rangeEnd": "2001:4860:1025:102:ffff:0220::F",
    "subnet": "2001:4860:1025:102:ffff:0220::/96",
    "routes": [{
      "dst": "::/0"
    }],
    "gateway": "2001:4860:1025:102:ffff:0220::1"
  }
}'

SR-IOV VF를 사용하여 포드에서 보조 인터페이스 구성

SriovNetworkNodePolicy 리소스와 해당 NetworkAttachmentDefinition 리소스를 구성한 후 SR-IOV 가상 함수를 사용하여 Distributed Cloud 포드에서 보조 네트워크 인터페이스를 구성할 수 있습니다.

이렇게 하려면 다음과 같이 Distributed Cloud 포드 정의에 주석을 추가합니다.

  • 키: k8s.v1.cni.cncf.io/networks
  • 값: nameSpace/<NetworkAttachmentDefinition1,nameSpace/NetworkAttachmentDefinition2...

다음 예는 이 주석을 보여줍니다.

apiVersion: v1
kind: pod
metadata:
  name: sriovpod
  annotations:
    k8s.v1.cni.cncf.io/networks: mynamespace/sriov-net1
spec:
  containers:
  - name: sleeppodsriov
    command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"]
    image: alpine
    securityContext:
      capabilities:
        add:
          - NET_ADMIN

MacVLAN 드라이버를 사용하여 포드에 보조 인터페이스 구성

Distributed Cloud connected는 MacVLAN 드라이버를 사용하여 포드에 보조 네트워크 인터페이스를 만드는 것도 지원합니다. gdcenet0 인터페이스만 이 구성을 지원하며 컨테이너화된 워크로드를 실행하는 포드에서만 지원됩니다.

MacVLAN 드라이버를 사용하도록 인터페이스를 구성하려면 다음 단계를 따르세요.

  1. 다음 예와 같이 NetworkAttachmentDefinition 리소스를 구성합니다. IPv4 네트워킹의 경우:

     apiVersion: "k8s.cni.cncf.io/v1"
     kind: NetworkAttachmentDefinition
     metadata:
       name: macvlan-b400-1
       annotations:
         networking.gke.io/gdce-vlan-id: 400
     spec:
       config: '{
       "type": "macvlan",
       "master": "gdcenet0.400",
       "ipam": {
         "type": "static",
         "addresses": [
           {
             "address": "192.168.100.20/27",
             "gateway": "192.168.100.1"
           }
         ]
       ...
       }
     }'
    

    IPv6 네트워킹의 경우:

     apiVersion: "k8s.cni.cncf.io/v1"
     kind: NetworkAttachmentDefinition
     metadata:
       name: macvlan-bond0-210-den402
       annotations:
           networking.gke.io/gdce-vlan-id
     spec:
       config: '{
       "type": "macvlan",
       "cniVersion": "0.3.1",
       "name": "bond0-210",
       "master": "bond0.210",
    
       "ipam": {
         "type": "host-local",
         "rangeStart": "2001:4860:1025:102:0001:0210::2",
         "rangeEnd": "2001:4860:1025:102:0001:0210::F",
         "subnet": "2001:4860:1025:102:0001:0210::/96",
         "routes": [{
           "dst": "::/0"
         }],
         "gateway": "2001:4860:1025:102:0001:0210::1"
       }
     }'
    
  2. 다음과 같이 Distributed Cloud 포드 정의에 주석을 추가합니다. IPv4 네트워킹의 경우:

     apiVersion: v1
     kind: pod
     metadata:
       name: macvlan-testpod1
       annotations:
         k8s.v1.cni.cncf.io/networks: macvlan-b400-1
    

    IPv6 네트워킹의 경우:

     apiVersion: v1
     kind: Pod
     metadata:
       name: vlan210-1
       namespace: default
       annotations:
         k8s.v1.cni.cncf.io/networks: default/macvlan-bond0-210-den402
    

Distributed Cloud 다중 네트워킹을 사용하여 포드에 보조 인터페이스 구성

Distributed Cloud Connected는 멀티 네트워크 기능을 사용하여 포드에 보조 네트워크 인터페이스를 만들 수 있도록 지원합니다. 그러려면 다음 단계를 수행합니다.

  1. Network 리소스를 구성합니다. 예를 들면 다음과 같습니다.

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vlan200-network
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: vlan200-interface
      gateway4: 10.53.0.1
    
  2. 다음과 같이 Distributed Cloud 포드 정의에 주석을 추가합니다.

    apiVersion: v1
    kind: pod
    metadata:
      name: mypod
      annotations:
        networking.gke.io/interfaces: '[{"interfaceName":"eth1","network":"vlan200-network"}]'
        networking.gke.io/default-interface: eth1
    ...
    
    

    다음 단계