スキップしてコンテンツを表示

Amazon EKS の containerd ノードに対する HTTP プロキシの設定を自動化する方法を教えてください。

所要時間6分
0

containerd ランタイムを使用して、Amazon Elastic Kubernetes Service (Amazon EKS) ノードの HTTP プロキシ設定を自動化したいと思います。

簡単な説明

ユーザーデータにプロキシ設定が含まれるカスタム起動テンプレートを使用して、Amazon EKS ノードの HTTP プロキシ設定を自動化できます。設定方法は AMI ファミリー (Amazon Linux 2、Amazon Linux 2023、Bottlerocket) によって異なります。

注: Amazon EKS クラスターバージョン 1.24 以降では、containerd がデフォルトのコンテナランタイムです。

解決策

HTTP プロキシ設定を使用してマネージドノードグループを設定するには、Amazon マシンイメージ (AMI) ID を使用してカスタム起動テンプレートを作成します。その後、HTTP プロキシとクラスターの環境値を適切に設定します。

お使いの AMI ファミリーに基づいて設定方法を選択してください。

Amazon Linux 2 ノード用の HTTP プロキシを設定する

起動テンプレートを作成する

  1. Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。
  2. ナビゲーションペインで、[起動テンプレート] を選択します。
  3. [起動テンプレートの作成] を選択します。
  4. [起動テンプレート名] には、テンプレートの名前を入力します。
  5. [アプリケーションと OS イメージ (Amazon マシンイメージ)] には、Amazon Linux 2 AMI ID を選択してください。
  6. 次のオプションを設定します。
    [インスタンスタイプ] には、必要なインスタンスタイプを選択します。
    [キーペア名] には、Amazon EC2 SSH キーペアを選択します。
    [セキュリティグループ] には、お持ちのセキュリティグループを選択します。
  7. [高度な詳細] を展開します。
  8. [ユーザーデータ] には、次の設定を入力します。
    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 をお使いのプロキシホスト名とポートに置き換えてください。YOUR_CLUSTER_CA をクラスター認証局 (CA) に置き換えてください。API_SERVER_ENDPOINT をお使いのサーバーエンドポイントに置き換えてください。EKS_CLUSTER_NAME をクラスター名に置き換えてください。
  9. [起動テンプレートの作成] を選択します。

設定を確認する

起動テンプレートを使用してマネージドノードグループを作成したら、プロキシ設定を確認します。

  1. ノードのステータスを確認するには、次のコマンドを実行します。

    kubectl get nodes -o wide
  2. プロキシ環境変数が設定されていることを確認するには、ノードに接続して次のコマンドを実行してください。

    systemctl show containerd | grep Environment

出力には、containerd 用に設定されたプロキシ環境変数が表示されます。

Amazon Linux 2023 ノード用の HTTP プロキシを設定する

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

Amazon Linux 2023 では、YAML 設定スキーマを使用する nodeadm という新しいノード初期化プロセスが使用されます。このプロセスでは、nodeadm は「設定」と「実行」の 2 つのフェーズで実行されます。nodeadm-config フェーズは cloud-init の前に実行され、nodeadm-run フェーズは cloud-init の後に実行されます。

nodeadm-config フェーズ中にシステムは Amazon EC2 サービスを呼び出し、インスタンスの詳細を取得します。プロキシ設定を構成する前に Amazon EC2 呼び出しを防止するには、nodeadmInstanceIdNodeName 機能ゲートを使用してください。

ワーカーノードの 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 コンソールを開きます。
  2. ナビゲーションペインで、[起動テンプレート] を選択します。
  3. [起動テンプレートの作成] を選択します。
  4. [起動テンプレート名] には、テンプレートの名前を入力します。
  5. [アプリケーションと OS イメージ (Amazon マシンイメージ)] には、Amazon Linux 2023 AMI ID を選択してください。
  6. 次のオプションを設定します。
    [インスタンスタイプ] には、必要なインスタンスタイプを選択します。
    [キーペア名] には、Amazon EC2 SSH キーペアを選択します。
    [セキュリティグループ] には、お持ちのセキュリティグループを選択します。
  7. [高度な詳細] を展開します。
  8. [ユーザーデータ] には、次の設定を入力します。
    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 をお使いのプロキシホスト名とポートに置き換えてください。YOUR_CLUSTER_CA をクラスター認証局 (CA) に置き換えてください。API_SERVER_ENDPOINT をお使いのサーバーエンドポイントに置き換えてください。EKS_CLUSTER_NAME をクラスター名に置き換えてください。KUBERNETES_SERVICE_CIDR_RANGE をクラスターのサービス CIDR 範囲に置き換えてください。サービス CIDR がユーザーデータで提供されていない場合、nodeadm-config フェーズは失敗します。
  9. [起動テンプレートの作成] を選択します。

設定を確認する

起動テンプレートを使用してマネージドノードグループを作成したら、プロキシ設定を確認します。

  1. ノードのステータスを確認するには、次のコマンドを実行します。

    kubectl get nodes -o wide
  2. プロキシ環境変数が設定されていることを確認するには、ノードに接続して次のコマンドを実行してください。

    systemctl show containerd | grep Environment

出力には、containerd 用に設定されたプロキシ環境変数が表示されます。

Bottlerocket ノードの HTTP プロキシを設定する

起動テンプレートを作成する

  1. Amazon EC2 コンソールを開きます。

  2. ナビゲーションペインで、[起動テンプレート] を選択します。

  3. [起動テンプレートの作成] を選択します。

  4. [起動テンプレート名] には、テンプレートの名前を入力します。

  5. アプリケーションと OS イメージ (Amazon マシンイメージ) には、Bottlerocket AMI ID を選択します。

  6. 次のオプションを設定します。
    [インスタンスタイプ] には、必要なインスタンスタイプを選択します。
    [キーペア名] には、Amazon EC2 SSH キーペアを選択します。
    [セキュリティグループ] には、お持ちのセキュリティグループを選択します。

  7. [高度な詳細] を展開します。

  8. [ユーザーデータ] には、次の設定を入力します。

    [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 をお使いのプロキシホスト名とポートに置き換えてください。YOUR_CLUSTER_CA をクラスター認証局 (CA) に置き換えてください。API_SERVER_ENDPOINT をお使いのサーバーエンドポイントに置き換えてください。EKS_CLUSTER_NAME をクラスター名に置き換えてください。VPC_CIDR_RANGE をお使いの VPC CIDR に置き換えてください。Bottlerocket は、containerd サービスと kubelet サービスのプロキシ設定を自動的に構成します。

    Bottlerocket インスタンスに自己署名証明書を追加するには、ユーザーデータセクションで次の設定を使用します。

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

    注: ENCODED_CA_DATA を base64 でエンコードされた証明書データに置き換えます。

    証明書ファイルをエンコードするには、次のコマンドを実行します。

    base64 -i FILE -w0
  9. [起動テンプレートの作成] を選択します。

設定を確認する

起動テンプレートを使用してマネージドノードグループを作成したら、プロキシ設定を確認します。

  1. ノードのステータスを確認するには、次のコマンドを実行します。

    kubectl get nodes -o wide
  2. プロキシ設定を確認するには、AWS Systems Manager Session Manager を使用して Bottlerocket ノードに接続し、次のコマンドを実行します。

    apiclient get settings.network

出力には、ノードに構成されたプロキシ設定が表示されます。

マネージドノードグループを作成する

起動テンプレートを作成したら、カスタム起動テンプレートを使用する新しいマネージドノードグループを作成します。

起動テンプレートを使用したマネージドノードグループの作成に関する詳細については、「起動テンプレートを使用してマネージドノードをカスタマイズする」を参照してください。

完全にプライベートなクラスター用のプロキシを設定する

重要: EKS Pod Identity の関連付けをプロキシ設定で使用する場合、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 Identity の関連付けを使用する場合の Amazon EKS 認証
  • Amazon EKS

これらのエンドポイントを作成したら、Amazon EC2 インスタンス起動テンプレートのユーザーデータに NO_PROXY 変数と no_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_PROXY 変数と no_proxy 変数の両方に追加します。クラスターのワークロードとアドオンに応じて、プロキシ設定に他のサービスを追加します。

パブリッククラスター用のプロキシを設定する

注: 設定が異なる場合、これらの手順は任意で使用できます。

HTTP プロキシを介してクラスターからインターネットにトラフィックをルーティングし、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 プロキシ設定を 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

プロキシ設定を確認する

プロキシ設定が正しく機能していることを確認するには、次の手順を実行します。

  1. ノードのステータスを確認するには、次のコマンドを実行します。

    kubectl get nodes -o wide
  2. プロキシを介してポッド接続をテストするには、次のコマンドを実行します。

    kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300
    kubectl get pods -A
  3. ノードの接続に関する詳細情報については、プロキシログを確認してください。ログには、コンテナレジストリエンドポイントへの正常な接続 (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 アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する

AWS公式更新しました 4ヶ月前
コメントはありません

関連するコンテンツ