如何為 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 執行時期後,請使用您的 Amazon Machine Image (AMI) ID建立自訂啟動範本。然後,為 HTTP Proxy 的設定和叢集的環境值進行設定。
注意: 對於使用Docker作為執行階段的節點,請參閱如何自動化為使用Docker的Amazon EKS工作節點設定HTTP代理?
解決方法
建立自訂啟動範本
若要將 containerd 指定為執行時期,並建立自訂啟動範本,請完成下列步驟:
-
將 containerd 指定為您受管理節點群組中的執行期。在 userdata 中,為 bootstrap.sh 使用 --container-runtime=containerd 選項。
-
使用 AMI ID 建立自訂啟動範本。如果您沒有這樣做,則受管理節點群組會自動合併 userdata。
-
將 Proxy 組態設為 containerd、sandbox-image 及 kubelet。
注意: Sandbox-image 是為 containerd 提取沙盒映像檔的服務單元。 -
使用下列欄位說明 userdata:
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==--
注意: 將 XXXXXXX:3128、YOUR_CLUSTER_CA、API_SERVER_ENDPOINT 和 EKS_CLUSTER_NAME 取代為您的 Proxy、叢集憑證授權單位 (CA)、伺服器端點及叢集名稱。建立虛擬私有雲端 (VPC) 端點後,將 AWS 服務端點新增至 NO_PROXY 和 no_proxy。
為 aws-node 和 kube-proxy 設定 Proxy 設定
**注意:**如果您透過 HTTP Proxy 將流量從叢集路由到網際網路,而且 EKS 端點為公有,則必須完成這些步驟。如果您有不同的組態,則這些步驟是選擇性的。
建立 ConfigMap 以設定環境值。然後,在您的叢集中套用 ConfigMap。使用下列指令碼作為 ConfigMap 的範例:
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
注意: 將 KUBERNETES_SERVICE_CIDR_RANGE 和 VPC_CIDR_RANGE 取代為 CIDR 範圍的值。在建立 VPC 端點之後,將 AWS 服務端點新增至 NO_PROXY 和 no_proxy。
然後,將您的 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 -
相關資訊
相關內容
- 已提問 1 個月前lg...
- AWS 官方已更新 1 個月前
- AWS 官方已更新 9 個月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前