이 페이지에서는 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-defaultsConfigMap에 있는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이라는 결합된 네트워크 인터페이스가 포함됩니다. 이 인터페이스는 eno1np0 및 eno2np1 네트워크 인터페이스를 결합합니다. 각각 하나의 분산 클라우드 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는 멀티 네트워크 기능을 사용하여 포드에 보조 네트워크 인터페이스를 만들 수 있도록 지원합니다. 그러려면 다음 단계를 수행합니다.
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: 27networking.gke.io/gdce-lb-service-vip-cidrs주석은 이 가상 네트워크의 하나 이상의 IP 주소 풀을 지정합니다. 여기에 지정하는 CIDR의 전반부에는 서비스 가상 IP(SVIP) 주소가 포함되어야 합니다. Distributed Cloud(연결형)는 다음과 같이 웹훅 검사를 통해 이 요구사항을 적용합니다.- SVIP 주소 범위는 해당 VLAN CIDR 범위 내에 있어야 합니다.
- SVIP 주소 범위는 VLAN CIDR 범위의 상반부까지만 걸칠 수 있습니다.
다음과 같이 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
## 다음 단계