Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
Wie kann ich die Konfiguration des HTTP-Proxys für EKS-Worker-Knoten mit Benutzerdaten automatisieren?
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
- 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.
- 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.
-
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.
-
Wenden Sie die ConfigMap an:
$ kubectl apply -f /path/to/yaml/proxy-env-vars-config.yaml
- 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.
- 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.
- 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.

Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 4 Monaten
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren