Saltar al contenido

¿Cómo puedo automatizar la configuración del proxy HTTP para los nodos de containerd de Amazon EKS?

5 minutos de lectura
0

Quiero automatizar la configuración del proxy HTTP para los nodos de Amazon Elastic Kubernetes Service (Amazon EKS) con una versión ejecutable de containerd.

Descripción breve

Para los grupos de nodos administrados creados en las versiones 1.23 o anteriores de Amazon EKS, la versión ejecutable del contenedor predeterminada es Docker. Si este es su caso práctico, siga todos los pasos de la resolución para especificar una versión ejecutable de containerd. Para los grupos de nodos administrados creados en las versiones 1.24 o posteriores de Amazon EKS, la versión ejecutable del contenedor predeterminada es containerd.

Para usar containerd en su grupo de nodos administrados en lugar de dockerd, es necesario especificar una versión ejecutable de containerd en userdata.

Tras cambiar el grupo de nodos administrados a una versión ejecutable de containerd, cree una plantilla de lanzamiento personalizada con su ID de imagen de máquina de Amazon (AMI). A continuación, configure los ajustes del proxy HTTP y los valores del entorno del clúster.

Nota: Para nodos con entorno de ejecución de Docker, consulte ¿Cómo automatizo la configuración del proxy HTTP para los nodos trabajadores de Amazon EKS con Docker?

Resolución

Creación de una plantilla de lanzamiento personalizada

Para especificar containerd como versión ejecutable y crear una plantilla de inicio personalizada, siga estos pasos:

  1. Especifique containerd como la versión ejecutable en su grupo de nodos administrados. En userdata, utilice la opción --container-runtime=containerd para bootstrap.sh.

  2. Cree una plantilla de lanzamiento personalizada con el ID de la AMI. Si no lo hace, el grupo de nodos administrados combinará automáticamente userdata.

  3. Establezca la configuración del proxy como containerd, sandbox-image y kubelet.
    Nota: Sandbox-image es la unidad de servicio que extrae la imagen de entorno aislado de containerd.

  4. Describa userdata con los siguientes campos:

    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://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
    MAC=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://169.254.169.254/latest/meta-data/mac/)
    VPC_CIDR=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://169.254.169.254/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
    
    #[Option] 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,.eks.amazonaws.com
    NO_PROXY=$VPC_CIDR,localhost,127.0.0.1,169.254.169.254,.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 --container-runtime containerd
    
    --==BOUNDARY==--

    Nota: Sustituya XXXXXXX:3128, YOUR_CLUSTER_CA, API_SERVER_ENDPOINT y EKS_CLUSTER_NAME por el proxy, autoridad de certificación (CA), punto de enlace del servidor y nombre del clúster. Tras crear los puntos de enlace de la nube privada virtual (VPC), agregue los puntos de enlace del servicio de AWS a NO_PROXY y no_proxy.

Configuración de los ajustes del proxy para aws-node y kube-proxy

Nota: Si dirige el tráfico del clúster a Internet a través de un proxy HTTP y su punto de enlace de EKS es público, debe completar estos pasos. Si tiene una configuración diferente, estos pasos son opcionales.

Cree un ConfigMap para configurar los valores del entorno. A continuación, aplique el ConfigMap en su clúster. Utilice el siguiente script como ejemplo para su ConfigMap:

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,localhost,127.0.0.1,VPC_CIDR_RANGE,169.254.169.254,.internal

Nota: Sustituya KUBERNETES_SERVICE_CIDR_RANGE y VPC_CIDR_RANGE por los valores de sus rangos CIDR. Después de crear los puntos de enlace de VPC, agregue puntos de enlace de AWS a NO_PROXY y no_proxy.

A continuación, establezca la configuración de su proxy HTTP como 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

Creación de un grupo de nodos administrados

Cree un nuevo grupo de nodos administrados que utilice la plantilla de lanzamiento personalizada creada.

Prueba del proxy

Para comprobar el estado de los nodos, ejecute los siguientes comandos:

$ kubectl get nodes

$ kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300

$ kubectl get pods -A

Recibirá un resultado similar al del ejemplo siguiente:

$ kubectl get nodes -o wide
NAME                                                 STATUS   ROLES    AGE     VERSION                INTERNAL-IP       EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION                 CONTAINER-RUNTIME

ip-192-168-100-114.ap-northeast-1.compute.internal   Ready    <none>   2m27s   v1.23.13-eks-fb459a0   192.168.100.114   <none>        Amazon Linux 2   5.4.219-126.411.amzn2.x86_64   containerd://1.6.6



$ kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300

pod/test-pod created



$ kubectl get pods -A

NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE

default       test-pod                   1/1     Running   0          14s

kube-system   aws-node-cpjcl             1/1     Running   0          3m34s

kube-system   coredns-69cfddc4b4-c7rpd   1/1     Running   0          26m

kube-system   coredns-69cfddc4b4-z5jxq   1/1     Running   0          26m

kube-system   kube-proxy-g2f4g           1/1     Running   0          3m34s

Consulte el registro de su proxy para obtener información adicional sobre la conectividad de sus nodos:

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 -
192.168.100.114 TCP_TUNNEL/200 6633 CONNECT registry-1.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -
192.168.100.114 TCP_TUNNEL/200 10353 CONNECT auth.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -
192.168.100.114 TCP_TUNNEL/200 8767 CONNECT registry-1.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -

Información relacionada

¿Cómo puedo proporcionar acceso a otros usuarios y roles de IAM tras la creación del clúster en Amazon EKS?

OFICIAL DE AWSActualizada hace 2 años