¿Cómo puedo automatizar la configuración del proxy HTTP para los nodos de trabajo de EKS con datos de usuario?

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.

Breve descripción

Para configurar un proxy en los nodos de trabajo, debe configurar los componentes necesarios del clúster de Amazon EKS para comunicarse desde el proxy. Los componentes incluyen, entre otros, 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 la versión ejecutable de Docker, haga lo siguiente:

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 containerd. Para los nodos con una versión ejecutable containerd, consulte How can I automate the configuration of HTTP proxy for EKS containerd nodes?

Resolución

  1. Buscar el bloque de CIDR de IP del clúster:
$ kubectl get service kubernetes -o jsonpath='{.spec.clusterIP}'; echo

El comando anterior devuelve 10.100.0.1 o 172.20.0.1. Esto significa que el bloque de CIDR de IP de su clúster es 10.100.0.0/16 o 172.20.0.0/16.

  1. Crear un archivo ConfigMap denominado proxy-env-vars-config.yaml basándose en el resultado del comando del paso 1.

Si la salida tiene una IP del rango 172.20.x.x, entonces estructure el archivo ConfigMap de la siguiente manera:

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: Sustituya VPC_CIDR_RANGE por el bloque de CIDR de IPv4 de la VPC del clúster.

Si la salida tiene una IP del rango 10.100.x.x, entonces estructure el archivo ConfigMap de la siguiente manera:

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: Sustituya VPC_CIDR_RANGE por el bloque de CIDR de IPv4 de la VPC del clúster.

Los clústeres de Amazon EKS con acceso a un punto de conexión de servidor de API privada, subredes privadas y sin acceso a Internet requieren puntos de conexión adicionales. Si está creando un clúster con la configuración anterior, debe crear y agregar puntos de conexión 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)

Por ejemplo, puede usar los siguientes puntos de conexión: api.ecr.us-east-1.amazonaws.com, dkr.ecr.us-east-1.amazonaws.com, s3.amazonaws.com, s3.us-east-1.amazonaws.com y ec2.us-east-1.amazonaws.com.

Importante: Debe agregar el subdominio del punto de conexión público a la variable NO_PROXY. Por ejemplo, añada el dominio .s3.us-east-1.amazonaws.com para Amazon S3 en la región de AWS us-east-1. Si activa el acceso privado de punto de conexión para su clúster de Amazon EKS, debe añadir el punto de conexión de Amazon EKS a la variable NO_PROXY. Por ejemplo, añada el dominio .us-east-1.eks.amazonaws.com para su clúster de Amazon EKS en la región de AWS us-east-1.

  1. Compruebe que la variable NO_PROXY de configmap/proxy-environment-variables (que utilizan 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 IP es de 10.100.x.x.

  2. Aplique el archivo ConfigMap:

$ kubectl apply -f /path/to/yaml/proxy-env-vars-config.yaml
  1. Para configurar el daemon de Docker y el kubelet, inyecte datos de usuario en sus nodos de trabajo. Por ejemplo:
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: Debe actualizar o crear los archivos de configuración yum, Docker y kubelet antes de iniciar el daemon de Docker y el kubelet.

Para ver un ejemplo de datos de usuario que se inyectan en los nodos de trabajo mediante una plantilla de AWS CloudFormation, consulte Lanzar nodos autoadministrados de Amazon Linux.

  1. Actualice los pods aws-node y kube-proxy:
$ 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 cambia el archivo ConfigMap, entonces aplique las actualizaciones y vuelve a configurar el archivo ConfigMap en los pods. Por ejemplo:

$ 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: Debe actualizar todas las modificaciones de YAML en los objetos de Kubernetes kube-proxy o aws-node cuando se actualicen estos objetos. Para actualizar un archivo ConfigMap a un valor predeterminado, utilice los comandos eksctl utils update-kube-proxy o eksctl utils update-aws-node.

Consejo: 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 que su proxy se convierta en un punto único de error, ejecútelo detrás de un espacio de nombres o un equilibrador de carga de detección de servicios.

  1. Confirme que las variables de proxy se utilizan en los pods kube-proxy y aws-node:
$ kubectl describe pod kube-proxy-xxxx -n kube-system

El resultado debería ser similar al siguiente:

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
 NO_PROXY: <set to the key 'NO_PROXY' of config map 'proxy-environment-variables'> Optional: false

Si no utiliza AWS PrivateLink, verifique el acceso a los puntos de conexión de la API mediante un servidor proxy para Amazon EC2, Amazon ECR y Amazon S3.


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año