如何為 Amazon EKS containerd 節點自動化 HTTP Proxy 的組態?

4 分的閱讀內容
0

我想要透過 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 的組態?

解決方案

建立自訂啟動範本

  1. containerd 指定為您受管理節點群組中的執行期。在 userdata 中,為 bootstrap.sh 使用 --container-runtime=containerd 選項。
  2. 使用 AMI ID 建立自訂「啟動範本」。否則,受管理節點群組會在未指定 AMI ID 時自動合併 userdata
  3. 將 Proxy 組態設為 containerdsandbox-image,以及 kubelet。sandbox-image 是為 containerd 提取沙盒映像檔的服務單元。若要設定此組態,請參閱 GitHub 上的 sandbox-image.servicepull-sandbox-image.sh 指令碼。
  4. 現在,您可以使用下列欄位說明 userdata
    **注意事項:**將 XXXXXXX:3128YOUR_CLUSTER_CAAPI_SERVER_ENDPOINT,以及 EKS_CLUSTER_NAME 取代為您的相關 Proxy、叢集 CA、伺服器端點及叢集名稱。您可以在建立 AWS 服務端點的 VPC 端點之後,將其新增至 NO_PROXYno_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_RANGEVPC_CIDR_RANGE 取代為 CIDR 範圍的相關值。例如,將 KUBERNETES_SERVICE_CIDR_RANGE 取代為 10.100.0.0/16,並且將 VPC_CIDR_RANGE 取代為 192.168.0.0/16。您可以在建立 AWS 服務端點的 VPC 端點之後,將其新增至 NO_PROXYno_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-nodekube-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) 使用者和角色的存取權?

AWS 官方
AWS 官方已更新 1 年前