ユーザーデータを使用して Amazon EKS ワーカーノードの HTTP プロキシの設定を自動化する方法を教えてください。

最終更新日: 2020 年 3 月 10 日

ユーザーデータを使用して Amazon Elastic Kubernetes Service (Amazon EKS) ワーカーノードの HTTP プロキシの設定を自動化する方法を教えてください。

解決方法

1.    クラスターの IP CIDR ブロックを見つけるには、次のコマンドを実行します。

$ kubectl get service kubernetes -o jsonpath='{.spec.clusterIP}'; echo

前述のコマンドは 10.100.0.1 または 172.20.0.1 を返します。これは、クラスター IP CIDR ブロックが 10.100.0.0/16 または 172.20.0.0/16 のいずれかであることを意味します。

2.    proxy-env-vars-config.yaml という名前の ConfigMap ファイルを作成します。

ステップ 1 のコマンドの出力に 172.20.x.x の範囲の IP がある場合は、次のように ConfigMap ファイルを構成してください。

apiVersion: v1
kind: ConfigMap
metadata:
   name: proxy-environment-variables
   namespace: kube-system
data:
   HTTPS_PROXY: http://customer.proxy.host:proxy_port
   HTTPS_PROXY: http://customer.proxy.host:proxy_port
   NO_PROXY: 172.20.0.0/16,localhost,127.0.0.1,VPC_CIDR_RANGE,169.254.169.254,.internal,s3.amazonaws.com,.s3.us-east-1.amazonaws.com,api.ecr.us-east-1.amazonaws.com,dkr.ecr.us-east-1.amazonaws.com,ec2.us-east-1.amazonaws.com

注: VPC_CIDR_RANGE をクラスターの VPC IPv4 CIDR ブロックに置き換えます。

ステップ 1 のコマンドの出力に 10.100.x.x の範囲の IP がある場合は、次のように ConfigMap ファイルを構成してください。

apiVersion: v1
kind: ConfigMap
metadata:
   name: proxy-environment-variables
   namespace: kube-system
data:
   HTTPS_PROXY: http://customer.proxy.host:proxy_port
   HTTPS_PROXY: http://customer.proxy.host:proxy_port
   NO_PROXY: 10.100.0.0/16,localhost,127.0.0.1,VPC_CIDR_RANGE,169.254.169.254,.internal,s3.amazonaws.com,.s3.us-east-1.amazonaws.com,api.ecr.us-east-1.amazonaws.com,dkr.ecr.us-east-1.amazonaws.com,ec2.us-east-1.amazonaws.com

注: VPC_CIDR_RANGE をクラスターの VPC IPv4 CIDR ブロックに置き換えます。

プライベート API サーバーのエンドポイントアクセス、プライベートサブネット、インターネットアクセスなしで Amazon EKS クラスターを構築する場合は、以下のエンドポイントを作成して追加する必要があります。
Amazon Elastic Container Registry (Amazon ECR)
Amazon Simple Storage Service (Amazon S3)
Amazon Elastic Compute Cloud (Amazon EC2)
Amazon Virtual Private Cloud (Amazon VPC)

たとえば、以下のエンドポイントを使用できます。
api.ecr.us-east-1.amazonaws.com
dkr.ecr.us-east-1.amazonaws.com
s3.amazonaws.com
.s3.us-east-1.amazonaws.com
ec2.us-east-1.amazonaws.com

パブリックエンドポイントサブドメインを NO_PROXY 変数に追加する必要があります。たとえば、Amazon S3 の .s3.us-east-1.amazonaws.com ドメインを us-east-1 AWS リージョンで追加します。

3.    NO_PROXY 変数に (configmap/proxy-environment-variables (kube-proxy および aws-node ポッドで使用) にある) Kubernetes クラスターの IP アドレス空間が含まれていることを確認します。たとえば、先行の ConfigMap ファイルのサンプルコードでは、10.100.0.0/16 が使用されます。

4.    ConfigMap を適用するには、次のコマンドを実行します。

$ kubectl apply -f /path/to/yaml/proxy-env-vars-config.yaml

5.    ワーカーノードにユーザーデータを取り込んで、ワーカーノードをブートストラップし、Docker デーモンと kubelet を設定します。次の例をご参照ください。

Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version:  1.0
--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"

#Set the proxy hostname and port
PROXY="proxy.local:3128"
MAC=$(curl -s http://169.254.169.254/latest/meta-data/mac/)
VPC_CIDR=$(curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MAC/vpc-ipv4-cidr-blocks | xargs | tr ' ' ',')

#Create the docker systemd directory
mkdir -p /etc/systemd/system/docker.service.d

#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,s3.amazonaws.com,.s3.us-east-1.amazonaws.com,api.ecr.us-east-1.amazonaws.com,dkr.ecr.us-east-1.amazonaws.com,ec2.us-east-1.amazonaws.com
NO_PROXY=$VPC_CIDR,localhost,127.0.0.1,169.254.169.254,.internal,s3.amazonaws.com,.s3.us-east-1.amazonaws.com,api.ecr.us-east-1.amazonaws.com,dkr.ecr.us-east-1.amazonaws.com,ec2.us-east-1.amazonaws.com
EOF

#Configure docker with the proxy
cloud-init-per instance docker_proxy_config tee <<EOF /etc/systemd/system/docker.service.d/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

#Reload daemon and restart docker to reflect proxy configuration at launch of instance
cloud-init-per instance reload_daemon systemctl daemon-reload 
cloud-init-per instance enable_docker systemctl enable --now --no-block docker

--==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

/etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments}

# Use the cfn-signal only if the node is created through a CloudFormation stack and need to signal back to CloudFormation resource (CFN_RESOURCE_LOGICAL_NAME) that wait for signal from this EC2 instance to progress via either:
# - CreationPolicy https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-creationpolicy.html
# - UpdatePolicy https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html
# cfn-signal will signal back to CloudFormation using https transport. Therefore, proxy needs to be set for HTTPS connection to CloudFormation.
/opt/aws/bin/cfn-signal
    --exit-code $? \
    --stack  ${AWS::StackName} \
    --resource CFN_RESOURCE_LOGICAL_NAME  \
    --region ${AWS::Region} \
    --https-proxy $HTTPS_PROXY

--==BOUNDARY==--

重要: Docker デーモンと kubelet を起動する前に、yumdocker、および kubelet 設定ファイルを更新または作成する必要があります。

AWS マネジメントコンソールから起動した AWS CloudFormation テンプレートを使用してワーカーノードに取り込むユーザーデータの例については、「aunching Amazon EKS Linux Worker Nodes」をご参照ください。

6.    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

7.    ConfigMap を変更する場合は、更新を適用してから、ポッドで ConfigMap を再度設定し、次のように更新を開始します。次の例をご参照ください。

$ kubectl set env daemonset/kube-proxy --namespace=kube-system --from=configmap/proxy-environment-variables --containers='*'
$ kubectl set env daemonset/aws-node --namespace=kube-system --from=configmap/proxy-environment-variables --containers='*'

重要: これらのオブジェクトをアップグレードする場合は、kubernetes オブジェクト kube-proxy または aws-node に対するすべての YAML 変更を更新する必要があります。ConfigMap をデフォルト値に更新するには、eksctl utils update-kube-proxy または eksctl utils update-aws-node コマンドを使用します。

ヒント: プロキシが API サーバーに接続できなくなった場合、プロキシは単一障害点になり、クラスターの動作が予測不能になる可能性があります。このため、サービスディスカバリネームスペースまたはロードバランサーの背後でプロキシを実行することをお勧めします。

8.    プロキシ変数が kube-proxy ポッド、および aws-node ポッドで有効になっていることを確認するには、ポッドで次のコマンドを実行します。

$ kubectl describe pod kube-proxy-xxxx -n kube-system

出力は次のようになります。

Environment:
      HTTPS_PROXY:  <set to the key 'HTTPS_PROXY' of config map 'proxy-environment-variables'>  Optional: false
      HTTP_PROXY:   <set to the key 'HTTP_PROXY' of config map 'proxy-environment-variables'>   Optional: false
      NO_PROXY:    <set to the key 'NO_PROXY' of config map 'proxy-environment-variables'>     Optional: false

9.    AWS PrivateLink を使用していない場合は、Amazon EC2、Amazon ECR、および Amazon S3 のプロキシサーバーを介して API エンドポイントへのアクセスを検証します。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合