Questa pagina descrive i passaggi per eseguire il deployment dei workload sull'hardware Google Distributed Cloud e le limitazioni che devi rispettare durante la configurazione dei workload.
Prima di completare questi passaggi, devi soddisfare i requisiti di installazione di Distributed Cloud e ordinare l'hardware Distributed Cloud.
Quando il rack Google Distributed Cloud arriva a destinazione, è preconfigurato con hardware, Google Cloude alcune impostazioni di rete che hai specificato al momento dell'ordine di Distributed Cloud.
Gli installatori di Google completano l'installazione fisica e l'amministratore di sistema connette Distributed Cloud alla tua rete locale.
Una volta connesso alla rete locale, l'hardware comunica con Google Cloud per scaricare gli aggiornamenti software e connettersi al tuo progettoGoogle Cloud . A questo punto, puoi eseguire il provisioning dei node pool e il deployment dei carichi di lavoro su Distributed Cloud.
Panoramica del deployment
Per eseguire il deployment di un workload sull'hardware Distributed Cloud, completa i seguenti passaggi:
(Facoltativo) Abilita l'API Distributed Cloud Edge Network.
(Facoltativo) Inizializza la configurazione di rete della tua zona Distributed Cloud.
(Facoltativo) Configura il networking di Distributed Cloud.
(Facoltativo) Attiva il supporto per le chiavi di crittografia gestite dal cliente (CMEK) per l'archiviazione locale se vuoi eseguire l'integrazione con Cloud Key Management Service per attivare il supporto per le CMEK per i dati del tuo workload. Per informazioni su come Distributed Cloud cripta i dati dei workload, consulta Sicurezza dell'archiviazione locale.
Crea un node pool. In questo passaggio, assegni i nodi a un pool di nodi e, se vuoi, configuri il pool di nodi in modo che utilizzi Cloud KMS per eseguire il wrapping e l'unwrapping della passphrase Linux Unified Key Setup (LUKS) per criptare i dati del workload.
Ottieni le credenziali per un cluster per testarlo.
Concedi agli utenti l'accesso al cluster assegnando loro il ruolo Visualizzatore Edge Container (
roles/edgecontainer.viewer) o il ruolo Amministratore Edge Container (roles/edgecontainer.admin) nel progetto.(Facoltativo) Attiva il supporto GPU per eseguire workload basati su GPU su Distributed Cloud.
(Facoltativo) Connetti il cluster Distributed Cloud a Google Cloud:
(Facoltativo) Configura l'accesso privato Google per consentire ai pod di accedere alle API e ai serviziGoogle Cloud utilizzando Cloud VPN.
(Facoltativo) Configura Private Service Connect per consentire ai tuoi pod di accedere Google Cloud a API e servizi utilizzando Cloud VPN.
Esegui il deployment del bilanciatore del carico NGINX come servizio
L'esempio seguente illustra come eseguire il deployment del server NGINX ed esporlo come servizio su un cluster Distributed Cloud:
Crea un file YAML denominato
nginx-deployment.yamlcon i seguenti contenuti:apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
Applica il file YAML al cluster utilizzando questo comando:
kubectl apply -f nginx-deployment.yaml
Crea un file YAML denominato
nginx-service.yamlcon i seguenti contenuti:apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: LoadBalancer selector: app: nginx ports: - protocol: TCP port: 8080 targetPort: 80
Applica il file YAML al cluster utilizzando questo comando:
kubectl apply -f nginx-deployment.yaml
Recupera l'indirizzo IP esterno assegnato al servizio dal bilanciatore del carico MetalLB utilizzando questo comando:
kubectl get services
Il comando restituisce un output simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service LoadBalancer 10.51.195.25 10.100.68.104 8080:31966/TCP 11d
Esegui il deployment di un container con funzioni SR-IOV
Il seguente esempio mostra come eseguire il deployment di un pod che utilizza le funzionalità dell'operatore di funzioni di rete SR-IOV di Distributed Cloud.
Crea i componenti di rete Distributed Cloud
Crea i componenti di rete Distributed Cloud richiesti nel seguente modo. Per saperne di più su questi componenti, consulta Funzionalità di networking di Distributed Cloud.
Crea una rete:
gcloud edge-cloud networking networks create NETWORK_NAME \ --location=REGION \ --zone=ZONE_NAME \ --mtu=MTU_SIZESostituisci quanto segue:
NETWORK_NAME: un nome descrittivo che identifica in modo univoco questa rete.REGION: la regione Google Cloud a cui appartiene la zona Distributed Cloud di destinazione.ZONE_NAME: il nome della zona Distributed Cloud di destinazione.MTU_SIZE: la dimensione dell'unità massima di trasmissione (MTU) per questa rete. I valori validi sono 1500 e 9000. Questo valore deve corrispondere alle dimensioni MTU della retedefaulted essere uguale per tutte le reti.
Creare una subnet:
gcloud edge-cloud networking subnets create SUBNETWORK_NAME \ --network=NETWORK_NAME \ --ipv4-range=IPV4_RANGE \ --vlan-id=VLAN_ID \ --location=REGION \ --zone=ZONE_NAMESostituisci quanto segue:
SUBNETWORK_NAME: un nome descrittivo che identifica in modo univoco questa subnet.NETWORK_NAME: la rete che incapsula questa subnet.IPV4_RANGE: l'intervallo di indirizzi IPv4 coperto da questa subnet nel formato indirizzo IP/prefisso.VLAN_ID: l'ID VLAN di destinazione per questa subnet.REGION: la regione Google Cloud a cui appartiene la zona Distributed Cloud di destinazione.ZONE_NAME: il nome della zona Distributed Cloud di destinazione.
Monitora lo stato della subnet finché non viene creata correttamente:
watch -n 30 'gcloud edge-cloud networking subnets list \ --location=REGION \ --zone=ZONE_NAMESostituisci quanto segue:
REGION: la regione Google Cloud a cui appartiene la zona Distributed Cloud di destinazione.ZONE_NAME: il nome della zona Distributed Cloud di destinazione.
Lo stato passa da
PENDINGaPROVISIONINGe infine aRUNNING.Registra l'ID VLAN, il blocco CIDR della subnet e l'indirizzo IP gateway per il blocco CIDR. Utilizzerai questi valori più avanti in questa procedura.
Configurare le risorse NodeSystemConfigUpdate
Configura una risorsa operatore di funzione di rete NodeSystemConfigUpdate per ogni nodo
nel cluster nel seguente modo.
Elenca i nodi in esecuzione nel pool di nodi del cluster di destinazione utilizzando questo comando:
kubectl get nodes | grep -v master
Il comando restituisce un output simile al seguente:
NAME STATUS ROLES AGE VERSION pool-example-node-1-01-b2d82cc7 Ready <none> 2d v1.22.8-gke.200 pool-example-node-1-02-52ddvfc9 Ready <none> 2d v1.22.8-gke.200Registra i nomi dei nodi restituiti e deriva i relativi nomi brevi. Ad esempio, per il nodo
pool-example-node-1-01-b2d82cc7, il nome breve ènode101.Per ogni nodo registrato nel passaggio precedente, crea un file di risorse
NodeSystemConfigUpdatededicato con i seguenti contenuti:apiVersion: networking.gke.io/v1 kind: NodeSystemConfigUpdate metadata: name: nodesystemconfigupdate-NODE_SHORT_NAME namespace: nf-operator spec: kubeletConfig: cpuManagerPolicy: Static topologyManagerPolicy: SingleNumaNode nodeName: NODE_NAME osConfig: hugePagesConfig: ONE_GB: 2 TWO_MB: 0 isolatedCpusPerSocket: "0": 40 "1": 40 sysctls: nodeLevel: net.core.rmem_max: "8388608" net.core.wmem_max: "8388608"
Sostituisci quanto segue:
NODE_NAME: il nome completo del nodo di destinazione. Ad esempio,pool-example-node-1-01-b2d82cc7.NODE_SHORT_NAME: il nome breve del nodo di destinazione derivato dal suo nome completo. Ad esempio,node101.
Assegna un nome a ogni file
node-system-config-update-NODE_SHORT_NAME.yaml.Applica ciascuno dei file di risorse
NodeSystemConfigUpdateal cluster utilizzando il seguente comando:kubectl apply -f node-system-config-update-NODE_SHORT_NAME.yaml
Sostituisci
NODE_SHORT_NAMEcon il nome breve del nodo di destinazione corrispondente.Quando applichi le risorse al cluster, ogni nodo interessato viene riavviato, il che può richiedere fino a 30 minuti.
- Monitora lo stato dei nodi interessati finché non sono stati riavviati correttamente:
kubectl get nodes | grep -v master
Lo stato di ogni nodo passa da
not-readyareadyal termine dei riavvii.
Configura gli switch ToR per le funzioni di rete SR-IOV
Segui i passaggi descritti in questa sezione per configurare le interfacce di rete in ogni switch ToR Distributed Cloud nel rack Distributed Cloud per il funzionamento delle funzioni di rete SR-IOV.
Crea un file denominato
mlnc6-pcie1-tor1-sriov.yamlcon i seguenti contenuti. Questo file configura la prima interfaccia di rete sul primo switch ToR.apiVersion: sriovnetwork.k8s.cni.cncf.io/v1 kind: SriovNetworkNodePolicy metadata: name: mlnx6-pcie1-tor1-sriov namespace: sriov-network-operator spec: deviceType: netdevice isRdma: false linkType: eth mtu: 9000 nicSelector: pfNames: - enp59s0f0np0 nodeSelector: edgecontainer.googleapis.com/network-sriov.capable: "true" numVfs: 31 priority: 99 resourceName: mlnx6_pcie1_tor1_sriov
Crea un file denominato
mlnc6-pcie1-tor2-sriov.yamlcon i seguenti contenuti. Questo file configura la seconda interfaccia di rete sul primo switch ToR.apiVersion: sriovnetwork.k8s.cni.cncf.io/v1 kind: SriovNetworkNodePolicy metadata: name: mlnx6-pcie1-tor2-sriov namespace: sriov-network-operator spec: deviceType: netdevice isRdma: false linkType: eth mtu: 9000 nicSelector: pfNames: - enp59s0f1np1 nodeSelector: edgecontainer.googleapis.com/network-sriov.capable: "true" numVfs: 31 priority: 99 resourceName: mlnx6_pcie1_tor2_sriov
Crea un file denominato
mlnc6-pcie2-tor1-sriov.yamlcon i seguenti contenuti. Questo file configura la prima interfaccia di rete sul secondo switch ToR.apiVersion: sriovnetwork.k8s.cni.cncf.io/v1 kind: SriovNetworkNodePolicy metadata: name: mlnx6-pcie2-tor1-sriov namespace: sriov-network-operator spec: deviceType: netdevice isRdma: false linkType: eth mtu: 9000 nicSelector: pfNames: - enp216s0f0np0 nodeSelector: edgecontainer.googleapis.com/network-sriov.capable: "true" numVfs: 31 priority: 99 resourceName: mlnx6_pcie2_tor1_sriov
Crea un file denominato
mlnc6-pcie2-tor2-sriov.yamlcon i seguenti contenuti. Questo file configura la seconda interfaccia di rete sul secondo switch ToR.apiVersion: sriovnetwork.k8s.cni.cncf.io/v1 kind: SriovNetworkNodePolicy metadata: name: mlnx6-pcie2-tor2-sriov namespace: sriov-network-operator spec: deviceType: netdevice isRdma: false linkType: eth mtu: 9000 nicSelector: pfNames: - enp216s0f1np1 nodeSelector: edgecontainer.googleapis.com/network-sriov.capable: "true" numVfs: 31 priority: 99 resourceName: mlnx6_pcie2_tor2_sriov
Applica i file di configurazione ToR al cluster utilizzando i seguenti comandi:
kubectl apply -f mlnc6-pcie1-tor1-sriov.yaml kubectl apply -f mlnc6-pcie1-tor2-sriov.yaml kubectl apply -f mlnc6-pcie2-tor1-sriov.yaml kubectl apply -f mlnc6-pcie2-tor2-sriov.yaml
I nodi interessati vengono isolati, svuotati e riavviati.
Monitora lo stato dei nodi utilizzando il seguente comando:
watch -n 5 'kubectl get sriovnetworknodestates -o yaml -A | \ grep "syncStatus\|pool-"|sed "N;s/\n/ /"'
Quando tutti i nodi interessati mostrano
syncStatus: Succeeded, premi Ctrl+C per uscire dal ciclo del comando di monitoraggio.Il comando restituisce un output simile al seguente, che indica che le funzionalità della funzione di rete SR-IOV sono state abilitate sugli switch ToR:
Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 2520m (3%) 7310m (9%) memory 3044Mi (1%) 9774Mi (3%) ephemeral-storage 0 (0%) 0 (0%) hugepages-1Gi 0 (0%) 0 (0%) hugepages-2Mi 0 (0%) 0 (0%) devices.kubevirt.io/kvm 0 0 devices.kubevirt.io/tun 0 0 devices.kubevirt.io/vhost-net 0 0 gke.io/mlnx6_pcie1_tor1_sriov 3 3 gke.io/mlnx6_pcie1_tor2_sriov 0 0 gke.io/mlnx6_pcie2_tor1_sriov 0 0 gke.io/mlnx6_pcie2_tor2_sriov 0 0
Configurare una risorsa NetworkAttachmentDefinition
Configura una risorsa NetworkAttachmentDefinition per il cluster nel seguente modo:
Crea un file denominato
network-attachment-definition.yamlcon il seguente contenuto:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-net1 annotations: k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx6_pcie1_tor1_sriov spec: config: '{ "type": "sriov", "cniVersion": "0.3.1", "vlan": VLAN_ID, "name": "sriov-network", "ipam": { "type": "host-local", "subnet": "SUBNETWORK_CIDR", "routes": [{ "dst": "0.0.0.0/0" }], "gateway": "GATEWAY_ADDRESS" } }'
Sostituisci quanto segue:
VLAN_ID: l'ID VLAN della subnet che hai creato in precedenza in questa guida.SUBNETWORK_CIDR: il blocco CIDR per la subnet.GATEWAY_ADDRESS: l'indirizzo IP del gateway per la subnet.
Applica la risorsa al cluster utilizzando questo comando:
kubectl apply -f network-attachment-definition.yaml
Esegui il deployment di un pod con funzioni di rete SR-IOV
Completa i passaggi descritti in questa sezione per eseguire il deployment di un pod con funzioni di rete SR-IOV sul cluster. Il campo annotations nel file di configurazione del pod specifica il nome della risorsa NetworkAttachmentDefinition che hai creato in precedenza in questa guida e lo spazio dei nomi in cui è stato eseguito il deployment (default in questo esempio).
Crea un file di specifiche del pod denominato
sriovpod.yamlcon i seguenti contenuti:apiVersion: v1 kind: Pod metadata: name: sriovpod annotations: k8s.v1.cni.cncf.io/networks: default/sriov-net1 spec: containers: - name: sleeppodsriov command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"] image: busybox securityContext: capabilities: add: - NET_ADMIN
Applica il file di specifica del pod al cluster utilizzando il seguente comando:
kubectl apply -f sriovpod.yaml
Verifica che il pod sia stato avviato correttamente utilizzando il seguente comando:
kubectl get pods
Stabilisci una shell della riga di comando per il pod utilizzando questo comando:
kubectl exec -it sriovpod -- sh
Verifica che il pod comunichi con gli switch ToR utilizzando la funzionalità dell'operatore della funzione di rete SR-IOV utilizzando il seguente comando nella shell del pod:
ip addr
Il comando restituisce un output simile al seguente:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 51: net1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq qlen 1000 link/ether 2a:af:96:a5:42:ab brd ff:ff:ff:ff:ff:ff inet 192.168.100.11/25 brd 192.168.100.127 scope global net1 valid_lft forever preferred_lft forever 228: eth0@if229: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue qlen 1000 link/ether 46:c9:1d:4c:bf:32 brd ff:ff:ff:ff:ff:ff inet 10.10.3.159/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::44c9:1dff:fe4c:bf32/64 scope link valid_lft forever preferred_lft foreverLe informazioni restituite per l'interfaccia
net1indicano che è stata stabilita la connettività di rete tra gli switch ToR e il pod.
Limitazioni per i carichi di lavoro Distributed Cloud
Quando configuri i carichi di lavoro Distributed Cloud, devi rispettare le limitazioni descritte in questa sezione. Queste limitazioni vengono applicate da Distributed Cloud a tutti i carichi di lavoro che distribuisci sull'hardware Distributed Cloud.
Limitazioni dei carichi di lavoro Linux
Distributed Cloud supporta solo le seguenti funzionalità Linux per i carichi di lavoro:
AUDIT_READAUDIT_WRITECHOWNDAC_OVERRIDEFOWNERFSETIDIPC_LOCKIPC_OWNERKILLMKNODNET_ADMINNET_BIND_SERVICENET_RAWSETFCAPSETGIDSETPCAPSETUIDSYS_CHROOTSYS_NICESYS_PACCTSYS_RESOURCESYS_TIME
Limitazioni dello spazio dei nomi
Distributed Cloud non supporta i seguenti spazi dei nomi:
hostPIDhostIPChostNetwork
Limitazioni del tipo di risorsa
Distributed Cloud non supporta il tipo di risorsa CertificateSigningRequest, che consente a un client di richiedere l'emissione di un certificato X.509 in base a una richiesta di firma.
Limitazioni del contesto di sicurezza
Distributed Cloud non supporta il contesto di sicurezza della modalità con privilegi.
Limitazioni del binding dei pod
Distributed Cloud non supporta il binding dei pod alle porte host nello spazio dei nomi HostNetwork. Inoltre, lo spazio dei nomi HostNetwork
non è disponibile.
hostPath limitazioni del volume
Distributed Cloud consente solo i seguenti volumi hostPath
con accesso in lettura/scrittura:
/dev/hugepages/dev/infiniband/dev/vfio/dev/char/sys/devices
Limitazioni dei tipi di risorse PersistentVolumeClaim
Distributed Cloud consente solo i seguenti tipi di risorse PersistentVolumeClaim:
csinfslocal
Limitazioni relative al tipo di volume
Distributed Cloud consente solo i seguenti tipi di volumi:
configMapcsidownwardAPIemptyDirhostPathnfspersistentVolumeClaimprojectedsecret
Limitazioni di tolleranza dei pod
Distributed Cloud non consente i pod creati dagli utenti sui nodi del piano di controllo. In particolare, Distributed Cloud non consente la pianificazione di pod con le seguenti chiavi di tolleranza:
""node-role.kubernetes.io/masternode-role.kubernetes.io/control-plane
Limitazioni relative alla rappresentazione
Distributed Cloud non supporta l'impersonificazione di utenti o gruppi.
Limitazioni dello spazio dei nomi di gestione
Distributed Cloud non consente agli utenti di accedere ai seguenti spazi dei nomi:
kube-system, ad eccezione dell'eliminazione diippools.whereabouts.cni.cncf.ioanthos-identity-servicecert-managergke-connectkubevirtmetallb-system, ad eccezione della modifica delle risorseconfigMapper impostare gli intervalli di indirizzi IP di bilanciamento del cariconf-operatorsriov-network-operator
Limitazioni dei webhook
Distributed Cloud limita i webhook come segue:
- Qualsiasi webhook di mutazione che crei esclude automaticamente lo spazio dei nomi
kube-system. - I webhook di modifica sono disattivati per i seguenti tipi di risorse:
nodespersistentvolumescertificatesigningrequeststokenreviews