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

3 分的閱讀內容
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 執行時期後,請使用您的 Amazon Machine Image (AMI) ID建立自訂啟動範本。然後,為 HTTP Proxy 的設定和叢集的環境值進行設定。

注意: 對於使用Docker作為執行階段的節點,請參閱如何自動化為使用Docker的Amazon EKS工作節點設定HTTP代理?

解決方法

建立自訂啟動範本

若要將 containerd 指定為執行時期,並建立自訂啟動範本,請完成下列步驟:

  1. containerd 指定為您受管理節點群組中的執行期。在 userdata 中,為 bootstrap.sh 使用 --container-runtime=containerd 選項。

  2. 使用 AMI ID 建立自訂啟動範本。如果您沒有這樣做,則受管理節點群組會自動合併 userdata

  3. 將 Proxy 組態設為 containerdsandbox-imagekubelet
    注意: Sandbox-image 是為 containerd 提取沙盒映像檔的服務單元。

  4. 使用下列欄位說明 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:3128YOUR_CLUSTER_CAAPI_SERVER_ENDPOINTEKS_CLUSTER_NAME 取代為您的 Proxy、叢集憑證授權單位 (CA)、伺服器端點及叢集名稱。建立虛擬私有雲端 (VPC) 端點後,將 AWS 服務端點新增至 NO_PROXYno_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_RANGEVPC_CIDR_RANGE 取代為 CIDR 範圍的值。在建立 VPC 端點之後,將 AWS 服務端點新增至 NO_PROXYno_proxy

然後,將您的 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 中建立叢集後,為其他 IAM 使用者和角色提供存取權?

AWS 官方
AWS 官方已更新 8 個月前