Amazon EKS コンテナノードの HTTP プロキシの設定を自動化する方法を教えてください。
コンテナランタイムを使用して、Amazon Elastic Kubernetes Service (Amazon EKS) ノードの HTTP プロキシの設定を自動化したいと考えています。
簡単な説明
Amazon EKS バージョン 1.23 以前で作成したマネージドノードグループの場合、デフォルトのコンテナランタイムは Docker です。このようなユースケースの場合は、解決策のすべての手順に沿って、コンテナ化されたランタイムを指定してください。Amazon EKS バージョン 1.24 以降で作成されたマネージドノードグループの場合、デフォルトのコンテナランタイムは containerd にあります。
マネージドノードグループで dockerd の代わりに containerd を使用するには、userdata に containerd ランタイムを指定する必要があります。
マネージドノードグループを containerd ランタイムに切り替えたら、Amazon マシンイメージ (AMI) を使用してカスタム起動テンプレートを作成します。その後、HTTP プロキシとクラスターの環境値を設定します。
**注:**Docker ランタイムを使用するノードの場合は、Docker を使用した Amazon EKS ワーカーノードの HTTP プロキシ設定を自動化する方法は?を参照してください。
解決策
カスタム起動テンプレートを作成する
次の手順を実行し、containerd をランタイムに指定してカスタム起動テンプレートを作成します。
-
マネージドノードグループのランタイムとして containerd を指定します。userdata では、bootstrap.sh の --container-runtime=containerd オプションを使用してください。
-
AMI ID を使用してカスタム起動テンプレートを作成します。これを行わないと、マネージドノードグループが自動的に userdata をマージします。
-
プロキシ構成をcontainerd、sandbox-image、および kubelet に設定します。
**注:**Sandbox-Image は containerd のサンドボックスイメージを取得するサービスユニットです。 -
次のフィールドを使用して 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:3128、YOUR_CLUSTER_CA、API\ _SERVER\ _ENDPOINT、および EKS\ _CLUSTER\ _NAME は、ご自身のプロキシ、クラスター認証局 (CA)、サーバーエンドポイント、およびクラスター名に置き換えてください。仮想プライベートクラウド (VPC) エンドポイントを作成したら、AWS サービスエンドポイントを NO\ _PROXY と no\ _proxy に追加します。
aws-node と kube-proxy のプロキシを設定する
**注:**HTTP プロキシを介してクラスターからインターネットにトラフィックをルーティングし、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_RANGE と VPC_CIDR_RANGE は、ご自身の CIDR 範囲の値に置き換えてください。VPC エンドポイントを作成したら、AWS サービスエンドポイントを NO_PROXY と no_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 $ 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
ノードの接続に関する追加情報については、プロキシログを確認してください。
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 ユーザーやロールにアクセス許可を付与するにはどうすればよいですか?
関連するコンテンツ
- 質問済み 6ヶ月前lg...
- 承認された回答質問済み 10ヶ月前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前