Como posso automatizar a configuração do proxy HTTP para nós de processamento do EKS com dados de usuário?

6 minuto de leitura
0

Quero automatizar a configuração do proxy HTTP para os nós de processamento do Amazon Elastic Kubernetes Service (Amazon EKS) com dados de usuário.

Breve descrição

Para configurar um proxy nos nós de processamento, você deve configurar os componentes necessários do seu cluster do Amazon EKS para se comunicar a partir do proxy. Os componentes incluem, entre outros, o serviço kubelet systemd, kube-proxy, aws-node pods e yum update. Para automatizar a configuração do proxy para nós de processamento com o runtime do Docker, faça o seguinte: 

Observação: a resolução a seguir se aplica somente aos nós em que o runtime subjacente é o Docker e não se aplica aos nós com runtime containerd. Para nós com runtime containerd, consulte How can I automate the configuration of HTTP proxy for EKS containerd nodes? (Como posso automatizar a configuração do proxy HTTP para nós containerd do EKS?)

Resolução

  1. Encontre o bloco CIDR IP do seu cluster:
$ kubectl get service kubernetes -o jsonpath='{.spec.clusterIP}'; echo

O comando anterior retorna 10.100.0.1 ou 172.20.0.1. Isso significa que o bloco CIDR IP do cluster é 10.100.0.0/16 ou 172.20.0.0/16.

  1. Crie um arquivo ConfigMap chamado proxy-env-vars-config.yaml com base na saída do comando na etapa 1.

Se a saída tiver um IP do intervalo 172.20.x.x, estruture seu arquivo ConfigMap da seguinte forma:

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

Observação: substitua VPC_CIDR_RANGE pelo bloco CIDR IPv4 da VPC do seu cluster.

Se a saída tiver um IP do intervalo 10.100.x.x, estruture seu arquivo ConfigMap da seguinte forma:

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

Observação: substitua VPC_CIDR_RANGE pelo bloco CIDR IPv4 da VPC do seu cluster.

Os clusters do Amazon EKS com acesso privado a endpoints do servidor de API, sub-redes privadas e sem acesso à Internet exigem endpoints adicionais. Se você estiver criando um cluster com a configuração anterior, deverá criar e adicionar endpoints para os serviços a seguir:

  • 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 exemplo, você pode usar os endpoints a seguir: api.ecr.us-east-1.amazonaws.com, dkr.ecr.us-east-1.amazonaws.com, s3.amazonaws.com, s3.us-east-1.amazonaws.com e ec2.us-east-1.amazonaws.com.

Importante: você deve adicionar o subdomínio público do endpoint à variável NO_PROXY. Por exemplo, adicione o domínio .s3.us-east-1.amazonaws.com para o Amazon S3 na região da AWS us-east-1. Se você ativar o acesso privado ao endpoint para seu cluster do Amazon EKS, deverá adicionar o endpoint do Amazon EKS à variável NO_PROXY. Por exemplo, adicione o domínio .us-east-1.eks.amazonaws.com para seu cluster do Amazon EKS na região da AWS us-east-1.

  1. Verifique se a variável NO_PROXY em configmap/proxy-environment-variables (usada pelos pods kube-proxy e aws-node) inclui o espaço de endereço IP do cluster Kubernetes. Por exemplo, 10.100.0.0/16 é usado no exemplo de código anterior para o arquivo ConfigMap em que o intervalo de IP é de 10.100.x.x.

  2. Aplique o ConfigMap:

$ kubectl apply -f /path/to/yaml/proxy-env-vars-config.yaml
  1. Para configurar o daemon Docker e o kubelet, injete dados do usuário em seus nós de processamento. Por exemplo:
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: você deve atualizar ou criar arquivos de configuração yum, Docker e kubelet antes de iniciar o daemon Docker e o kubelet.

Para ver um exemplo de dados de usuário que são injetados em nós de processamento usando um modelo do AWS CloudFormation, consulte Lançar nós autogerenciados do Amazon Linux.

  1. Atualize os pods aws-node e 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

Se você alterar o ConfigMap, aplique as atualizações e defina o ConfigMap nos pods novamente. Por exemplo:

$ 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: você deve atualizar todas as modificações do YAML nos objetos Kubernetes kube-proxy ou aws-node quando esses objetos forem atualizados. Para atualizar um ConfigMap para um valor padrão, use os comandos eksctl utils update-kube-proxy ou eksctl utils update-aws-node.

Dica: se o proxy perder a conectividade com o servidor da API, o proxy se tornará um único ponto de falha e o comportamento do seu cluster poderá ficar imprevisível. Para evitar que seu proxy se torne um único ponto de falha, execute-o por trás de um namespace de descoberta de serviços ou balanceador de carga.

  1. Confirme se as variáveis proxy são usadas nos pods kube-proxy e aws-node:
$ kubectl describe pod kube-proxy-xxxx -n kube-system

A saída deve ser semelhante à seguinte:

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

Se você não estiver usando o AWS PrivateLink, verifique o acesso aos endpoints de API por meio de um servidor proxy para Amazon EC2, Amazon ECR e Amazon S3.


AWS OFICIAL
AWS OFICIALAtualizada há um ano