如何使用用户数据自动配置 EKS Worker 节点的 HTTP 代理?
我想使用用户数据自动配置 Amazon Elastic Kubernetes Service(Amazon EKS)Worker 节点的 HTTP 代理。
简短描述
要在 Worker 节点上设置代理,您必须配置 Amazon EKS 集群通过代理进行通信所需的组件。组件包括但不限于 kubelet systemd 服务、kube-proxy、aws-node 容器组(pod)和 yum update。 要使用 Docker 运行时自动配置 Worker 节点的代理,请执行以下操作:
**注意:**以下解决方法仅适用于底层运行时为 Docker 的节点,不适用于具有 containerd 运行时的节点。对于具有 containerd 运行时的节点,请参阅如何自动配置 EKS containerd 节点的 HTTP 代理?
解决方法
1.查找您的集群的 IP CIDR 块:
$ kubectl get service kubernetes -o jsonpath='{.spec.clusterIP}'; echo
前面的命令返回 10.100.0.1 或 172.20.0.1。这表示您的集群 IP CIDR 块为 10.100.0.0/16 或 172.20.0.0/16。
2.根据第 1 步中的命令的输出创建一个名为 proxy-env-vars-config.yaml 的 ConfigMap 文件。
如果该输出含有来自范围 172.20.x.x 内的 IP,则将按下述方式设计 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
**注意:**请将 VPC_CIDR_RANGE 替换为您的集群 VPC 的 IPv4 CIDR 块。
如果该输出含有来自范围 10.100.x.x 内的 IP,则将按下述方式设计 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
**注意:**请将 VPC_CIDR_RANGE 替换为您的集群 VPC 的 IPv4 CIDR 块。
具有私有 API 服务器端点访问权限、私有子网且没有互联网访问权限的 Amazon EKS 集群需要额外的端点。如果您使用上述配置构建集群,则必须为以下服务创建和添加端点:
- Amazon Elastic Container Registry(Amazon ECR)
- Amazon Simple Storage Service (Amazon S3)
- Amazon Elastic Compute Cloud (Amazon EC2)
- Amazon Virtual Private Cloud(Amazon VPC)
例如,您可以使用以下端点:api.ecr.us-east-1.amazonaws.com、dkr.ecr.us-east-1.amazonaws.com、s3.amazonaws.com、s3.us-east-1.amazonaws.com 和 ec2.us-east-1.amazonaws.com。
**重要提示:**您必须为 NO_PROXY 变量添加公有端点子域。例如,为 us-east-1 AWS 区域中的 Amazon S3 添加 .s3.us-east-1.amazonaws.com 域。如果您为 Amazon EKS 集群激活端点私有访问权限,则必须将 Amazon EKS 端点添加到 NO_PROXY 变量。例如,为 us-east-1 AWS 区域中的 Amazon EKS 集群添加 .us-east-1.eks.amazonaws.com 域。
3.验证 configmap/proxy-environment-variables [由 kube-proxy 和 aws-node 容器组(pod)使用] 中的 NO_PROXY 变量是否包含 Kubernetes 集群 IP 地址空间。例如,在 IP 范围来自 10.100.x.x 的 ConfigMap 文件的前述代码示例中,使用 10.100.0.0/16。
4.应用 ConfigMap:
$ kubectl apply -f /path/to/yaml/proxy-env-vars-config.yaml
5.要配置 Docker 进程守护程序和 kubelet,请将用户数据注入您的 Worker 节点。例如:
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==--
**重要提示:**启动 Docker 进程守护程序和 kubelet 之前,您必须更新或创建 yum、Docker 和 kubelet 配置文件。
有关使用 AWS CloudFormation 模板将用户数据注入 Worker 节点的示例,请参阅启动自行管理的 Amazon Linux 节点。
6.更新 aws-node 和 kube-proxy 容器组(pod):
$ 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
如果您更改了 ConfigMap,则应用更新,并重新设置 pod 中的 ConfigMap。例如:
$ 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='*'
**重要提示:**升级这些对象时,您必须将所有的 YAML 修改更新到 Kubernetes 对象 kube-proxy 或 aws-node 中。要将 ConfigMap 更新为默认值,请使用 eksctl utils update-kube-proxy 或 eksctl utils update-aws-node 命令。
**提示:**如果代理丢失了与 API 服务器的连接,则该代理会变为单点故障,且您的集群行为可能不可预测。为了防止您的代理变为单点故障,在服务发现命名空间或负载均衡器后台运行您的代理。
7.确认 kube-proxy 和 aws-node 容器组(pod)中使用代理变量:
$ kubectl describe pod kube-proxy-xxxx -n kube-system
输出应类似于以下内容:
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
如果您没有使用 AWS PrivateLink,请验证是否能够通过 Amazon EC2、Amazon ECR 和 Amazon S3 的代理服务器访问 API 端点。
相关内容
- 已提问 1 个月前lg...
- 已提问 1 个月前lg...
- 已提问 3 个月前lg...
- 已提问 4 个月前lg...
- 已提问 4 个月前lg...
- AWS 官方已更新 3 个月前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 个月前
- AWS 官方已更新 1 年前