Ir para o conteúdo

Como faço para automatizar a configuração do proxy HTTP para nós de processamento do Amazon EKS com o Docker?

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.

Resolução

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 Como posso automatizar a configuração do proxy HTTP para nós containerd do Amazon EKS?

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 um runtime do Docker, conclua as seguintes etapas:

  1. Encontre o bloco CIDR do endereço IP do seu cluster:

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

    Observação: o comando anterior retorna 10.100.0.1 ou 172.20.0.1, então o bloco CIDR do endereço IP do cluster é 10.100.0.0/16 ou 172.20.0.0/16.

  2. Com base na saída do comando, crie um arquivo ConfigMap chamado proxy-env-vars-config.yaml.
    Se a saída tiver um endereço IP do intervalo 172.20.x.x, use a seguinte estrutura 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

    Observação: substitua VPC_CIDR_RANGE pelo bloco CIDR de endereço IPv4 da nuvem privada virtual (VPC) do seu cluster.
    Se a saída tiver um endereço IP do intervalo 10.100.x.x, use a seguinte estrutura 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

    Observação: substitua VPC_CIDR_RANGE pelo bloco CIDR de endereço 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, deve 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)
    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, deve 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.

  3. 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 do Kubernetes. Por exemplo, 10.100.0.0/16 é usado no exemplo de código anterior para o arquivo ConfigMap em que o intervalo de endereço IP é de 10.100.x.x.

  4. Aplique o ConfigMap:

    $ kubectl apply -f /path/to/yaml/proxy-env-vars-config.yaml
  5. Para configurar o Docker daemon e o kubelet, inclua dados do usuário em seus nós de processamento:

    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 Docker daemon e o kubelet.
    Para obter mais informações sobre como usar um modelo do AWS CloudFormation para incluir dados de usuário nos nós de processamento, consulte Criar nós autogerenciados do Amazon Linux.

  6. Para atualizar os pods aws-node e kube-proxy, execute os seguintes 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

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

    $ 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: ao atualizar o kube-proxy ou o aws-node, você também deve atualizar todas as modificações do YAML. Para atualizar um ConfigMap para um valor padrão, use os comandos eksctl utils update-kube-proxy ou eksctl utils update-aws-node.
    Se o proxy perder a conectividade ao servidor da API, o proxy se torna um único ponto de falha e o comportamento do seu cluster pode ficar imprevisível. Para evitar esse problema, execute seu proxy atrás de um namespace de descoberta de serviços ou balanceador de carga.

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

    Exemplo de saída:

    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

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

AWS OFICIALAtualizada há um ano