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

Breve descripción

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, asegúrese de seguir todos los pasos de la solució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 AMI. A continuación, puede configurar los ajustes del proxy HTTP y los valores del entorno del clúster.

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

Solución

Creación de una plantilla de lanzamiento personalizada

  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. De lo contrario, el grupo de nodos administrados combinará userdata automáticamente si no se especifica el ID de la AMI.
  3. Establezca la configuración del proxy como containerd, sandbox-image y kubelet. Sandbox-image es la unidad de servicio que extrae la imagen de entorno aislado de containerd. Para establecer esta configuración, consulte los scripts sandbox-image.service y pull-sandbox-image.sh en GitHub.
  4. Ahora puede describir userdata con los siguientes campos:
    Nota: Sustituya XXXXXXX:3128, YOUR_CLUSTER_CA, API_SERVER_ENDPOINT y EKS_CLUSTER_NAME por el proxy, la CA del clúster, el punto de conexión del servidor y el nombre del clúster correspondientes. Puede añadir puntos de conexión de servicio de AWS a NO_PROXY y no_proxy una vez creados sus puntos de conexión de VPC.
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==--

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

Cree un ConfigMap para configurar los valores del entorno. A continuación, aplíquelo en su clúster. Utilice el siguiente script como ejemplo para su ConfigMap: Nota: Sustituya KUBERNETES_SERVICE_CIDR_RANGE y VPC_CIDR_RANGE por los valores pertinentes de sus rangos CIDR. Por ejemplo, sustituya KUBERNETES_SERVICE_CIDR_RANGE por 10.100.0.0/16, y VPC_CIDR_RANGE por 192.168.0.0/16. Puede añadir puntos de conexión de servicio de AWS a NO_PROXY y no_proxy una vez creados sus puntos de conexión de VPC.

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,.eks.amazonaws.com

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 anteriormente. Siga los pasos que se indican en Creación de un grupo de nodos administrados.

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

Se mostrará un resultado parecido al siguiente ejemplo:

$ 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 AWS
OFICIAL DE AWSActualizada hace un año