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

所要時間3分
0

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

簡単な説明

Amazon EKS バージョン 1.23 以前で作成したマネージドノードグループの場合、デフォルトのコンテナランタイムは Docker です。これが当てはまる場合は、解決策のすべての手順に従ってcontainerdランタイムを指定してください。Amazon EKS バージョン 1.24 以降で作成されたマネージドノードグループの場合、デフォルトのコンテナランタイムは containerd にあります。

マネージドノードグループで dockerd の代わりに containerd を使用するには、userdatacontainerd ランタイムを指定する必要があります。

マネージドノードグループを containerd ランタイムに切り替えたら、AMI ID を使用してカスタム起動テンプレートを作成します。その後、HTTP プロキシの設定とクラスターの環境値を設定できます。

**注:**以下の解決策は、基礎となるランタイムが containerd されているノードにのみ適用され、Docker ランタイムを含むノードには適用されません。Docker ランタイムを使用するノードについては、「Docker で Amazon EKS ワーカーノードの HTTP プロキシの設定を自動化するにはどうすればよいですか?」を参照してください。

解決策

カスタム起動テンプレートの作成

  1. マネージドノードグループのランタイムとして containerd を指定します。ユーザーデータでは、bootstrap.sh--container-runtime=containerd オプションを使用してください。
  2. AMI ID を使用してカスタム起動テンプレートを作成します。それ以外の場合、AMI ID が指定されていない場合、管理対象ノードグループは自動的にユーザーデータを統合します。
  3. プロキシ構成をcontainerdsandbox-image、および kubelet に設定します。Sandbox-Image は、containerd のサンドボックスイメージを取得するサービスユニットです。この設定を設定するには、GitHub の sandbox-image.servicepull-sandbox-image.sh スクリプトを参照してください。
  4. 次のフィールドを使用してユーザーデータを記述できるようになりました:
    **注:**XXXXXXX: 3128YOUR_CLUSTER_CAAPI\ _SERVER\ _ENDPOINT、および EKS\ _CLUSTER\ _NAME を、関連するプロキシ、クラスタ CA、サーバエンドポイント、およびクラスタ名に置き換えてください。VPC エンドポイントを作成したら、AWS サービスエンドポイントを NO\ _PROXYno\ _proxy に追加できます。
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==--

aws-node と kube-proxy のプロキシ設定を行う

ConfigMap を作成して環境値を設定します。次に、それをクラスターに適用します。ConfigMap の例として次のスクリプトを使用してください。 **注:**KUBERNETES\ _SERVICE\ _CIDR\ _RANGEVPC\ _CIDR\ _RANGE を CIDR 範囲に関連する値に置き換えてください。たとえば、KUBERNETES_SERVICE_CIDR_RANGE10.100.0.0/16 に置き換え、VPC_CIDR_RANGE192.168.0.0/16 に置き換えます。VPC エンドポイントを作成したら、AWS サービスエンドポイントを NO\ _PROXYno\ _proxy に追加できます。

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,.eks.amazonaws.com

次に、HTTP プロキシ設定を 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

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

以前に作成したカスタム起動テンプレートを使用する新しい管理ノードグループを作成します。マネージドノードグループの作成のステップに従ってください。

プロキシをテストする

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

$ 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 でクラスターを作成した後に、他の AWS Identity and Access Management (IAM) ユーザーやロールにアクセスできるようにするにはどうすればいいですか?

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

関連するコンテンツ