跳至內容

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

7 分的閱讀內容
0

我想要為使用 containerd 執行時期的 Amazon Elastic Kubernetes Service (Amazon EKS) 節點自動化 HTTP Proxy 組態。

簡短說明

您可以透過在使用者資料中包含 Proxy 設定的自訂啟動範本,為 Amazon EKS 節點自動化 HTTP Proxy 組態。組態方法會依您的 AMI 系列而有所不同: Amazon Linux 2、Amazon Linux 2023 或 Bottlerocket。

**注意事項:**對於 1.24 版及更新版本的 Amazon EKS 叢集,containerd 是預設的容器執行時期。

解決方法

若要使用 HTTP Proxy 設定來設定受管節點群組,請使用您的 Amazon Machine Image (AMI) ID 建立自訂啟動範本。接著,為您的 HTTP Proxy 和叢集的環境值設定適當的設定。

根據您的 AMI 系列選擇組態方法:

為 Amazon Linux 2 節點設定 HTTP Proxy

建立啟動範本

  1. 開啟 Amazon Elastic Compute Cloud (Amazon EC2) console (Amazon Elastic Compute Cloud (Amazon EC2) 主控台)。
  2. 在導覽窗格中,選擇 Launch Templates (啟動範本)。
  3. 選擇 Create launch template (建立啟動範本)。
  4. Launch template name (啟動範本名稱) 中,輸入範本名稱。
  5. Application and OS Images (Amazon Machine Image) (應用程式和作業系統映像 (Amazon Machine Image)) 中,選擇您的 Amazon Linux 2 AMI ID。
  6. 設定以下選項:
    Instance type (執行個體類型) 中,選擇所需的執行個體類型。
    Key pair name (金鑰對名稱) 中,選擇您的 Amazon EC2 SSH 金鑰對。
    Security groups (安全群組) 中,選擇您的安全群組。
  7. 展開 Advanced details (進階詳細資訊)。
  8. User data (使用者資料) 中,輸入以下組態:
    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://[IP_ADDRESS]/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
    MAC=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/mac/)
    VPC_CIDR=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/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
    
    #[Optional] 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,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.internal,.eks.amazonaws.com
    NO_PROXY=$VPC_CIDR,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.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
    
    --==BOUNDARY==--
    **注意事項:**將 XXXXXXX:3128 替換為您的 Proxy 主機名稱和連接埠。將 YOUR_CLUSTER_CA 替換為您的叢集憑證認證機構 (CA)。將 API_SERVER_ENDPOINT 替換為您的伺服器端點。將 EKS_CLUSTER_NAME 替換為您的叢集名稱。
  9. 選擇 Create launch template (建立啟動範本)。

驗證組態

使用啟動範本建立受管節點群組後,請驗證 Proxy 組態:

  1. 若要檢查節點的狀態,請執行以下命令:

    kubectl get nodes -o wide
  2. 若要驗證 Proxy 環境變數已設定,請連線至節點並執行以下命令:

    systemctl show containerd | grep Environment

輸出會顯示為 containerd 設定的 Proxy 環境變數。

為 Amazon Linux 2023 節點設定 HTTP Proxy

**注意事項:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

Amazon Linux 2023 導入新的節點初始化程序 nodeadm,其使用 YAML 組態結構描述。在此程序中,nodeadm 會分兩個階段執行:config 和 run。nodeadm-config 階段會在 cloud-init 之前執行,而 nodeadm-run 會在 cloud-init 之後執行。

nodeadm-config 階段期間,系統會呼叫 Amazon EC2 服務以擷取執行個體詳細資訊。若要避免在您設定 Proxy 設定之前呼叫 Amazon EC2,請在 nodeadm 中使用 InstanceIdNodeName 功能閘。

建立工作節點 IAM 角色

  1. 使用必要的政策建立新的工作節點 AWS Identity and Access Management (IAM) 角色

  2. 使用以下其中一個選項,為工作節點 IAM 角色提供適當的存取權:

    選項 1: 建立 EKS 存取項目
    若要建立 EC2 類型的存取項目,請執行以下 create-access-entry AWS CLI 命令:

    aws eks create-access-entry --cluster-name EKS_CLUSTER_NAME --principal-arn WORKER_NODE_IAM_ROLE_ARN --type EC2

    **注意事項:**將 EKS_CLUSTER_NAME 替換為您的叢集名稱。將 WORKER_NODE_IAM_ROLE_ARN 替換為您的工作節點 IAM 角色 ARN。

    選項 2: 更新 aws-auth ConfigMap
    將以下組態以 YAML 格式新增至您的 aws-auth ConfigMap:

    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: ROLE_ARN
      username: system:node:{{SessionName}}

    **注意事項:**將 ROLE_ARN 替換為您的工作節點 IAM 角色 ARN。此組態會將必要的 Kubernetes RBAC 權限授與工作節點 IAM 角色。

建立啟動範本

  1. 開啟 Amazon EC2 console (Amazon EC2 主控台)。
  2. 在導覽窗格中,選擇 Launch Templates (啟動範本)。
  3. 選擇 Create launch template (建立啟動範本)。
  4. Launch template name (啟動範本名稱) 中,輸入範本名稱。
  5. Application and OS Images (Amazon Machine Image) (應用程式和作業系統映像 (Amazon Machine Image)) 中,選擇您的 Amazon Linux 2023 AMI ID。
  6. 設定以下選項:
    Instance type (執行個體類型) 中,選擇所需的執行個體類型。
    Key pair name (金鑰對名稱) 中,選擇您的 Amazon EC2 SSH 金鑰對。
    Security groups (安全群組) 中,選擇您的安全群組。
  7. 展開 Advanced details (進階詳細資訊)。
  8. User data (使用者資料) 中,輸入以下組態:
    MIME-Version: 1.0
    Content-Type: multipart/mixed; boundary="==BOUNDARY=="
    
    --==BOUNDARY==
    Content-Type: text/cloud-boothook; charset="us-ascii"
    
    #!/bin/bash
    
    #Set the proxy hostname and port
    PROXY=XXXXXXX:3128
    TOKEN=`curl -X PUT "http://[IP_ADDRESS]/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
    MAC=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/mac/)
    VPC_CIDR=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v -s http://[IP_ADDRESS]/latest/meta-data/network/interfaces/macs/$MAC/vpc-ipv4-cidr-blocks | xargs | tr ' ' ',')
    
    #[Optional] 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,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.internal,.eks.amazonaws.com
    NO_PROXY=$VPC_CIDR,[IP_ADDRESS],[IP_ADDRESS],[IP_ADDRESS],.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 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: application/node.eks.aws
    
    ---
    apiVersion: node.eks.aws/v1alpha1
    kind: NodeConfig
    spec:
      featureGates:
        InstanceIdNodeName: true
      cluster:
        name: EKS_CLUSTER_NAME
        apiServerEndpoint: API_SERVER_ENDPOINT
        certificateAuthority: YOUR_CLUSTER_CA
        cidr: KUBERNETES_SERVICE_CIDR_RANGE
    
    --==BOUNDARY==--
    **注意事項:**將 XXXXXXX:3128 替換為您的 Proxy 主機名稱和連接埠。將 YOUR_CLUSTER_CA 替換為您的叢集憑證認證機構 (CA)。將 API_SERVER_ENDPOINT 替換為您的伺服器端點。將 EKS_CLUSTER_NAME 替換為您的叢集名稱。將 KUBERNETES_SERVICE_CIDR_RANGE 替換為您叢集的服務 CIDR 範圍。如果未在使用者資料中提供服務 CIDR,則 nodeadm-config 階段會失敗。
  9. 選擇 Create launch template (建立啟動範本)。

驗證組態

使用啟動範本建立受管節點群組後,請驗證 Proxy 組態:

  1. 若要檢查節點的狀態,請執行以下命令:

    kubectl get nodes -o wide
  2. 若要驗證 Proxy 環境變數已設定,請連線至節點並執行以下命令:

    systemctl show containerd | grep Environment

輸出會顯示為 containerd 設定的 Proxy 環境變數。

為 Bottlerocket 節點設定 HTTP Proxy

建立啟動範本

  1. 開啟 Amazon EC2 console (Amazon EC2 主控台)。

  2. 在導覽窗格中,選擇 Launch Templates (啟動範本)。

  3. 選擇 Create launch template (建立啟動範本)。

  4. Launch template name (啟動範本名稱) 中,輸入範本名稱。

  5. Application and OS Images (Amazon Machine Image) (應用程式和作業系統映像 (Amazon Machine Image)) 中,選擇您的 Bottlerocket AMI ID。

  6. 設定以下選項:
    Instance type (執行個體類型) 中,選擇所需的執行個體類型。
    Key pair name (金鑰對名稱) 中,選擇您的 Amazon EC2 SSH 金鑰對。
    Security groups (安全群組) 中,選擇您的安全群組。

  7. 展開 Advanced details (進階詳細資訊)。

  8. User data (使用者資料) 中,輸入以下組態:

    [settings.kubernetes]
    "cluster-name" = "EKS_CLUSTER_NAME"
    "api-server" = "API_SERVER_ENDPOINT"
    "cluster-certificate" = "YOUR_CLUSTER_CA"
    
    [settings.network]
    no-proxy = ["VPC_CIDR_RANGE","[IP_ADDRESS]","[IP_ADDRESS]","[IP_ADDRESS]",".internal",".eks.amazonaws.com"]
    https-proxy = "XXXXXXX:3128"

    **注意事項:**將 XXXXXXX:3128 替換為您的 Proxy 主機名稱和連接埠。將 YOUR_CLUSTER_CA 替換為您的叢集憑證認證機構 (CA)。將 API_SERVER_ENDPOINT 替換為您的伺服器端點。將 EKS_CLUSTER_NAME 替換為您的叢集名稱。將 VPC_CIDR_RANGE 替換為您的 VPC CIDR。Bottlerocket 會自動為 containerd 和 kubelet 服務設定 Proxy 設定。

    若要將自我簽署憑證新增至您的 Bottlerocket 執行個體,請在您的使用者資料區段中使用以下組態:

    [settings.pki.proxy-bundle]
    data="ENCODED_CA_DATA"
    trusted=true

    **注意事項:**將 ENCODED_CA_DATA 替換為 base64 編碼的憑證資料。

    若要編碼您的憑證檔案,請執行以下命令:

    base64 -i FILE -w0
  9. 選擇 Create launch template (建立啟動範本)。

驗證組態

使用啟動範本建立受管節點群組後,請驗證 Proxy 組態:

  1. 若要檢查節點的狀態,請執行以下命令:

    kubectl get nodes -o wide
  2. 若要驗證 Proxy 設定,請使用 AWS Systems Manager Session Manager 連線至 Bottlerocket 節點,並執行以下命令:

    apiclient get settings.network

輸出會顯示為節點設定的 Proxy 設定。

建立受管節點群組

建立啟動範本後,請建立使用自訂啟動範本的新受管節點群組。

如需使用啟動範本建立受管節點群組的詳細資訊,請參閱使用啟動範本自訂受管節點

為完全私有的叢集設定 Proxy

**重要事項:**當您將 EKS Pod 身分識別關聯與 Proxy 組態搭配使用時,您也必須在 no_proxy/NO_PROXY 環境變數中納入 [IP_ADDRESS] (IPv4) 或 [[IP_ADDRESS]] (IPv6)。

具有私有 API 伺服器端點存取、私有子網路且沒有網際網路存取的 Amazon EKS 叢集需要額外的端點。若您使用上述組態建立叢集,則必須為以下服務建立並新增端點:

  • Amazon EC2
  • Amazon Elastic Container Registry 以提取容器映像
  • Application Load Balancer 和 Network Load Balancer 所使用的 Amazon Elastic Load Balancing
  • Amazon CloudWatch Logs
  • 當您使用服務帳戶的 IAM 角色時所需的 AWS Security Token Service
  • 當您使用 Pod 身分識別關聯時所需的 Amazon EKS Auth
  • Amazon EKS

建立這些端點後,請在您的 Amazon EC2 執行個體啟動範本使用者資料中設定 NO_PROXYno_proxy 變數。納入 AWS 區域和服務專屬的公用端點子網域。

例如:

對於 Amazon Simple Storage Service (Amazon S3):

  • 如果您的儲存貯體位於 us-east-1,則新增:.s3.us-east-1.amazonaws.com
  • 如果您的儲存貯體位於 eu-west-1,則新增:.s3.eu-west-1.amazonaws.com

對於使用私有端點存取的 Amazon EKS:

  • 如果您的叢集位於 us-east-1,則新增:.us-east-1.eks.amazonaws.com
  • 如果您的叢集位於 eu-west-1,則新增:.eu-west-1.eks.amazonaws.com

**注意事項:**將區域識別碼替換為您部署資源所在的 AWS 區域,並將這些端點新增至 NO_PROXYno_proxy 變數。請根據叢集的工作負載和附加元件,將其他服務新增至您的 Proxy 組態。

為公共叢集設定 Proxy

**注意事項:**如果您有不同的組態,則這些步驟為選用。

如果您透過 HTTP Proxy 將流量從叢集路由到網際網路,且您的 Amazon EKS 端點為公共端點,則請完成以下任務。

建立 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,[IP_ADDRESS],[IP_ADDRESS],VPC_CIDR_RANGE,[IP_ADDRESS],.internal,.eks.amazonaws.com,ec2.us-east-1.amazonaws.com
  no_proxy: KUBERNETES_SERVICE_CIDR_RANGE,[IP_ADDRESS],[IP_ADDRESS],VPC_CIDR_RANGE,[IP_ADDRESS],.internal,.eks.amazonaws.com,ec2.us-east-1.amazonaws.com

**注意事項:**將 KUBERNETES_SERVICE_CIDR_RANGEVPC_CIDR_RANGE 替換為您的 CIDR 範圍值。建立 VPC 端點 (Amazon EKS 和 Amazon EC2) 後,將 AWS 服務端點新增至 NO_PROXY 和 no_proxy。

套用 ConfigMap:

kubectl apply -f proxy-configmap.yaml

設定 aws-node 和 kube-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 組態

若要驗證 Proxy 組態是否正常運作,請完成以下步驟:

  1. 若要檢查節點的狀態,請執行以下命令:

    kubectl get nodes -o wide
  2. 若要測試 Pod 透過 Proxy 的連線能力,請執行以下命令:

    kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300
    kubectl get pods -A
  3. 檢查您的 Proxy 日誌,以取得節點連線能力的其他資訊。日誌應顯示成功連線 (TCP_TUNNEL/200) 至容器登錄端點。
    範例輸出:

    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 -

相關資訊

從 Amazon Linux 2 升級至 Amazon Linux 2023

建立自行管理的 Bottlerocket 節點

使用 EKS 存取項目授予 IAM 使用者 Kubernetes 存取權

AWS 官方已更新 6 個月前