Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Amazon EKS の containerd ノードに対する HTTP プロキシの設定を自動化する方法を教えてください。
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 プロキシを設定する
起動テンプレートを作成する
- Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。
- ナビゲーションペインで、[起動テンプレート] を選択します。
- [起動テンプレートの作成] を選択します。
- [起動テンプレート名] には、テンプレートの名前を入力します。
- [アプリケーションと OS イメージ (Amazon マシンイメージ)] には、Amazon Linux 2 AMI ID を選択してください。
- 次のオプションを設定します。
[インスタンスタイプ] には、必要なインスタンスタイプを選択します。
[キーペア名] には、Amazon EC2 SSH キーペアを選択します。
[セキュリティグループ] には、お持ちのセキュリティグループを選択します。 - [高度な詳細] を展開します。
- [ユーザーデータ] には、次の設定を入力します。
注: XXXXXXX:3128 をお使いのプロキシホスト名とポートに置き換えてください。YOUR_CLUSTER_CA をクラスター認証局 (CA) に置き換えてください。API_SERVER_ENDPOINT をお使いのサーバーエンドポイントに置き換えてください。EKS_CLUSTER_NAME をクラスター名に置き換えてください。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==-- - [起動テンプレートの作成] を選択します。
設定を確認する
起動テンプレートを使用してマネージドノードグループを作成したら、プロキシ設定を確認します。
-
ノードのステータスを確認するには、次のコマンドを実行します。
kubectl get nodes -o wide -
プロキシ環境変数が設定されていることを確認するには、ノードに接続して次のコマンドを実行してください。
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 呼び出しを防止するには、nodeadm の InstanceIdNodeName 機能ゲートを使用してください。
ワーカーノードの IAM ロールを作成する
-
必要なポリシーを含む新しいワーカーノードの AWS Identity and Access Management (IAM) ロールを作成します。
-
次のいずれかのオプションを使用して、ワーカーノードの 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 ロールに付与されます。
起動テンプレートを作成する
- Amazon EC2 コンソールを開きます。
- ナビゲーションペインで、[起動テンプレート] を選択します。
- [起動テンプレートの作成] を選択します。
- [起動テンプレート名] には、テンプレートの名前を入力します。
- [アプリケーションと OS イメージ (Amazon マシンイメージ)] には、Amazon Linux 2023 AMI ID を選択してください。
- 次のオプションを設定します。
[インスタンスタイプ] には、必要なインスタンスタイプを選択します。
[キーペア名] には、Amazon EC2 SSH キーペアを選択します。
[セキュリティグループ] には、お持ちのセキュリティグループを選択します。 - [高度な詳細] を展開します。
- [ユーザーデータ] には、次の設定を入力します。
注: XXXXXXX:3128 をお使いのプロキシホスト名とポートに置き換えてください。YOUR_CLUSTER_CA をクラスター認証局 (CA) に置き換えてください。API_SERVER_ENDPOINT をお使いのサーバーエンドポイントに置き換えてください。EKS_CLUSTER_NAME をクラスター名に置き換えてください。KUBERNETES_SERVICE_CIDR_RANGE をクラスターのサービス CIDR 範囲に置き換えてください。サービス CIDR がユーザーデータで提供されていない場合、nodeadm-config フェーズは失敗します。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==-- - [起動テンプレートの作成] を選択します。
設定を確認する
起動テンプレートを使用してマネージドノードグループを作成したら、プロキシ設定を確認します。
-
ノードのステータスを確認するには、次のコマンドを実行します。
kubectl get nodes -o wide -
プロキシ環境変数が設定されていることを確認するには、ノードに接続して次のコマンドを実行してください。
systemctl show containerd | grep Environment
出力には、containerd 用に設定されたプロキシ環境変数が表示されます。
Bottlerocket ノードの HTTP プロキシを設定する
起動テンプレートを作成する
-
Amazon EC2 コンソールを開きます。
-
ナビゲーションペインで、[起動テンプレート] を選択します。
-
[起動テンプレートの作成] を選択します。
-
[起動テンプレート名] には、テンプレートの名前を入力します。
-
アプリケーションと OS イメージ (Amazon マシンイメージ) には、Bottlerocket AMI ID を選択します。
-
次のオプションを設定します。
[インスタンスタイプ] には、必要なインスタンスタイプを選択します。
[キーペア名] には、Amazon EC2 SSH キーペアを選択します。
[セキュリティグループ] には、お持ちのセキュリティグループを選択します。 -
[高度な詳細] を展開します。
-
[ユーザーデータ] には、次の設定を入力します。
[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 -
[起動テンプレートの作成] を選択します。
設定を確認する
起動テンプレートを使用してマネージドノードグループを作成したら、プロキシ設定を確認します。
-
ノードのステータスを確認するには、次のコマンドを実行します。
kubectl get nodes -o wide -
プロキシ設定を確認するには、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_RANGE と VPC_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
プロキシ設定を確認する
プロキシ設定が正しく機能していることを確認するには、次の手順を実行します。
-
ノードのステータスを確認するには、次のコマンドを実行します。
kubectl get nodes -o wide -
プロキシを介してポッド接続をテストするには、次のコマンドを実行します。
kubectl run test-pod --image=amazonlinux:2 --restart=Never -- sleep 300 kubectl get pods -A -
ノードの接続に関する詳細情報については、プロキシログを確認してください。ログには、コンテナレジストリエンドポイントへの正常な接続 (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 -
関連情報
- トピック
- Containers
- 言語
- 日本語
