Salta al contenuto

Come posso automatizzare la configurazione del proxy HTTP per i nodi worker di Amazon EKS con Docker?

6 minuti di lettura
0

Desidero automatizzare la configurazione del proxy HTTP per i nodi worker di Amazon Elastic Kubernetes Service (Amazon EKS) con i dati utente.

Risoluzione

Nota: la seguente risoluzione si applica solo ai nodi in cui il runtime sottostante è Docker e non si applica ai nodi con runtime containerd. Per i nodi con runtime containerd, consulta Come posso automatizzare la configurazione del proxy HTTP per i nodi containerd di Amazon EKS?

Per configurare un proxy sui nodi worker, devi configurare i componenti necessari del cluster Amazon EKS per comunicare dal proxy. I componenti includono il servizio kubelet systemd, kube-proxy, aws-node pods e yum update.

Per automatizzare la configurazione del proxy per i nodi worker con un runtime Docker, completa i seguenti passaggi:

  1. Individua il blocco CIDR dell'indirizzo IP del cluster:

    $ kubectl get service kubernetes -o jsonpath='{.spec.clusterIP}'; echo

    Nota: il comando precedente restituisce 10.100.0.1 o 172.20.0.1, per cui il blocco CIDR dell'indirizzo IP del cluster è 10.100.0.0/16 o 172.20.0.0/16.

  2. In base all'output del comando, crea un file ConfigMap denominato proxy-env-vars-config.yaml.
    Se l'output ha un indirizzo IP compreso nell'intervallo 172.20.x.x, utilizza per ConfigMap la seguente struttura:

    apiVersion: v1
    kind: ConfigMap
    metadata:
     name: proxy-environment-variables
     namespace: kube-system
    data:
     HTTP_PROXY: http://customer.proxy.host:proxy_port
     HTTPS_PROXY: http://customer.proxy.host:proxy_port
     NO_PROXY: 172.20.0.0/16,localhost,127.0.0.1,VPC_CIDR_RANGE,169.254.169.254,.internal,s3.amazonaws.com,.s3.us-east-1.amazonaws.com,api.ecr.us-east-1.amazonaws.com,dkr.ecr.us-east-1.amazonaws.com,ec2.us-east-1.amazonaws.com

    Nota: sostituisci VPC_CIDR_RANGE con il blocco CIDR di indirizzi IPv4 del cloud privato virtuale (VPC) del cluster.
    Se l'output ha un indirizzo IP compreso nell'intervallo 10.100.x.x, utilizza per ConfigMap la seguente struttura :

    apiVersion: v1
    kind: ConfigMap
    metadata:
     name: proxy-environment-variables
     namespace: kube-system
    data:
     HTTP_PROXY: http://customer.proxy.host:proxy_port
     HTTPS_PROXY: http://customer.proxy.host:proxy_port
     NO_PROXY: 10.100.0.0/16,localhost,127.0.0.1,VPC_CIDR_RANGE,169.254.169.254,.internal,s3.amazonaws.com,.s3.us-east-1.amazonaws.com,api.ecr.us-east-1.amazonaws.com,dkr.ecr.us-east-1.amazonaws.com,ec2.us-east-1.amazonaws.com

    Nota: sostituisci VPC_CIDR_RANGE con il blocco CIDR dell'indirizzo IPv4 del VPC del cluster.
    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 Elastic Container Registry (Amazon ECR)
    Amazon Simple Storage Service (Amazon S3)
    Amazon Elastic Compute Cloud (Amazon EC2)
    Amazon Virtual Private Cloud (Amazon VPC)
    Importante: devi aggiungere il sottodominio pubblico dell'endpoint alla variabile NO_PROXY. Ad esempio, aggiungi il dominio .s3.us-east-1.amazonaws.com per Amazon S3 nella Regione AWS us-east-1. Se attivi l'accesso privato agli endpoint per il cluster Amazon EKS, devi aggiungere l'endpoint di Amazon EKS alla variabile NO_PROXY. Ad esempio, aggiungi il dominio .us-east-1.eks.amazonaws.com per il cluster Amazon EKS nella Regione AWS us-east-1.

  3. Verifica che la variabile NO_PROXY in configmap/proxy-environment-variables utilizzata dai pod kube-proxy e aws-node includa lo spazio degli indirizzi IP del cluster Kubernetes. Ad esempio, nel codice precedente per il file ConfigMap con indirizzo IP compreso nell'intervallo 10.100.x.x viene utilizzato 10.100.0.0/16.

  4. Applica il file ConfigMap:

    $ kubectl apply -f /path/to/yaml/proxy-env-vars-config.yaml
  5. Per configurare il daemon Docker e kubelet, includi i dati utente nei nodi worker:

    Content-Type: multipart/mixed; boundary="==BOUNDARY=="
    MIME-Version:  1.0
    
    --==BOUNDARY==
    Content-Type: text/cloud-boothook; charset="us-ascii"
    
    #Set the proxy hostname and port
    PROXY="proxy.local:3128"
    MAC=$(curl -s http://169.254.169.254/latest/meta-data/mac/)
    VPC_CIDR=$(curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MAC/vpc-ipv4-cidr-blocks | xargs | tr ' ' ',')
    
    #Create the docker systemd directory
    mkdir -p /etc/systemd/system/docker.service.d
    
    #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,localhost,127.0.0.1,169.254.169.254,.internal,s3.amazonaws.com,.s3.us-east-1.amazonaws.com,api.ecr.us-east-1.amazonaws.com,dkr.ecr.us-east-1.amazonaws.com,ec2.us-east-1.amazonaws.com
    NO_PROXY=$VPC_CIDR,localhost,127.0.0.1,169.254.169.254,.internal,s3.amazonaws.com,.s3.us-east-1.amazonaws.com,api.ecr.us-east-1.amazonaws.com,dkr.ecr.us-east-1.amazonaws.com,ec2.us-east-1.amazonaws.com
    EOF
    
    #Configure docker with the proxy
    cloud-init-per instance docker_proxy_config tee <<EOF /etc/systemd/system/docker.service.d/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
    
    #Reload the daemon and restart docker to reflect proxy configuration at launch of instance
    cloud-init-per instance reload_daemon systemctl daemon-reload
    cloud-init-per instance enable_docker systemctl enable --now --no-block docker
    
    --==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
    
    /etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments}
    
    # Use the cfn-signal only if the node is created through an AWS CloudFormation stack and needs to signal back to an AWS CloudFormation resource (CFN_RESOURCE_LOGICAL_NAME) that waits for a signal from this EC2 instance to progress through either:
    # - CreationPolicy https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-creationpolicy.html
    # - UpdatePolicy https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html
    # cfn-signal will signal back to AWS CloudFormation using https transport, so set the proxy for an HTTPS connection to AWS CloudFormation
    /opt/aws/bin/cfn-signal
        --exit-code $? \
        --stack  ${AWS::StackName} \
        --resource CFN_RESOURCE_LOGICAL_NAME  \
        --region ${AWS::Region} \
        --https-proxy $HTTPS_PROXY
    
    --==BOUNDARY==--

    Importante: prima di avviare il daemon Docker e kubelet, devi aggiornare o creare i file di configurazione yum, Docker e kubelet.
    Per ulteriori informazioni sull'utilizzo di un modello AWS CloudFormation per includere dati utente nei nodi worker, consulta Creare nodi Amazon Linux self-managed.

  6. Per aggiornare i pod 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

    Se modifichi il file ConfigMap, applica gli aggiornamenti e imposta nuovamente il file ConfigMap nei pod:

    $ kubectl set env daemonset/kube-proxy --namespace=kube-system --from=configmap/proxy-environment-variables --containers='*'
    $ kubectl set env daemonset/aws-node --namespace=kube-system --from=configmap/proxy-environment-variables --containers='*'

    Importante: quando aggiorni kube-proxy o aws-node, devi aggiornare anche tutte le modifiche YAML. Per aggiornare un file ConfigMap a un valore predefinito, esegui il comando eksctl utils update-kube-proxy o eksctl utils update-aws-node.
    Se il proxy perde la connettività con il server API, diventa un singolo punto di errore e può causare un comportamento imprevedibile del cluster. Per evitare il problema, esegui il proxy dietro un namespace di rilevamento dei servizi o un bilanciatore del carico.

  7. Controlla che le variabili del proxy siano utilizzate nei pod kube-proxy e aws-node:

    $ kubectl describe pod kube-proxy-xxxx -n kube-system

    Esempio di output:

    Environment:
     HTTPS_PROXY: <set to the key 'HTTPS_PROXY' of config map 'proxy-environment-variables'> Optional: false
     HTTP_PROXY: <set to the key 'HTTP_PROXY' of config map 'proxy-environment-variables'> Optional: false

    Se non utilizzi AWS PrivateLink, verifica l'accesso agli endpoint API tramite un server proxy per Amazon EC2, Amazon ECR e Amazon S3.

AWS UFFICIALEAggiornata un anno fa