이 페이지에서는 Google Distributed Cloud connected와 함께 제공되는 전문화된 네트워크 함수 Kubernetes 연산자를 설명합니다. 이 연산자는 Distributed Cloud connected가 고성능 워크로드를 실행할 수 있도록 하는 CustomResourceDefinitions (CRD) 집합을 구현합니다.
네트워크 함수 연산자 및 SR-IOV 기능은 Distributed Cloud connected 서버에서 사용할 수 없습니다.
네트워크 함수 연산자를 사용하면 다음 작업을 할 수 있습니다.
- 노드에서 기존 네트워크 기기를 폴링합니다.
- 노드의 각 네트워크 기기에 대한 IP 주소 및 물리적 링크 상태를 쿼리합니다.
- 노드에 추가 네트워크 인터페이스를 프로비저닝합니다.
- 고성능 워크로드를 지원하는 데 필요한 노드의 물리적 머신에서 하위 수준 시스템 기능을 구성합니다.
- PCI Express 네트워크 인터페이스에서 단일 루트 입력/출력 가상화 (SR-IOV)를 사용하여 여러 가상 인터페이스로 가상화합니다. 그런 다음 이러한 가상 네트워크 인터페이스를 사용하도록 Distributed Cloud connected 워크로드를 구성할 수 있습니다.
SR-IOV에 대한 Distributed Cloud connected 지원은 다음 오픈소스 프로젝트를 기반으로 합니다.
기본 요건
네트워크 함수 연산자는 Distributed Cloud Edge Network API에서 네트워크 구성을 가져옵니다.
이를 허용하려면 다음 명령어를 사용하여 네트워크 함수 연산자 서비스 계정에 Edge Network 뷰어 역할(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를 Google Cloud Distributed Cloud Edge Network API 리소스를 보유하는 프로젝트의 ID로 바꿉니다.CLUSTER_PROJECT_ID를 대상 Distributed Cloud connected 클러스터를 보유하는 프로젝트의 ID로 바꿉니다. Google Cloud
네트워크 함수 연산자 리소스
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 connected 노드의 하나 이상의 논리적 또는 물리적 네트워크에 연결할 수 있습니다. 이 리소스에서 VLAN을 지정하기 전에 Distributed Cloud Edge Network API를 사용하여 해당 VLAN을 만들어야 합니다. 자세한 내용은 네트워크 만들기를 참조하세요.
네트워크 함수 연산자를 사용하면 SR-IOV 가상 함수를 사용하지 않는 보조 네트워크 인터페이스를 정의할 수도 있습니다.
Network 리소스
Network 리소스는 Distributed Cloud connected 랙 내에서 가상 네트워크를 정의합니다. Distributed Cloud connected 클러스터 내의 포드는 이 가상 네트워크를 사용하여 내부 및 외부 리소스와 통신할 수 있습니다.
Network 리소스는 쓰기 가능한 필드로 노출된 네트워크 인터페이스에 대해 다음과 같은 구성 가능한 매개변수를 제공합니다.
spec.type: 이 네트워크의 네트워크 전송 계층을 지정합니다. 유일한 유효한 값은L2입니다.nodeInterfaceMatcher.interfaceName값도 지정해야 합니다.spec.nodeInterfaceMatcher.interfaceName: 이 네트워크와 함께 사용할 대상 Distributed Cloud connected 노드의 물리적 네트워크 인터페이스 이름입니다.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 connected 머신의 기본 구성에는 gdcenet0이라는 rNDC(Rack Select Network Daughter Card)의 결합된 네트워크 인터페이스가 포함됩니다. 이 인터페이스는 eno1np0 및 eno2np1 네트워크 인터페이스를 결합합니다. 각각 하나의 Distributed Cloud 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 connected에 특정한 다음과 같은 구성 필드를 제공합니다.
spec.containerRuntimeDNSConfig.ip: 비공개 이미지 레지스트리의 IP 주소 목록을 지정합니다.spec.containerRuntimeDNSConfig: 각 Distributed Cloud connected 노드의 컨테이너 런타임 환경에서 사용하는 커스텀 DNS 항목 목록을 지정합니다. 각 항목은 다음 필드로 구성됩니다.ip: 대상 IPv4 주소를 지정합니다.domain: 해당 도메인을 지정합니다.interface:ip필드에 지정된 IP 주소에 연결할 수 있는 네트워크 이그레스 인터페이스를 지정합니다. 다음 리소스를 통해 정의된 인터페이스를 지정할 수 있습니다.CustomNetworkInterfaceConfig,Network(주석별),NetworkAttachmentDefinition(주석별). 이 기능은 미리보기 수준입니다.
spec.kubeletConfig.cpuManagerPolicy: Kubernetes CPUManager 정책을 지정합니다. 유효한 값은None및Static입니다.spec.kubeletConfig.topologyManagerPolicy: Kubernetes TopologyManager 정책을 지정합니다. 유효한 값은None,BestEffort,Restricted,SingleNumaMode입니다.spec.osConfig.hugePagesConfig: NUMA 노드당 거대 페이지 구성을 지정합니다. 유효한 값은2MB및1GB입니다. 요청된 거대 페이지 수는 시스템의 두 NUMA 노드에 균등하게 분산됩니다. 예를 들어 각각 1GB의 거대 페이지 16개를 할당하면 각 노드는 8GB의 사전 할당을 받습니다.spec.osConfig.isolatedCpusPerSocket: 소켓당 격리된 CPU 수를 지정합니다.cpuManagerPolicy가Static으로 설정된 경우 필수입니다. 격리된 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_instancesfs.inotify.max_user_watcheskernel.sched_rt_runtime_uskernel.core_patternnet.ipv4.tcp_wmemnet.ipv4.tcp_rmemnet.ipv4.tcp_slow_start_after_idlenet.ipv4.udp_rmem_minnet.ipv4.udp_wmem_minnet.ipv4.tcp_rmemnet.ipv4.tcp_wmemnet.core.rmem_maxnet.core.wmem_maxnet.core.rmem_defaultnet.core.wmem_defaultnet.netfilter.nf_conntrack_tcp_timeout_unacknowledgednet.netfilter.nf_conntrack_tcp_timeout_max_retransnet.sctp.auth_enablenet.sctp.sctp_memnet.ipv4.udp_memnet.ipv4.tcp_memnet.ipv4.tcp_slow_start_after_idlenet.sctp.auth_enablevm.max_map_count
`tuning` 컨테이너 네트워킹 인터페이스 (CNI) 플러그인을 사용하여 안전한 `sysctls` 매개변수와 안전하지 않은 `sysctls`
sysctls매개변수를 모두 특정 포드 또는 네임스페이스로 범위 지정할 수도 있습니다.tuning
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 connected 물리적 머신에서 SR-IOV 가상 함수 (VF) 그룹을 할당하고 해당 그룹을 Kubernetes 리소스로 인스턴스화할 수 있습니다. 그런 다음 NetworkAttachmentDefinition 리소스에서 이 리소스를 사용할 수 있습니다.
각 대상 VF는 PCIe 공급업체 및 기기 ID, PCIe 기기 주소 또는 Linux 열거 기기 이름으로 선택할 수 있습니다. SR-IOV 네트워크 연산자는 대상 VF를 프로비저닝하도록 각 물리적 네트워크 인터페이스를 구성합니다. 여기에는 네트워크 인터페이스 펌웨어 업데이트, Linux 커널 드라이버 구성, 필요한 경우 Distributed Cloud connected 머신 재부팅이 포함됩니다.
노드에서 사용할 수 있는 네트워크 인터페이스를 검색하려면
NetworkInterfaceState 리소스
를 nf-operator 네임스페이스에서 해당 노드에 조회하면 됩니다.
다음 예에서는 리소스의 구조를 보여줍니다.
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 connected 노드에 있는 노드 선택기 라벨 edgecontainer.googleapis.com/network-sriov.capable을 사용합니다.
이 리소스 사용에 대한 자세한 내용은
SriovNetworkNodeState를 참조하세요.
SriovNetworkNodeState 리소스
SriovNetworkNodeState 읽기 전용 리소스를 사용하면 Distributed Cloud connected 노드에서 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 connected 노드의 하나 이상의 논리적 또는 물리적 네트워크에 연결할 수 있습니다. 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 드라이버를 사용하도록 인터페이스를 구성하려면 다음 단계를 따르세요.
다음 예와 같이
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" } }'다음과 같이 Distributed Cloud 포드 정의에 주석을 추가합니다. IPv4 네트워킹의 경우
apiVersion: v1 kind: pod metadata: name: macvlan-testpod1 annotations: k8s.v1.cni.cncf.io/networks: macvlan-b400-1IPv6 네트워킹의 경우
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는 다중 네트워크 기능을 사용하여 포드에서 보조 네트워크 인터페이스를 만드는 것을 지원합니다. 그러려면 다음 단계를 수행합니다.
Network리소스를 구성합니다. 예를 들면 다음과 같습니다.apiVersion: networking.gke.io/v1 kind: Network metadata: name: vlan200-network spec: type: L2 nodeInterfaceMatcher: interfaceName: vlan200-interface gateway4: 10.53.0.1다음과 같이 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 ...다음 단계