Operator Fungsi Jaringan

Halaman ini menjelaskan operator Kubernetes Network Function khusus yang disertakan dalam Google Distributed Cloud connected. Operator ini mengimplementasikan serangkaian CustomResourceDefinitions (CRD) yang memungkinkan Distributed Cloud yang terhubung mengeksekusi workload berperforma tinggi.

Operator Network Function memungkinkan Anda melakukan hal berikut:

  • Polling untuk perangkat jaringan yang ada di node.
  • Kueri alamat IP dan status link fisik untuk setiap perangkat jaringan di node.
  • Menyediakan antarmuka jaringan tambahan pada node.
  • Mengonfigurasi fitur sistem tingkat rendah di mesin fisik node yang diperlukan untuk mendukung workload berperforma tinggi.

Profil operator Fungsi Jaringan

Distributed Cloud connected menyediakan fungsi operator Network Function berikut:

  • Fungsi otomatisasi jaringan memungkinkan Anda mengotomatiskan konfigurasi jaringan Pod workload Anda.

  • Fungsi ekspor status memungkinkan Anda mengekspor status jaringan host ke pengguna, termasuk konfigurasi dan status antarmuka jaringan.

  • Fungsi webhook memungkinkan Anda memvalidasi input pengguna.

Prasyarat

Operator Network Function mengambil konfigurasi jaringan dari Distributed Cloud Edge Network API. Untuk mengizinkannya, Anda harus memberikan peran Edge Network Viewer (roles/edgenetwork.viewer) kepada akun layanan operator Network Function menggunakan perintah berikut:

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]"

Ganti kode berikut:

  • ZONE_PROJECT_ID dengan ID project Google Cloud yang menyimpan resource Distributed Cloud Edge Network API.
  • CLUSTER_PROJECT_ID dengan ID project Google Cloud yang menyimpan target cluster yang terhubung ke Distributed Cloud.

Resource operator Network Function

Operator Fungsi Jaringan yang terhubung Distributed Cloud menerapkan CRD Kubernetes berikut:

  • Network. Menentukan jaringan virtual yang dapat digunakan pod untuk berkomunikasi dengan resource internal dan eksternal. Anda harus membuat VLAN yang sesuai menggunakan Distributed Cloud Edge Network API sebelum menentukannya di resource ini. Untuk mengetahui petunjuknya, lihat Membuat subnetwork.
  • NetworkInterfaceState. Mengaktifkan penemuan status antarmuka jaringan dan membuat kueri antarmuka jaringan untuk status link dan alamat IP.
  • NodeSystemConfigUpdate. Mengaktifkan konfigurasi fitur sistem tingkat rendah seperti opsi kernel dan flag Kubelet.
  • NetworkAttachmentDefinition. Memungkinkan Anda melampirkan pod Distributed Cloud ke satu atau beberapa jaringan logis atau fisik di node Distributed Cloud yang terhubung. Anda harus membuat VLAN yang sesuai menggunakan Distributed Cloud Edge Network API sebelum menentukannya di resource ini. Untuk mengetahui petunjuknya, lihat Membuat subnetwork.

Operator Network Function juga memungkinkan Anda menentukan antarmuka jaringan sekunder.

Resource Network

Resource Network menentukan jaringan virtual dalam deployment yang terhubung ke Distributed Cloud yang dapat digunakan pod dalam cluster yang terhubung ke Distributed Cloud untuk berkomunikasi dengan resource internal dan eksternal.

Resource Network menyediakan parameter yang dapat dikonfigurasi berikut untuk antarmuka jaringan yang diekspos sebagai kolom yang dapat ditulis:

  • spec.type: menentukan lapisan transport jaringan untuk jaringan ini. Satu-satunya nilai yang valid adalah L2. Anda juga harus menentukan nilai nodeInterfaceMatcher.interfaceName.
  • spec.nodeInterfaceMatcher.interfaceName: nama antarmuka jaringan fisik pada node target yang terhubung ke Distributed Cloud yang akan digunakan dengan jaringan ini.
  • spec.gateway4: alamat IP gateway jaringan untuk jaringan ini.
  • spec.l2NetworkConfig.prefixLength4: menentukan rentang CIDR untuk jaringan ini.
  • annotations.networking.gke.io/gdce-per-node-ipam-size: menentukan ukuran subnet mask untuk setiap node. Jika ini dihilangkan, ukuran subnet mask akan ditetapkan ke nilai kolom cluster-cidr-config-per-node-mask-size di ConfigMap nf-operator-defaults di namespace nf-operator.
  • annotations.networking.gke.io/gke-gateway-clusterip-cidr: menentukan blok CIDR untuk mengakses cluster melalui gateway Connect. Alamat ini digunakan oleh CoreDNS pada antarmuka jaringan sekunder.
  • annotations.networking.gke.io/gke-gateway-pod-cidr: menentukan blok CIDR untuk Pod yang dapat dialokasikan pada antarmuka jaringan sekunder.
  • annotations.networking.gke.io/gdce-vlan-id: menentukan ID VLAN untuk jaringan ini.
  • annotations.networking.gke.io/gdce-vlan-mtu: (opsional) menentukan nilai MTU untuk jaringan ini. Jika tidak ditentukan, mewarisi nilai MTU dari antarmuka induk.
  • annotations.networking.gke.io/gdce-lb-service-vip-cidr: menentukan rentang alamat IP virtual untuk layanan load balancing. Nilai dapat berupa blok CIDR atau nilai rentang alamat eksplisit. Anotasi ini wajib untuk load balancing Lapisan 3 dan opsional untuk load balancing Lapisan 2.

Contoh berikut mengilustrasikan struktur resource:

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

Untuk menentukan beberapa rentang alamat IP virtual untuk layanan load balancing, gunakan anotasi networking.gke.io/gdce-lb-service-vip-cidrs. Anda dapat memberikan nilai untuk anotasi ini sebagai daftar yang dipisahkan koma atau sebagai payload JSON. Contoh:

[
  {
    "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
  }
]

Jika Anda memilih untuk menggunakan payload JSON, sebaiknya gunakan format JSON ringkas. Contoh:

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

Perhatikan bahwa kolom autoAssign secara default adalah false jika tidak diisi.

Resource NetworkInterfaceState

Resource NetworkInterfaceState adalah resource hanya baca yang memungkinkan Anda menemukan antarmuka jaringan fisik di node dan mengumpulkan statistik runtime tentang traffic jaringan yang mengalir melalui antarmuka tersebut. Distributed Cloud membuat resource NetworkInterfaceState untuk setiap node dalam cluster.

Konfigurasi default mesin yang terhubung ke Distributed Cloud mencakup antarmuka jaringan gabungan bernama uplink0. Antarmuka ini menggabungkan antarmuka jaringan eno1np0 dan eno2np1. Setiap koneksi tersebut terhubung ke satu switch ToR Distributed Cloud.

Resource NetworkInterfaceState menyediakan kategori informasi antarmuka jaringan berikut yang diekspos sebagai kolom status hanya baca.

Informasi umum:

  • status.interfaces.ifname: nama antarmuka jaringan target.
  • status.lastReportTime: waktu dan tanggal laporan status terakhir untuk antarmuka target.

Informasi konfigurasi alamat IP:

  • status.interfaces.interfaceinfo.address: alamat IP yang ditetapkan ke antarmuka target.
  • status.interfaces.interfaceinfo.dns: alamat IP server DNS yang ditetapkan ke antarmuka target.
  • status.interfaces.interfaceinfo.gateway: alamat IP gateway jaringan yang melayani antarmuka target.
  • status.interfaces.interfaceinfo.prefixlen: panjang awalan IP.

Informasi hardware:

  • status.interfaces.linkinfo.broadcast: alamat MAC siaran dari antarmuka target.
  • status.interfaces.linkinfo.businfo: jalur perangkat PCIe dalam format bus:slot.function.
  • status.interfaces.linkinfo.flags: tanda antarmuka—misalnya, BROADCAST.
  • status.interfaces.linkinfo.macAddress: alamat MAC Unicast dari antarmuka target.
  • status.interfaces.linkinfo.mtu: nilai MTU untuk antarmuka target.

Statistik penerimaan:

  • status.interfaces.statistics.rx.bytes: total byte yang diterima oleh antarmuka target.
  • status.interfaces.statistics.rx.dropped: total paket yang dihentikan oleh antarmuka target.
  • status.interfaces.statistics.rx.errors: total error penerimaan paket untuk antarmuka target.
  • status.interfaces.statistics.rx.multicast: total paket multicast yang diterima oleh antarmuka target.
  • status.interfaces.statistics.rx.overErrors: total penerimaan paket melalui error untuk antarmuka target.
  • status.interfaces.statistics.rx.packets: total paket yang diterima oleh antarmuka target.

Statistik transmisi:

  • status.interfaces.statistics.tx.bytes: total byte yang ditransmisikan oleh antarmuka target.
  • status.interfaces.statistics.tx.carrierErrors: total error operator yang dialami oleh antarmuka target.
  • status.interfaces.statistics.tx.collisions: total tabrakan paket yang dialami oleh antarmuka target.
  • status.interfaces.statistics.tx.dropped: total paket yang dihentikan oleh antarmuka target.
  • status.interfaces.statistics.tx.errors: total error transmisi untuk antarmuka target.
  • status.interfaces.statistics.tx.packets: total paket yang dikirimkan oleh antarmuka target.

Contoh berikut mengilustrasikan struktur resource:

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"

Mengonfigurasi antarmuka sekunder pada pod menggunakan multi-jaringan Distributed Cloud

Distributed Cloud Connected mendukung pembuatan antarmuka jaringan sekunder pada pod menggunakan fitur multi-jaringannya. Untuk melakukannya, selesaikan langkah-langkah berikut:

  1. Konfigurasi resource Network. Contoh:

    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
    

    Anotasi networking.gke.io/gdce-lb-service-vip-cidrs menentukan satu atau beberapa kumpulan alamat IP untuk jaringan virtual ini. Setengah pertama CIDR yang Anda tentukan di sini harus mencakup alamat IP Virtual Layanan (SVIP). Distributed Cloud connected menerapkan persyaratan ini melalui pemeriksaan webhook sebagai berikut:

    • Rentang alamat SVIP harus berada dalam rentang CIDR VLAN yang sesuai, dan
    • Rentang alamat SVIP hanya dapat mencakup hingga setengah pertama rentang CIDR VLAN.
  2. Tambahkan anotasi ke definisi pod Distributed Cloud Anda sebagai berikut:

    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
    

    Anotasi ini mengonfigurasi antarmuka eth0 sebagai primer dan antarmuka eth1 sebagai sekunder dengan load balancing Layer2 dengan MetalLB.

Mengonfigurasi antarmuka sekunder seperti yang dijelaskan di bagian ini akan menghasilkan pembuatan otomatis resource kustom berikut:

  • Resource IPAddressPool, yang memungkinkan penetapan alamat SVIP otomatis ke Pod. Contoh:
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
  • Resource L2Advertisement, yang memungkinkan pengiklanan alamat SVIP yang ditentukan. Contoh:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2advertise-410
  namespace: kube-system
spec:
  ipAddressPools:
  - test-410-pool
  interfaces:
  - gdcenet0.410

## Langkah selanjutnya