如何為 Amazon EKS containerd 節點自動化 HTTP Proxy 的組態?
我想要透過 containerd 執行期,為 Amazon Elastic Kubernetes Service (Amazon EKS) 節點自動化 HTTP Proxy 的組態。
簡短說明
對於您在 Amazon EKS 1.23 版或更早版本中建立的「受管理節點群組」,預設的容器執行期為 Docker。如果此情況適用於您,則請務必遵循解決方案中的所有步驟,以指定 containerd 執行期。對於您在 Amazon EKS 1.24 版或更新版本中建立的受管理節點群組,預設的容器執行期為 containerd。
若要在您的受管理節點群組中使用 containerd,而不是 dockerd,您必須指定 userdata 中的 containerd 執行期。
將您的受管理節點群組切換至 containerd 執行期後,請使用您的 AMI ID 建立自訂啟動範本。然後,您可以為 HTTP Proxy 的設定和叢集的環境值進行設定。
**注意事項:**下列解決方案僅適用於基礎執行期為 containerd 的節點,並且不適用於使用 Docker 執行期的節點。如需使用 Docker 執行期的節點,請參閱如何為 Docker 的 EKS 工作節點自動化 HTTP Proxy 的組態?
解決方案
建立自訂啟動範本
- 將 containerd 指定為您受管理節點群組中的執行期。在 userdata 中,為 bootstrap.sh 使用 --container-runtime=containerd 選項。
- 使用 AMI ID 建立自訂「啟動範本」。否則,受管理節點群組會在未指定 AMI ID 時自動合併 userdata。
- 將 Proxy 組態設為 containerd、sandbox-image,以及 kubelet。sandbox-image 是為 containerd 提取沙盒映像檔的服務單元。若要設定此組態,請參閱 GitHub 上的 sandbox-image.service 和 pull-sandbox-image.sh 指令碼。
- 現在,您可以使用下列欄位說明 userdata:
**注意事項:**將 XXXXXXX:3128、YOUR_CLUSTER_CA、API_SERVER_ENDPOINT,以及 EKS_CLUSTER_NAME 取代為您的相關 Proxy、叢集 CA、伺服器端點及叢集名稱。您可以在建立 AWS 服務端點的 VPC 端點之後,將其新增至 NO_PROXY 和 no_proxy。
MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==BOUNDARY==" --==BOUNDARY== Content-Type: text/cloud-boothook; charset="us-ascii" #Set the proxy hostname and port PROXY=XXXXXXX:3128 TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` MAC=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://169.254.169.254/latest/meta-data/mac/) VPC_CIDR=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MAC/vpc-ipv4-cidr-blocks | xargs | tr ' ' ',') #Create the containerd and sandbox-image systemd directory mkdir -p /etc/systemd/system/containerd.service.d mkdir -p /etc/systemd/system/sandbox-image.service.d #[Option] 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,.eks.amazonaws.com NO_PROXY=$VPC_CIDR,localhost,127.0.0.1,169.254.169.254,.internal,.eks.amazonaws.com EOF #Configure Containerd with the proxy cloud-init-per instance containerd_proxy_config tee <<EOF /etc/systemd/system/containerd.service.d/http-proxy.conf >/dev/null [Service] EnvironmentFile=/etc/environment EOF #Configure sandbox-image with the proxy cloud-init-per instance sandbox-image_proxy_config tee <<EOF /etc/systemd/system/sandbox-image.service.d/http-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 cloud-init-per instance reload_daemon systemctl daemon-reload --==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 #Run the bootstrap.sh script B64_CLUSTER_CA=YOUR_CLUSTER_CA API_SERVER_URL=API_SERVER_ENDPOINT /etc/eks/bootstrap.sh EKS_CLUSTER_NAME --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --container-runtime containerd --==BOUNDARY==--
為 aws-node 和 kube-proxy 設定 Proxy 設定
建立 ConfigMap 以設定環境值。然後,將其套用至您的叢集中。使用下列指令碼作為 ConfigMap 的範例: **注意事項:**將 KUBERNETES_SERVICE_CIDR_RANGE 和 VPC_CIDR_RANGE 取代為 CIDR 範圍的相關值。例如,將 KUBERNETES_SERVICE_CIDR_RANGE 取代為 10.100.0.0/16,並且將 VPC_CIDR_RANGE 取代為 192.168.0.0/16。您可以在建立 AWS 服務端點的 VPC 端點之後,將其新增至 NO_PROXY 和 no_proxy。
apiVersion: v1 kind: ConfigMap metadata: name: proxy-environment-variables namespace: kube-system data: HTTP_PROXY: http://XXXXXXX:3128 HTTPS_PROXY: http://XXXXXXX:3128 NO_PROXY: KUBERNETES_SERVICE_CIDR_RANGE,localhost,127.0.0.1,VPC_CIDR_RANGE,169.254.169.254,.internal,.eks.amazonaws.com
然後,將您的 HTTP Proxy 組態設為 aws-node 和 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
建立受管理節點群組
建立使用您先前所建立自訂啟動範本的新受管理節點群組。請遵循建立受管理節點群組中的步驟。
測試您的 Proxy
若要檢查節點狀態,請執行下列命令:
$ kubectl get nodes $ kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300 $ kubectl get pods -A
您會收到類似於下列範例的輸出:
$ kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ip-192-168-100-114.ap-northeast-1.compute.internal Ready <none> 2m27s v1.23.13-eks-fb459a0 192.168.100.114 <none> Amazon Linux 2 5.4.219-126.411.amzn2.x86_64 containerd://1.6.6 $ kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300 pod/test-pod created $ kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE default test-pod 1/1 Running 0 14s kube-system aws-node-cpjcl 1/1 Running 0 3m34s kube-system coredns-69cfddc4b4-c7rpd 1/1 Running 0 26m kube-system coredns-69cfddc4b4-z5jxq 1/1 Running 0 26m kube-system kube-proxy-g2f4g 1/1 Running 0 3m34s
檢查您的 Proxy 日誌,以取得節點連線上的其他資訊:
192.168.100.114 TCP_TUNNEL/200 6230 CONNECT registry-1.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX - 192.168.100.114 TCP_TUNNEL/200 10359 CONNECT auth.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX - 192.168.100.114 TCP_TUNNEL/200 6633 CONNECT registry-1.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX - 192.168.100.114 TCP_TUNNEL/200 10353 CONNECT auth.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX - 192.168.100.114 TCP_TUNNEL/200 8767 CONNECT registry-1.docker.io:443 - HIER_DIRECT/XX.XX.XX.XX -
相關資訊
如何在 Amazon EKS 中建立叢集後,提供其他 AWS Identity and Access Management (IAM) 使用者和角色的存取權?
相關內容
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 9 個月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前