Salta al contenuto

Come posso automatizzare la configurazione del proxy HTTP per nodi Amazon EKS containerd?

12 minuti di lettura
0

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

  1. Apri la console Amazon Elastic Compute Cloud (Amazon EC2).
  2. Nel pannello di navigazione, seleziona Modelli di avvio.
  3. Scegli Crea modello di avvio.
  4. In Nome del modello di avvio, inserisci un nome per il modello.
  5. 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.
  6. 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.
  7. Espandi Dettagli avanzati.
  8. In Dati utente, inserisci la seguente configurazione:
    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==--
    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.
  9. 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:

  1. Per verificare lo stato dei nodi, esegui questo comando:

    kubectl get nodes -o wide
  2. 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

  1. Crea un nuovo ruolo AWS Identity and Access Management (AWS IAM) per il nodo worker con le policy richieste.

  2. 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 EC2

    Nota: 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

  1. Apri la console Amazon EC2.
  2. Nel pannello di navigazione, seleziona Modelli di avvio.
  3. Scegli Crea modello di avvio.
  4. In Nome del modello di avvio, inserisci un nome per il modello.
  5. 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.
  6. 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.
  7. Espandi Dettagli avanzati.
  8. In Dati utente, inserisci la seguente configurazione:
    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==--
    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.
  9. 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:

  1. Per verificare lo stato dei nodi, esegui questo comando:

    kubectl get nodes -o wide
  2. 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

  1. Apri la console Amazon EC2.

  2. Nel pannello di navigazione, seleziona Modelli di avvio.

  3. Scegli Crea modello di avvio.

  4. In Nome del modello di avvio, inserisci un nome per il modello.

  5. Per Application and OS Images (Amazon Machine Image) (Immagini dell'applicazione e del sistema operativo (Amazon Machine Image), scegli l'ID dell'AMI Bottlerocket.

  6. 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.

  7. Espandi Dettagli avanzati.

  8. 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=true

    Nota: 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
  9. 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:

  1. Per verificare lo stato dei nodi, esegui questo comando:

    kubectl get nodes -o wide
  2. 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:

  1. Per verificare lo stato dei nodi, esegui questo comando:

    kubectl get nodes -o wide
  2. 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
  3. 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

AWS UFFICIALEAggiornata 7 mesi fa