Wie kann ich die Konfiguration des HTTP-Proxys für EKS-Worker-Knoten mit Benutzerdaten automatisieren?

Lesedauer: 6 Minute
0

Ich möchte die Konfiguration des HTTP-Proxys für Amazon Elastic Kubernetes Service (Amazon EKS)-Worker-Knoten mit Benutzerdaten automatisieren.

Kurzbeschreibung

Um einen Proxy auf Worker-Knoten einzurichten, müssen Sie die erforderlichen Komponenten Ihres Amazon EKS-Clusters für die Kommunikation vom Proxy aus konfigurieren. Zu den Komponenten gehören unter anderem der Kubelet-Systemd-Service, Kube-Proxy, aws-Node-Pods und Yum-Update. Gehen Sie wie folgt vor, um die Konfiguration des Proxys für Worker-Knoten mit Docker-Laufzeit zu automatisieren:

Hinweis: Die folgende Lösung gilt nur für Knoten, bei denen die zugrunde liegende Laufzeit Docker ist, und gilt nicht für Knoten mit containerd-Laufzeit. Informationen zu Knoten mit Container-Laufzeit finden Sie unter Wie kann ich die Konfiguration des HTTP-Proxys für EKS-containerd-Knoten automatisieren?

Lösung

  1. Finden Sie den IP-CIDR-Block Ihres Clusters:
$ kubectl get service kubernetes -o jsonpath='{.spec.clusterIP}'; echo

Der vorherige Befehl gibt entweder 10.100.0.1 oder 172.20.0.1.zurück. Dies bedeutet, dass Ihr Cluster-IP-CIDR-Block entweder 10.100.0.0/16 oder 172.20.0.0/16 ist.

  1. Erstellen Sie eine ConfigMap-Datei mit dem Namen proxy-env-vars-config.yaml, die auf der Ausgabe des Befehls in Schritt 1 basiert.

Wenn die Ausgabe eine IP aus dem Bereich 172.20.x.x hat, strukturieren Sie Ihre ConfigMap-Datei wie folgt:

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

**Hinweis:**Ersetzen Sie VPC\ _CIDR\ _RANGE durch den IPv4-CIDR-Block der VPC Ihres Clusters.

Wenn die Ausgabe eine IP aus dem Bereich 10.100.x.x hat, strukturieren Sie Ihre ConfigMap-Datei wie folgt:

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

**Hinweis:**Ersetzen Sie VPC\ _CIDR\ _RANGE durch den IPv4-CIDR-Block der VPC Ihres Clusters.

Amazon EKS-Cluster mit privatem API-Serverendpunktzugriff, privaten Subnetzen und ohne Internetzugang erfordern zusätzliche Endpunkte. Wenn Sie einen Cluster mit der vorherigen Konfiguration erstellen, müssen Sie Endpunkte für die folgenden Dienste erstellen und hinzufügen:

  • Amazon Elastic Container Registry (Amazon ECR)
  • Amazon Simple Storage Service (Amazon S3)
  • Amazon Elastic Compute Cloud (Amazon EC2)
  • Amazon Virtual Private Cloud (Amazon VPC)

Sie können beispielsweise die folgenden Endpunkte verwenden: api.ecr.us-east-1.amazonaws.com, dkr.ecr.us-east-1.amazonaws.com, s3.amazonaws.com, s3.us-east-1.amazonaws.com und ec2.us-east-1.amazonaws.com.

Wichtig: Sie müssen die Subdomain für öffentliche Endpunkte zur Variablen NO\ _PROXY hinzufügen. Fügen Sie beispielsweise die Domain .s3.us-east-1.amazonaws.com für Amazon S3 in der AWS-Region us-east-1 hinzu. Wenn Sie den privaten Endpunktzugriff für Ihren Amazon EKS-Cluster aktivieren, müssen Sie den Amazon EKS-Endpunkt zur Variablen NO_PROXY hinzufügen. Fügen Sie beispielsweise die Domain .us-east-1.eks.amazonaws.com für Ihren Amazon EKS-Cluster in der AWS-Region us-east-1 hinzu.

  1. Stellen Sie sicher, dass die Variable NO\ _PROXY in configmap/proxy-environment-variables (verwendet von den kube-proxy- und aws-node-Pods) den IP-Adressraum des Kubernetes-Clusters enthält. Beispielsweise wird 10.100.0.0/16 im vorherigen Codebeispiel für die ConfigMap-Datei verwendet, wobei der IP-Bereich von 10.100.x.x reicht.

  2. Wenden Sie die ConfigMap an:

$ kubectl apply -f /path/to/yaml/proxy-env-vars-config.yaml
  1. Um den Docker-Daemon und das Kubelet zu konfigurieren, fügen Sie Benutzerdaten in Ihre Worker-Knoten ein. Zum Beispiel:
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==--

Wichtig: Sie müssen die Yum-, Docker- und **Kubelet-**Konfigurationsdateien aktualisieren oder erstellen, bevor Sie den Docker-Daemon und das Kubelet.starten.

Ein Beispiel für Benutzerdaten, die mithilfe einer AWS CloudFormation-Vorlage in Worker-Knoten eingespeist werden, finden Sie unter Selbstverwaltete Amazon-Linux-Knoten starten.

  1. Aktualisieren Sie die Pods aws-node und 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

Falls Sie die ConfigMap ändern, wenden Sie die Updates an und stellen Sie die ConfigMap erneut in den Pods ein. Zum Beispiel:

$ 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='*'

Wichtig: Sie müssen alle YAML-Änderungen an den Kubernetes-Objekten kube-proxy oder aws-node aktualisieren, wenn diese Objekte aktualisiert werden. Um eine ConfigMap auf einen Standardwert zu aktualisieren, verwenden Sie die Befehle eksctl utils update-kube-proxy oder eksctl utils update-aws-node.

Tipp: Falls der Proxy die Konnektivität zum API-Server verliert, wird der Proxy zu einem einzigen Fehlerpunkt und das Verhalten Ihres Clusters kann unvorhersehbar sein. Um zu verhindern, dass Ihr Proxy zu einem einzigen Fehlerpunkt wird, führen Sie Ihren Proxy hinter einem Service Discovery-Namespace oder Load Balancer aus.

  1. Vergewissern Sie sich, dass die Proxy-Variablen in den Pods kube-proxy und aws-node verwendet werden:
$ kubectl describe pod kube-proxy-xxxx -n kube-system

Die Ausgabe sollte etwa wie folgt aussehen:

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

Wenn Sie AWS PrivateLink nicht verwenden, überprüfen Sie den Zugriff auf API-Endpunkte über einen Proxyserver für Amazon EC2, Amazon ECR und Amazon S3.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr