

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Traffico di rete delle applicazioni tramite disconnessioni di rete
<a name="hybrid-nodes-app-network-traffic"></a>

Gli argomenti di questa pagina sono relativi alla rete di cluster Kubernetes e al traffico delle applicazioni durante le disconnessioni di rete tra i nodi e il piano di controllo Kubernetes.

## Cilium
<a name="_cilium"></a>

Cilium dispone di diverse modalità per la gestione degli indirizzi IP (IPAM), l'incapsulamento, il bilanciamento del carico e il routing dei cluster. Le modalità convalidate in questa guida utilizzavano Cluster Scope IPAM, VXLAN overlay, BGP load balancing e kube-proxy. Cilium è stato utilizzato anche senza il bilanciamento del carico BGP, sostituendolo con il bilanciamento del carico MetallB L2.

La base dell'installazione Cilium è costituita dall'operatore Cilium e dagli agenti Cilium. [L'operatore Cilium funziona come distribuzione e registra le Cilium Custom Resource Definitions (CRD), gestisce IPAM e sincronizza gli oggetti del cluster con il server API Kubernetes, tra le altre funzionalità.](https://docs.cilium.io/en/stable/internals/cilium_operator/) Gli agenti Cilium vengono eseguiti su ciascun nodo DaemonSet e gestiscono i programmi eBPF per controllare le regole di rete per i carichi di lavoro in esecuzione sul cluster.

In genere, il routing interno al cluster configurato da Cilium rimane disponibile e attivo durante le disconnessioni di rete, il che può essere confermato osservando i flussi di traffico all'interno del cluster e le regole della tabella IP (iptables) per la rete di pod.

```
ip route show table all | grep cilium
```

```
10.86.2.0/26 via 10.86.3.16 dev cilium_host proto kernel src 10.86.3.16 mtu 1450
10.86.2.64/26 via 10.86.3.16 dev cilium_host proto kernel src 10.86.3.16 mtu 1450
10.86.2.128/26 via 10.86.3.16 dev cilium_host proto kernel src 10.86.3.16 mtu 1450
10.86.2.192/26 via 10.86.3.16 dev cilium_host proto kernel src 10.86.3.16 mtu 1450
10.86.3.0/26 via 10.86.3.16 dev cilium_host proto kernel src 10.86.3.16
10.86.3.16 dev cilium_host proto kernel scope link
...
```

Tuttavia, durante le disconnessioni di rete, l'operatore Cilium e gli agenti Cilium si riavviano a causa dell'associazione dei controlli di integrità con l'integrità della connessione con il server API Kubernetes. Si prevede di vedere quanto segue nei registri dell'operatore Cilium e degli agenti Cilium durante le disconnessioni di rete. Durante le disconnessioni di rete, è possibile utilizzare strumenti come la `crictl` CLI per osservare i riavvii di questi componenti, compresi i relativi registri.

```
msg="Started gops server" address="127.0.0.1:9890" subsys=gops
msg="Establishing connection to apiserver" host="https://<k8s-cluster-ip>:443" subsys=k8s-client
msg="Establishing connection to apiserver" host="https://<k8s-cluster-ip>:443" subsys=k8s-client
msg="Unable to contact k8s api-server" error="Get \"https://<k8s-cluster-ip>:443/api/v1/namespaces/kube-system\": dial tcp <k8s-cluster-ip>:443: i/o timeout" ipAddr="https://<k8s-cluster-ip>:443" subsys=k8s-client
msg="Start hook failed" function="client.(*compositeClientset).onStart (agent.infra.k8s-client)" error="Get \"https://<k8s-cluster-ip>:443/api/v1/namespaces/kube-system\": dial tcp <k8s-cluster-ip>:443: i/o timeout"
msg="Start failed" error="Get \"https://<k8s-cluster-ip>:443/api/v1/namespaces/kube-system\": dial tcp <k8s-cluster-ip>:443: i/o timeout" duration=1m5.003834026s
msg=Stopping
msg="Stopped gops server" address="127.0.0.1:9890" subsys=gops
msg="failed to start: Get \"https://<k8s-cluster-ip>:443/api/v1/namespaces/kube-system\": dial tcp <k8s-cluster-ip>:443: i/o timeout" subsys=daemon
```

Se utilizzi la funzionalità BGP Control Plane di Cilium per il bilanciamento del carico delle applicazioni, la sessione BGP per i tuoi pod e servizi potrebbe non funzionare durante le disconnessioni di rete perché la funzionalità degli altoparlanti BGP è integrata con l'agente Cilium e l'agente Cilium si riavvierà continuamente quando viene disconnesso dal piano di controllo Kubernetes. Per ulteriori informazioni, consulta la Cilium BGP Control Plane Operation Guide nella documentazione di Cilium. Inoltre, se si verifica un errore simultaneo durante una disconnessione di rete, ad esempio un ciclo di alimentazione o il riavvio della macchina, le rotte Cilium non verranno preservate attraverso queste azioni, sebbene le rotte vengano ricreate quando il nodo si riconnette al piano di controllo di Kubernetes e Cilium si riavvia.

## Calico
<a name="_calico"></a>

 *Presto in arrivo* 

## Metallo B
<a name="_metallb"></a>

[MetallB ha due modalità per il bilanciamento del carico: modalità [L2 e modalità](https://metallb.universe.tf/concepts/layer2/) BGP.](https://metallb.universe.tf/concepts/bgp/) Fai riferimento alla documentazione di MetallB per i dettagli sul funzionamento di queste modalità di bilanciamento del carico e sui relativi limiti. La convalida di questa guida ha utilizzato MetallB in modalità L2, in cui una macchina del cluster assume la proprietà del servizio Kubernetes e utilizza ARP per IPv4 per rendere gli indirizzi IP del load balancer raggiungibili sulla rete locale. Quando si esegue MetallB, è presente un controller responsabile dell'assegnazione degli IP e altoparlanti in esecuzione su ciascun nodo, responsabili dei servizi pubblicitari con indirizzi IP assegnati. Il controller MetallB funziona come Deployment e gli altoparlanti MetallB funzionano come un. DaemonSet Durante le disconnessioni di rete, il controller MetallB e gli altoparlanti non riescono a controllare le risorse del cluster nel server dell'API Kubernetes, ma continuano a funzionare. Soprattutto, i Servizi che utilizzano MetallB per la connettività esterna rimangono disponibili e accessibili durante le disconnessioni di rete.

## kube-proxy
<a name="_kube_proxy"></a>

Nei cluster EKS, kube-proxy funziona come un DaemonSet unico nodo ed è responsabile della gestione delle regole di rete per consentire la comunicazione tra servizi e pod traducendo gli indirizzi IP dei servizi negli indirizzi IP dei pod sottostanti. Le regole delle tabelle IP (iptables) configurate da kube-proxy vengono mantenute durante le disconnessioni di rete e il routing all'interno del cluster continua a funzionare e i pod kube-proxy continuano a funzionare.

È possibile osservare le regole kube-proxy con i seguenti comandi iptables. Il primo comando mostra che i pacchetti che attraversano la catena vengono indirizzati verso la `PREROUTING` catena. `KUBE-SERVICES`

```
iptables -t nat -L PREROUTING
```

```
Chain PREROUTING (policy ACCEPT)
target         prot opt source      destination
KUBE-SERVICES  all  --  anywhere    anywhere      /* kubernetes service portals */
```

Ispezionando la `KUBE-SERVICES` catena possiamo vedere le regole per i vari servizi del cluster.

```
Chain KUBE-SERVICES (2 references)
target                     prot opt source      destination
KUBE-SVL-NZTS37XDTDNXGCKJ  tcp  --  anywhere    172.16.189.136  /* kube-system/hubble-peer:peer-service cluster IP /
KUBE-SVC-2BINP2AXJOTI3HJ5  tcp  --  anywhere    172.16.62.72    / default/metallb-webhook-service cluster IP /
KUBE-SVC-LRNEBRA3Z5YGJ4QC  tcp  --  anywhere    172.16.145.111  / default/redis-leader cluster IP /
KUBE-SVC-I7SKRZYQ7PWYV5X7  tcp  --  anywhere    172.16.142.147  / kube-system/eks-extension-metrics-api:metrics-api cluster IP /
KUBE-SVC-JD5MR3NA4I4DYORP  tcp  --  anywhere    172.16.0.10     / kube-system/kube-dns:metrics cluster IP /
KUBE-SVC-TCOU7JCQXEZGVUNU  udp  --  anywhere    172.16.0.10     / kube-system/kube-dns:dns cluster IP /
KUBE-SVC-ERIFXISQEP7F7OF4  tcp  --  anywhere    172.16.0.10     / kube-system/kube-dns:dns-tcp cluster IP /
KUBE-SVC-ENODL3HWJ5BZY56Q  tcp  --  anywhere    172.16.7.26     / default/frontend cluster IP /
KUBE-EXT-ENODL3HWJ5BZY56Q  tcp  --  anywhere    <LB-IP>    / default/frontend loadbalancer IP /
KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  anywhere    172.16.0.1      / default/kubernetes:https cluster IP /
KUBE-SVC-YU5RV2YQWHLZ5XPR  tcp  --  anywhere    172.16.228.76   / default/redis-follower cluster IP /
KUBE-NODEPORTS             all  --  anywhere    anywhere        / kubernetes service nodeports; NOTE: this must be the last rule in this chain */
```

Ispezionando la catena del servizio di frontend per l'applicazione possiamo vedere gli indirizzi IP dei pod che supportano il servizio.

```
iptables -t nat -L KUBE-SVC-ENODL3HWJ5BZY56Q
```

```
Chain KUBE-SVC-ENODL3HWJ5BZY56Q (2 references)
target                     prot opt source    destination
KUBE-SEP-EKXE7ASH7Y74BGBO  all  --  anywhere  anywhere    /* default/frontend -> 10.86.2.103:80 / statistic mode random probability 0.33333333349
KUBE-SEP-GCY3OUXWSVMSEAR6  all  --  anywhere  anywhere    / default/frontend -> 10.86.2.179:80 / statistic mode random probability 0.50000000000
KUBE-SEP-6GJJR3EF5AUP2WBU  all  --  anywhere  anywhere    / default/frontend -> 10.86.3.47:80 */
```

I seguenti messaggi di log kube-proxy sono previsti durante le disconnessioni di rete mentre tenta di controllare il server dell'API Kubernetes per verificare la presenza di aggiornamenti alle risorse del nodo e dell'endpoint.

```
"Unhandled Error" err="k8s.io/client-go/informers/factory.go:160: Failed to watch *v1.Node: failed to list *v1.Node: Get \"https://<k8s-endpoint>/api/v1/nodes?fieldSelector=metadata.name%3D<node-name>&resourceVersion=2241908\": dial tcp <k8s-ip>:443: i/o timeout" logger="UnhandledError"
"Unhandled Error" err="k8s.io/client-go/informers/factory.go:160: Failed to watch *v1.EndpointSlice: failed to list *v1.EndpointSlice: Get \"https://<k8s-endpoint>/apis/discovery.k8s.io/v1/endpointslices?labelSelector=%21service.kubernetes.io%2Fheadless%2C%21service.kubernetes.io%2Fservice-proxy-name&resourceVersion=2242090\": dial tcp <k8s-ip>:443: i/o timeout" logger="UnhandledError"
```

## CoreDNS
<a name="_coredns"></a>

Per impostazione predefinita, i pod nei cluster EKS utilizzano l'indirizzo IP del cluster CoredNS come name server per le query DNS interne al cluster. Nei cluster EKS, CoredNS viene eseguito come implementazione sui nodi. Con i nodi ibridi, i pod sono in grado di continuare a comunicare con CoreDNS durante le disconnessioni di rete quando ci sono repliche CoreDNS in esecuzione localmente su nodi ibridi. Se disponi di un cluster EKS con nodi nel cloud e nodi ibridi nell'ambiente locale, si consiglia di avere almeno una replica CoredNS in ogni ambiente. CoredNS continua a fornire query DNS per i record creati prima della disconnessione della rete e continua a funzionare durante la riconnessione di rete per la stabilità statica.

I seguenti messaggi di log CoredNS sono previsti durante le disconnessioni di rete mentre tenta di elencare gli oggetti dal server dell'API Kubernetes.

```
Failed to watch *v1.Namespace: failed to list *v1.Namespace: Get "https://<k8s-cluster-ip>:443/api/v1/namespaces?resourceVersion=2263964": dial tcp <k8s-cluster-ip>:443: i/o timeout
Failed to watch *v1.Service: failed to list *v1.Service: Get "https://<k8s-cluster-ip>:443/api/v1/services?resourceVersion=2263966": dial tcp <k8s-cluster-ip>:443: i/o timeout
Failed to watch *v1.EndpointSlice: failed to list *v1.EndpointSlice: Get "https://<k8s-cluster-ip>:443/apis/discovery.k8s.io/v1/endpointslices?resourceVersion=2263896": dial tcp <k8s-cluster-ip>: i/o timeout
```