Saltar al contenido

¿Cómo automatizo la configuración del proxy HTTP para los nodos de trabajo de Amazon EKS con Docker?

6 minutos de lectura
0

Quiero automatizar la configuración del proxy HTTP para los nodos de trabajo de Amazon Elastic Kubernetes Service (Amazon EKS) con datos de usuario.

Solución

Nota: La siguiente resolución se aplica solo a los nodos en los que la versión ejecutable subyacente es Docker y no se aplica a los nodos con una versión ejecutable de tipo containerd. Para los nodos con una versión ejecutable containerd, consulte ¿Cómo puedo automatizar la configuración del proxy HTTP para los nodos de containerd de Amazon EKS?

Para configurar un proxy en los nodos de trabajo, debes configurar los componentes necesarios del clúster de Amazon EKS para comunicarte desde el proxy. Los componentes incluyen el servicio kubelet systemd, pod kube-proxy, pod aws-node y yum update.

Para automatizar la configuración del proxy para los nodos de trabajo con una versión ejecutable de Docker, sigue estos pasos:

  1. Busca el bloque de CIDR de la dirección IP de tu clúster:

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

    **Nota:**El comando anterior devuelve 10.100.0.1 o 172.20.0.1, por lo que el bloque de CIDR de la dirección IP del clúster es 10.100.0.0/16 o 172.20.0.0/16.

  2. Según el resultado del comando, crea un archivo ConfigMap denominado proxy-env-vars-config.yaml.
    Si el resultado tiene una dirección IP del rango 172.20.x.x, usa la siguiente estructura de ConfigMap:

    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:Sustituye ** VPC_CIDR_RANGE por el bloque de CIDR de la dirección IPv4 de la nube virtual privada (VPC) de tu clúster.
    Si el resultado tiene una dirección IP del rango 10.100.x.x, usa la siguiente estructura de ConfigMap:

    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: Sustituye VPC_CIDR_RANGE por el bloque de CIDR de la dirección IPv4 de la VPC del clúster.
    Los clústeres de Amazon EKS con acceso a un punto de enlace de servidor de API privada, subredes privadas y sin acceso a Internet requieren puntos de enlace adicionales. Si usas la configuración anterior para crear un clúster, debes crear y agregar puntos de enlace para los siguientes servicios:
    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: Debes agregar el subdominio del punto de enlace público a la variable NO_PROXY. Por ejemplo, añade el dominio .s3.us-east-1.amazonaws.com para Amazon S3 en la región de AWS us-east-1. Si activas el acceso privado de punto de enlace para tu clúster de Amazon EKS, debes añadir el punto de enlace de Amazon EKS a la variable NO_PROXY. Por ejemplo, añade el dominio .us-east-1.eks.amazonaws.com para tu clúster de Amazon EKS en la región de AWS us-east-1.

  3. Comprueba que la variable NO_PROXY de configmap/proxy-environment-variables que usan los pods kube-proxy y aws-node incluya el espacio de dirección IP del clúster de Kubernetes. Por ejemplo, 10.100.0.0/16 se usa en el ejemplo de código anterior para el archivo ConfigMap, donde el rango de direcciones IP es de 10.100.x.x.

  4. Aplica el archivo ConfigMap:

    $ kubectl apply -f /path/to/yaml/proxy-env-vars-config.yaml
  5. Para configurar el daemon de Docker y el kubelet, incluye datos de usuario en tus nodos de trabajo:

    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: Debes actualizar o crear los archivos de configuración yum, Docker y kubelet antes de iniciar el daemon de Docker y el kubelet.
    Para obtener más información sobre cómo usar una plantilla de AWS CloudFormation para incluir datos de usuario en los nodos de trabajo, consulta Creación de nodos de autoadministrados de Amazon Linux.

  6. Para actualizar los pods aws-node y kube-proxy, ejecuta los siguientes comandos:

    $ 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

    Si cambias el archivo ConfigMap, aplica las actualizaciones y vuelve a configurar el archivo ConfigMap en los pods:

    $ 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: Al actualizar kube-proxy o aws-node, también debes actualizar todas las modificaciones de YAML. Para actualizar un archivo ConfigMap a un valor predeterminado, usa los comandos eksctl utils update-kube-proxy o eksctl utils update-aws-node.
    Si el proxy pierde la conectividad con el servidor de la API, se convierte en un punto único de error y el comportamiento del clúster puede ser impredecible. Para evitar este problema, ejecuta el proxy en un equilibrador de carga o un espacio de nombres para la detección de servicios.

  7. Comprueba que las variables de proxy se utilizan en los pods kube-proxy y aws-node:

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

    Resultado de ejemplo:

    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

    Si no usas AWS PrivateLink, verifica el acceso a los puntos de enlace de la API mediante un servidor proxy para Amazon EC2, Amazon ECR y Amazon S3.

OFICIAL DE AWSActualizada hace 2 años