Come posso automatizzare la configurazione del proxy HTTP per nodi Amazon EKS containerd?
Desidero automatizzare la configurazione del proxy HTTP per nodi Amazon Elastic Kubernetes Service (Amazon EKS) con il runtime containerd.
Breve descrizione
Puoi automatizzare la configurazione del proxy HTTP per nodi Amazon EKS con un modello di avvio personalizzato che includa le impostazioni del proxy nei dati utente. L'approccio alla configurazione varia in base alla famiglia dell'AMI: Amazon Linux 2, Amazon Linux 2023 o Bottlerocket.
Nota: per i cluster Amazon EKS versione 1.24 e successive, containerd è il runtime predefinito del container.
Risoluzione
Per configurare un gruppo di nodi gestiti con le impostazioni del proxy HTTP, crea un modello di avvio personalizzato con l'ID dell'Amazon Machine Image (AMI). Quindi configura le impostazioni del proxy HTTP e i valori di ambiente del cluster.
Scegli l'approccio di configurazione in base alla famiglia dell'AMI:
Configura il proxy HTTP per nodi Amazon Linux 2
Crea il modello di avvio
- Apri la console Amazon Elastic Compute Cloud (Amazon EC2).
- Nel pannello di navigazione, seleziona Modelli di avvio.
- Scegli Crea modello di avvio.
- In Nome del modello di avvio, inserisci un nome per il modello.
- Per Application and OS Images (Amazon Machine Image) (Immagini dell'applicazione e del sistema operativo (Amazon Machine Image), scegli l'ID dell'AMI Amazon Linux 2.
- Configura le seguenti opzioni:
Per Tipo di istanza, scegli il tipo di istanza richiesto.
Per Nome della coppia di chiavi, scegli la coppia di chiavi SSH di Amazon EC2.
Per Gruppi di sicurezza, scegli il gruppo di sicurezza. - Espandi Dettagli avanzati.
- In Dati utente, inserisci la seguente configurazione:
Nota: sostituisci XXXXXXX:3128 con il nome host e la porta del proxy. Sostituisci YOUR_CLUSTER_CA con l'autorità di certificazione (CA) del tuo cluster. Sostituisci API_SERVER_ENDPOINT con l'endpoint del tuo server. Sostituisci EKS_CLUSTER_NAME con il nome del tuo cluster.MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==BOUNDARY==" --==BOUNDARY== Content-Type: text/cloud-boothook; charset="us-ascii" #Set the proxy hostname and port PROXY=XXXXXXX:3128 TOKEN=`curl -X PUT "http://[IP_ADDRESS]/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` MAC=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/mac/) VPC_CIDR=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/network/interfaces/macs/$MAC/vpc-ipv4-cidr-blocks | xargs | tr ' ' ',') #Create the containerd and sandbox-image systemd directory mkdir -p /etc/systemd/system/containerd.service.d mkdir -p /etc/systemd/system/sandbox-image.service.d #[Optional] Configure yum to use the proxy cloud-init-per instance yum_proxy_config cat << EOF >> /etc/yum.conf proxy=http://$PROXY EOF #Set the proxy for future processes, and use as an include file cloud-init-per instance proxy_config cat << EOF >> /etc/environment http_proxy=http://$PROXY https_proxy=http://$PROXY HTTP_PROXY=http://$PROXY HTTPS_PROXY=http://$PROXY no_proxy=$VPC_CIDR,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.internal,.eks.amazonaws.com NO_PROXY=$VPC_CIDR,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.internal,.eks.amazonaws.com EOF #Configure Containerd with the proxy cloud-init-per instance containerd_proxy_config tee <<EOF /etc/systemd/system/containerd.service.d/http-proxy.conf >/dev/null [Service] EnvironmentFile=/etc/environment EOF #Configure sandbox-image with the proxy cloud-init-per instance sandbox-image_proxy_config tee <<EOF /etc/systemd/system/sandbox-image.service.d/http-proxy.conf >/dev/null [Service] EnvironmentFile=/etc/environment EOF #Configure the kubelet with the proxy cloud-init-per instance kubelet_proxy_config tee <<EOF /etc/systemd/system/kubelet.service.d/proxy.conf >/dev/null [Service] EnvironmentFile=/etc/environment EOF cloud-init-per instance reload_daemon systemctl daemon-reload --==BOUNDARY== Content-Type:text/x-shellscript; charset="us-ascii" #!/bin/bash set -o xtrace #Set the proxy variables before running the bootstrap.sh script set -a source /etc/environment #Run the bootstrap.sh script B64_CLUSTER_CA=YOUR_CLUSTER_CA API_SERVER_URL=API_SERVER_ENDPOINT /etc/eks/bootstrap.sh EKS_CLUSTER_NAME --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --==BOUNDARY==-- - Scegli Crea modello di avvio.
Verifica la configurazione
Dopo aver creato il gruppo di nodi gestiti con il modello di avvio, verifica la configurazione del proxy:
-
Per verificare lo stato dei nodi, esegui questo comando:
kubectl get nodes -o wide -
Per verificare che le variabili di ambiente del proxy siano impostate, connettiti a un nodo ed esegui questo comando:
systemctl show containerd | grep Environment
L'output mostra le variabili di ambiente del proxy configurate per containerd.
Configura il proxy HTTP per nodi Amazon Linux 2023
Nota: se ricevi degli errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori relativi ad AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.
Amazon Linux 2023 introduce un nuovo processo di inizializzazione dei nodi nodeadm che utilizza uno schema di configurazione YAML. Per questo processo, nodeadm viene eseguito in due fasi: config e run. La fase nodeadm-config viene eseguita prima di cloud-init, mentre la fase nodeadm-run viene eseguita dopo cloud-init.
Durante la fase nodeadm-config, il sistema chiama il servizio Amazon EC2 per recuperare i dettagli dell'istanza. Per impedire la chiamata ad Amazon EC2 prima di configurare le impostazioni del proxy, utilizza il feature gate InstanceIdNodeName in nodeadm.
Crea un ruolo IAM per il nodo worker
-
Crea un nuovo ruolo AWS Identity and Access Management (AWS IAM) per il nodo worker con le policy richieste.
-
Utilizza una delle seguenti opzioni per fornire al ruolo IAM del nodo worker l'accesso appropriato:
Opzione 1: crea una voce di accesso EKS
Per creare una voce di accesso di tipo EC2, esegui questo comando AWS CLI create-access-entry:aws eks create-access-entry --cluster-name EKS_CLUSTER_NAME --principal-arn WORKER_NODE_IAM_ROLE_ARN --type EC2Nota: sostituisci EKS_CLUSTER_NAME con il nome del tuo cluster. Sostituisci WORKER_NODE_IAM_ROLE_ARN con l'ARN del ruolo IAM del nodo worker.
Opzione 2: aggiorna la ConfigMap aws-auth
Aggiungi la seguente configurazione alla ConfigMap aws-auth in formato YAML:- groups: - system:bootstrappers - system:nodes rolearn: ROLE_ARN username: system:node:{{SessionName}}Nota: sostituisci ROLE_ARN con l'ARN del ruolo IAM del nodo worker. Questa configurazione concede le autorizzazioni RBAC Kubernetes necessarie al ruolo IAM del nodo worker.
Crea il modello di avvio
- Apri la console Amazon EC2.
- Nel pannello di navigazione, seleziona Modelli di avvio.
- Scegli Crea modello di avvio.
- In Nome del modello di avvio, inserisci un nome per il modello.
- Per Application and OS Images (Amazon Machine Image) (Immagini dell'applicazione e del sistema operativo (Amazon Machine Image), scegli l'ID dell'AMI Amazon Linux 2023.
- Configura le seguenti opzioni:
Per Tipo di istanza, scegli il tipo di istanza richiesto.
Per Nome della coppia di chiavi, scegli la coppia di chiavi SSH di Amazon EC2.
Per Gruppi di sicurezza, scegli il gruppo di sicurezza. - Espandi Dettagli avanzati.
- In Dati utente, inserisci la seguente configurazione:
Nota: sostituisci XXXXXXX:3128 con il nome host e la porta del proxy. Sostituisci YOUR_CLUSTER_CA con l'autorità di certificazione (CA) del tuo cluster. Sostituisci API_SERVER_ENDPOINT con l'endpoint del tuo server. Sostituisci EKS_CLUSTER_NAME con il nome del tuo cluster. Sostituisci KUBERNETES_SERVICE_CIDR_RANGE con l'intervallo CIDR del servizio del cluster. Se il CIDR del servizio non viene fornito nei dati utente, la fase nodeadm-config ha esito negativo.MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==BOUNDARY==" --==BOUNDARY== Content-Type: text/cloud-boothook; charset="us-ascii" #!/bin/bash #Set the proxy hostname and port PROXY=XXXXXXX:3128 TOKEN=`curl -X PUT "http://[IP_ADDRESS]/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` MAC=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/mac/) VPC_CIDR=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/network/interfaces/macs/$MAC/vpc-ipv4-cidr-blocks | xargs | tr ' ' ',') #[Optional] Configure yum to use the proxy cloud-init-per instance yum_proxy_config cat << EOF >> /etc/yum.conf proxy=http://$PROXY EOF #Set the proxy for future processes, and use as an include file cloud-init-per instance proxy_config cat << EOF >> /etc/environment http_proxy=http://$PROXY https_proxy=http://$PROXY HTTP_PROXY=http://$PROXY HTTPS_PROXY=http://$PROXY no_proxy=$VPC_CIDR,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.internal,.eks.amazonaws.com NO_PROXY=$VPC_CIDR,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.internal,.eks.amazonaws.com EOF #Configure Containerd with the proxy cloud-init-per instance containerd_proxy_config tee <<EOF /etc/systemd/system/containerd.service.d/http-proxy.conf >/dev/null [Service] EnvironmentFile=/etc/environment EOF #Configure the kubelet with the proxy cloud-init-per instance kubelet_proxy_config tee <<EOF /etc/systemd/system/kubelet.service.d/proxy.conf >/dev/null [Service] EnvironmentFile=/etc/environment EOF cloud-init-per instance reload_daemon systemctl daemon-reload --==BOUNDARY== Content-Type: application/node.eks.aws --- apiVersion: node.eks.aws/v1alpha1 kind: NodeConfig spec: featureGates: InstanceIdNodeName: true cluster: name: EKS_CLUSTER_NAME apiServerEndpoint: API_SERVER_ENDPOINT certificateAuthority: YOUR_CLUSTER_CA cidr: KUBERNETES_SERVICE_CIDR_RANGE --==BOUNDARY==-- - Scegli Crea modello di avvio.
Verifica la configurazione
Dopo aver creato il gruppo di nodi gestiti con il modello di avvio, verifica la configurazione del proxy:
-
Per verificare lo stato dei nodi, esegui questo comando:
kubectl get nodes -o wide -
Per verificare che le variabili di ambiente del proxy siano impostate, connettiti a un nodo ed esegui questo comando:
systemctl show containerd | grep Environment
L'output mostra le variabili di ambiente del proxy configurate per containerd.
Configura il proxy HTTP per nodi Bottlerocket
Crea il modello di avvio
-
Apri la console Amazon EC2.
-
Nel pannello di navigazione, seleziona Modelli di avvio.
-
Scegli Crea modello di avvio.
-
In Nome del modello di avvio, inserisci un nome per il modello.
-
Per Application and OS Images (Amazon Machine Image) (Immagini dell'applicazione e del sistema operativo (Amazon Machine Image), scegli l'ID dell'AMI Bottlerocket.
-
Configura le seguenti opzioni:
Per Tipo di istanza, scegli il tipo di istanza richiesto.
Per Nome della coppia di chiavi, scegli la coppia di chiavi SSH di Amazon EC2.
Per Gruppi di sicurezza, scegli il gruppo di sicurezza. -
Espandi Dettagli avanzati.
-
In Dati utente, inserisci la seguente configurazione:
[settings.kubernetes] "cluster-name" = "EKS_CLUSTER_NAME" "api-server" = "API_SERVER_ENDPOINT" "cluster-certificate" = "YOUR_CLUSTER_CA" [settings.network] no-proxy = ["VPC_CIDR_RANGE","[IP_ADDRESS]","[IP_ADDRESS]","[IP_ADDRESS]",".internal",".eks.amazonaws.com"] https-proxy = "XXXXXXX:3128"Nota: sostituisci XXXXXXX:3128 con il nome host e la porta del proxy. Sostituisci YOUR_CLUSTER_CA con l'autorità di certificazione (CA) del tuo cluster. Sostituisci API_SERVER_ENDPOINT con l'endpoint del tuo server. Sostituisci EKS_CLUSTER_NAME con il nome del tuo cluster. Sostituisci VPC_CIDR_RANGE con il CIDR del tuo VPC. Bottlerocket configura automaticamente le impostazioni del proxy per il servizio containerd e kubelet.
Per aggiungere certificati autofirmati alle istanze Bottlerocket, utilizza la seguente configurazione nella sezione dei dati utente:
[settings.pki.proxy-bundle] data="ENCODED_CA_DATA" trusted=trueNota: sostituisci ENCODED_CA_DATA con i dati del certificato codificato in base64.
Per codificare il file del certificato, esegui questo comando:
base64 -i FILE -w0 -
Scegli Crea modello di avvio.
Verifica la configurazione
Dopo aver creato il gruppo di nodi gestiti con il modello di avvio, verifica la configurazione del proxy:
-
Per verificare lo stato dei nodi, esegui questo comando:
kubectl get nodes -o wide -
Per verificare le impostazioni del proxy, connettiti a un nodo Bottlerocket utilizzando Gestione sessione di AWS Systems Manager ed esegui questo comando:
apiclient get settings.network
L'output mostra le impostazioni del proxy configurate per il nodo.
Crea il gruppo di nodi gestiti
Dopo aver creato il modello di avvio, crea un nuovo gruppo di nodi gestiti che utilizza il modello di avvio personalizzato.
Per ulteriori informazioni sulla creazione di gruppi di nodi gestiti con modelli di avvio, consulta Personalizzazione dei nodi gestiti con modelli di avvio.
Configura il proxy per cluster completamente privati
Importante: quando utilizzi associazioni EKS Pod Identity con la configurazione di un proxy, devi includere anche [IP_ADDRESS] (IPv4) o [[IP_ADDRESS]] (IPv6) nelle variabili di ambiente no_proxy/NO_PROXY.
I cluster Amazon EKS con accesso privato agli endpoint del server API, sottoreti private e senza accesso a Internet richiedono endpoint aggiuntivi. Se utilizzi la configurazione precedente per creare un cluster, devi creare e aggiungere endpoint per i seguenti servizi:
- Amazon EC2
- Amazon Elastic Container Registry per estrarre immagini del container
- Amazon Elastic Load Balancing per gli Application Load Balancer e i Network Load Balancer
- Amazon CloudWatch Logs
- Servizio di token di sicurezza AWS quando utilizzi ruoli IAM per gli account di servizio
- Amazon EKS Auth quando utilizzi associazioni Pod Identity
- Amazon EKS
Dopo aver creato gli endpoint, configura le variabili NO_PROXY and no_proxy nei dati utente del modello di avvio dell'istanza Amazon EC2. Includi i sottodomini pubblici degli endpoint specifici della Regione e dei servizi AWS.
Ad esempio:
Per Amazon Simple Storage Service (Amazon S3):
- Se il bucket è in us-east-1, aggiungi: .s3.us-east-1.amazonaws.com
- Se il bucket è in eu-west-1, aggiungi: .s3.eu-west-1.amazonaws.com
Per Amazon EKS quando utilizzi l'accesso privato agli endpoint:
- Se il cluster è in us-east-1, aggiungi: .us-east-1.eks.amazonaws.com
- Se il cluster è in eu-west-1, aggiungi: .eu-west-1.eks.amazonaws.com
Nota: sostituisci gli identificatori di Regione con la Regione AWS in cui hai distribuito le risorse e aggiungi gli endpoint alle variabili NO_PROXY e no_proxy. A seconda del carico di lavoro e dei componenti aggiuntivi del cluster, aggiungi altri servizi alla configurazione del proxy.
Configura il proxy per cluster pubblici
Nota: se hai una configurazione diversa, questi passaggi sono facoltativi.
Se instradi il traffico dal cluster a Internet tramite un proxy HTTP e l'endpoint di Amazon EKS è pubblico, completa questi passaggi.
Crea una ConfigMap per configurare i valori dell'ambiente:
apiVersion: v1 kind: ConfigMap metadata: name: proxy-environment-variables namespace: kube-system data: HTTP_PROXY: http://XXXXXXX:3128 HTTPS_PROXY: http://XXXXXXX:3128 NO_PROXY: KUBERNETES_SERVICE_CIDR_RANGE,[IP_ADDRESS],[IP_ADDRESS],VPC_CIDR_RANGE,[IP_ADDRESS],.internal,.eks.amazonaws.com,ec2.us-east-1.amazonaws.com no_proxy: KUBERNETES_SERVICE_CIDR_RANGE,[IP_ADDRESS],[IP_ADDRESS],VPC_CIDR_RANGE,[IP_ADDRESS],.internal,.eks.amazonaws.com,ec2.us-east-1.amazonaws.com
Nota: sostituisci KUBERNETES_SERVICE_CIDR_RANGE e VPC_CIDR_RANGE con i valori dei tuoi intervalli CIDR. Dopo aver creato gli endpoint VPC (Amazon EKS e Amazon EC2), aggiungi gli endpoint dei servizi AWS a NO_PROXY e no_proxy.
Applica la ConfigMap:
kubectl apply -f proxy-configmap.yaml
Configura aws-node e kube-proxy
Per impostare la configurazione del proxy HTTP su aws-node e kube-proxy, esegui questi comandi:
kubectl patch -n kube-system -p '{ "spec": {"template":{ "spec": { "containers": [ { "name": "aws-node", "envFrom": [ { "configMapRef": {"name": "proxy-environment-variables"} } ] } ] } } } }' daemonset aws-node kubectl patch -n kube-system -p '{ "spec": {"template":{ "spec": { "containers": [ { "name": "kube-proxy", "envFrom": [ { "configMapRef": {"name": "proxy-environment-variables"} } ] } ] } } } }' daemonset kube-proxy
Verifica la configurazione del proxy
Per verificare che la configurazione del proxy funzioni correttamente, completa i seguenti passaggi:
-
Per verificare lo stato dei nodi, esegui questo comando:
kubectl get nodes -o wide -
Per verificare la connettività del pod tramite il proxy, esegui questi comandi:
kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300 kubectl get pods -A -
Controlla il log del proxy per ulteriori informazioni sulla connettività dei nodi. I log dovrebbero mostrare connessioni riuscite (TCP_TUNNEL/200) agli endpoint del registro del container.
Esempio di output:192.168.100.114 TCP_TUNNEL/200 6230 CONNECT registry-1.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX - 192.168.100.114 TCP_TUNNEL/200 10359 CONNECT auth.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -
Informazioni correlate
Aggiornamento da Amazon Linux 2 ad Amazon Linux 2023
Crea nodi Bottlerocket self-managed
Concedere agli utenti IAM l’accesso a Kubernetes con le voci di accesso EKS
- Argomenti
- Containers
- Lingua
- Italiano
