こんなケースを経験したことはありますか?
セキュリティが厳重な環境下の場合、インターネットへの出口としてプロキシサーバを経由する必要がある環境もあるのではないでしょうか。
ただ単にEKS Nodeを構築しただけでは、プロキシサーバを経由したインターネット経路を確保することができません。
必ずどこかで、「インターネットへ出るために、プロキシサーバ「xxx.proxy.com」へ接続して」と明示的に指定する必要があります。
そして、それだけではなく「これはインターネットを経由しないので、内部通信に設定して」という何をプロキシ経由にしないかという設定も入れる必要があります。
EKS NodeのOSレベル、そしてアプリレベルでインターネットへの経路をプロキシサーバ経由に設定するにはどうやってやる必要があるのか。
今回はそんなケースに使えるtipsとして、EKS Nodeに具体的に設定するべき項目を書いていきます!
プロキシ環境下でEKS Nodeを構築する(OS編)
正確には、「EKS on EC2の環境でプロキシ設定を行う」ということをしていきます。
まず、EKS NodeのOSレイヤーにプロキシ設定を投入する必要があります。
具体的には作成するEKS Nodeの起動テンプレートにて、プロキシ設定を記述してあげるだけです。
本投稿をした日付的にはAmazon Linux 2はまだサポート中ですが、いずれAmazon Linux 2023になることも加味して、今回はAmazon Linux 2023での記述方法を記載していきます。
※EKS作成時に、起動テンプレートを使用する → 作成したテンプレートを指定、してあげる必要があります!
追加するべき記述は下記になります。
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="//"
--//
Content-Type: text/cloud-boothook; charset="us-ascii"
#!/bin/bash
set -ex
#Set the proxy hostname and port
PROXY=xxxx.xxxx.xxxxx.xxxxx:xxxx #プロキシ設定!
VPC_CIDR=xx.xx.xx.xx/xx #EKSを作成したVPC設定!
mkdir -p /etc/systemd/system/containerd.service.d
mkdir -p /etc/systemd/system/sandbox-image.service.d
mkdir -p /etc/systemd/system/kubelet.service.d
cloud-init-per instance dnf_proxy_config cat << EOF >> /etc/dnf/dnf.conf
proxy=http://$PROXY
EOF
# [Option] Configure dnf to use the proxy
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,~~~ #プロキシ経由したくない通信を設定!例:VPC Endpointなど
NO_PROXY=$VPC_CIDR,localhost,127.0.0.1,169.254.169.254,.internal,~~~ #プロキシ経由したくない通信を設定!例:VPC Endpointなど
EOF
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
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
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
--//
Content-Type: application/node.eks.aws
---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
cluster:
name: <EKS Cluster 名を記述>
apiServerEndpoint: <API Server Endpoint を設定>
certificateAuthority: <Certificate Authority を設定>
cidr: <Kubernetes Network CIDR を記述>
--//--
他にもSaaS系の通信などの設定が追加で必要な場合、上記をカスタムする形で修正すれば通ると思います!
プロキシ環境下でEKS Nodeを構築する(Pod編)
上記の起動テンプレートにて、OSレベルの設定はできたかと思います。
続いて、アプリレベルで設定していくにはどうすればよいか?を説明していきます。
ConfigMapの設定
アプリ=Podレベルで設定を入れるには、まずConfigMapに設定を入れる必要があります。
apiVersion: v1
kind: ConfigMap
metadata:
name: proxy-environment-variables
namespace: <Namespace 名を設定>
data:
HTTP_PROXY: http://<プロキシ名を設定>:<プロキシポートを設定>
HTTPS_PROXY: http://<プロキシ名を設定>:<プロキシポートを設定>
NO_PROXY: <VPC CIDRを設定>, <Kubernetes 内部CIDRを設定>,localhost,127.0.0.1,169.254.169.254,.af-smtpfc.com,.internal,.eks.amazonaws.com, <VPC Endpointなどプロキシを通らない内部通信を設定>
Deploymentの設定
ConfigMapが設定できたら、次はDeploymentに設定を入れていく必要があります。
具体的には、DeploymentのEnv設定にてプロキシ関連の設定を投入する形です。
既にDeploymentが投入されている場合、設定コマンドは下記になります。
$NAMESPACE = "ここにNamespace名を設定"
# Daemonsetの場合
$DAEMONSETNAME = "ここにDaemonsetの名前を設定"
kubectl patch -n kube-system -p "{ \""spec\"": {\""template\"":{ \""spec\"": { \""containers\"": [ { \""name\"": \""aws-node\"", \""envFrom\"": [ { \""configMapRef\"": {\""name\"": \""proxy-environment-variables\""} } ] } ] } } } }" daemonset $DAEMONSETNAME
# Deployment
$DEPLOYMENTNAME = "ここにDeploymentの名前を設定"
kubectl patch -n kube-system -p "{ \""spec\"": {\""template\"":{ \""spec\"": { \""containers\"": [ { \""name\"": \""controller\"", \""envFrom\"": [ { \""configMapRef\"": {\""name\"": \""proxy-environment-variables\""} } ] } ] } } } }" deployment aws-load-balancer-controller
まとめ
皆さんはプロキシ環境下でEKS Nodeを使う経験はありますか?
個人的には、このような環境は非常に少ないのではないかなと考えています。
が、自身が必要になったということは、きっと誰かも必要としているのではないかと考え、記事を書いてみました。
本記事が少しでも皆様の参考になれば幸いです。

