네트워크 기능 운영자

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

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

  • 노드에서 기존 네트워크 기기를 폴링합니다.
  • 노드의 각 네트워크 기기의 IP 주소와 물리적 링크 상태를 쿼리합니다.
  • 노드에 추가 네트워크 인터페이스를 프로비저닝합니다.
  • 고성능 워크로드를 지원하는 데 필요한 노드의 실제 머신에서 하위 수준 시스템 기능을 구성합니다.

네트워크 기능 운영자 프로필

Distributed Cloud Connected는 다음과 같은 네트워크 기능 운영자 기능을 제공합니다.

  • 네트워크 자동화 기능을 사용하면 워크로드 포드 네트워킹 구성을 자동화할 수 있습니다.

  • 상태 내보내기 기능을 사용하면 네트워크 인터페이스 구성 및 상태를 비롯한 호스트 네트워크 상태를 사용자에게 내보낼 수 있습니다.

  • 웹훅 함수를 사용하면 사용자 입력을 검증할 수 있습니다.

기본 요건

네트워크 기능 운영자는 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 플래그와 같은 하위 수준 시스템 기능을 구성할 수 있습니다.
  • NetworkAttachmentDefinition. Distributed Cloud 포드를 Distributed Cloud 연결 노드의 하나 이상의 논리적 또는 물리적 네트워크에 연결할 수 있습니다. 이 리소스에서 VLAN을 지정하기 전에 Distributed Cloud Edge Network API를 사용하여 해당 VLAN을 만들어야 합니다. 자세한 내용은 서브네트워크 만들기를 참고하세요.

네트워크 기능 연산자를 사용하면 보조 네트워크 인터페이스도 정의할 수 있습니다.

리소스 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-per-node-ipam-size: 개별 노드의 서브넷 마스크 크기를 지정합니다. 이를 생략하면 서브넷 마스크 크기가 nf-operator 네임스페이스의 nf-operator-defaults ConfigMap에 있는 cluster-cidr-config-per-node-mask-size 필드 값으로 설정됩니다.
  • annotations.networking.gke.io/gke-gateway-clusterip-cidr: Connect 게이트웨이를 통해 클러스터에 액세스하기 위한 CIDR 블록을 지정합니다. 이는 보조 네트워크 인터페이스에서 CoreDNS에 의해 사용됩니다.
  • annotations.networking.gke.io/gke-gateway-pod-cidr: 보조 네트워크 인터페이스에 할당할 수 있는 포드의 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 연결 머신의 기본 구성에는 uplink0이라는 결합된 네트워크 인터페이스가 포함됩니다. 이 인터페이스는 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"

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

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

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

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: my-network-410
      annotations:
          networking.gke.io/gdce-vlan-id: "410"
          networking.gke.io/gdce-lb-service-vip-cidrs: '[{"name":"myPool","addresses":["10.100.63.130-10.100.63.135"],"avoidBuggyIPs":false,"autoAssign":true}]'
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: gdcenet0.410
      gateway4: 10.100.63.129
      l2NetworkConfig:
        prefixLength4: 27
    

    networking.gke.io/gdce-lb-service-vip-cidrs 주석은 이 가상 네트워크의 하나 이상의 IP 주소 풀을 지정합니다. 여기에 지정하는 CIDR의 전반부에는 서비스 가상 IP(SVIP) 주소가 포함되어야 합니다. Distributed Cloud(연결형)는 다음과 같이 웹훅 검사를 통해 이 요구사항을 적용합니다.

    • SVIP 주소 범위는 해당 VLAN CIDR 범위 내에 있어야 합니다.
    • SVIP 주소 범위는 VLAN CIDR 범위의 상반부까지만 걸칠 수 있습니다.
  2. 다음과 같이 Distributed Cloud 포드 정의에 주석을 추가합니다.

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

    이 주석은 MetalLB를 사용한 Layer2 부하 분산으로 eth0 인터페이스를 기본으로, eth1 인터페이스를 보조로 구성합니다.

이 섹션에 설명된 대로 보조 인터페이스를 구성하면 다음 맞춤 리소스가 자동으로 생성됩니다.

  • 포드에 SVIP 주소를 자동으로 할당할 수 있는 IPAddressPool 리소스 예를 들면 다음과 같습니다.
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: test-410-pool
  namespace: kube-system
  annotations:
    networking.gke.io/network:my-network-410
    
  spec:
  addresses:
  - 10.100.63.130-10.100.63.135
  autoAssign: true
  • 지정된 SVIP 주소의 광고를 사용 설정하는 L2Advertisement 리소스 예를 들면 다음과 같습니다.
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2advertise-410
  namespace: kube-system
spec:
  ipAddressPools:
  - test-410-pool
  interfaces:
  - gdcenet0.410

## 다음 단계