はじめに
背景
kind (Kubernetes-in-Docker)を利用すると簡単にマルチノードのKubernetesクラスタを作成できます。
プロキシ環境下でkindクラスタを作成し、クラスタのノードからインターネットに接続する際は各ノードにプロキシの設定を行う必要があります。
Kubernetesクラスタがコンテナイメージをpullするためにも、プロキシの設定は必要になります。
プロキシの設定を入れる方法を調べてもすぐには分からなかったので備忘としてここに記載します。
目標
- Proxy環境下でkindを利用できるようになる
(k8sクラスタのノードからプロキシを利用する)
kindクラスタのノードに環境変数をセットする方法
通常、コンテナからプロキシを利用する場合は、
コンテナにhttp_proxy
やhttps_proxy
の環境変数を設定します。
kindで作成したKubernetesクラスタのノードについても同様です。
kind公式サイトにも下記の通り記載があります。
If you are running kind in an environment that requires a proxy, you may need to configure kind to use it.
You can configure kind to use a proxy using one or more of the following environment variables (uppercase takes precedence):・HTTP_PROXY or http_proxy
・HTTPS_PROXY or https_proxy
・NO_PROXY or no_proxyhttps://kind.sigs.k8s.io/docs/user/quick-start/#configure-kind-to-use-a-proxy
これに関してはまあ当然の話なのですが、1つだけ疑問が生じます。
「どうやって環境変数を設定すんの?」
kindではyamlファイルにクラスタの設定を記載し、
kind create
とコマンドを打つと自動でKubernetesのノード用コンテナが起動します。
yamlファイルでクラスタの設定を行うということは、
通常のKubernetesのマニフェストと同様にenv
などの項目をyaml内に設定すると良さそうです。
しかし、どうやらその方法ではできない様子。
まさか、各ノード1つ1つに環境変数を設定するのか?
いや、そんなわけないな.....。
こんな調子で数時間悶々としていました。
調べても全く情報は得られず、あきらめて再度公式ドキュメントを読み直しました。
すると下記の注意書きに気が付きました。
NOTE: If you set a proxy it would be passed along to everything in the kind nodes.
https://kind.sigs.k8s.io/docs/user/quick-start/#configure-kind-to-use-a-proxy
一瞬何を言ってるか理解できませんが、
どうやらkind create cluster
コマンドを実行するマシンに環境変数を設定しておけば
自動的にkindクラスタのノード(コンテナ)にも環境変数を設定してくれるみたいです。
(予想外の方法でした.......)
Windowsで利用する場合は、例えば以下のようにします。
C:\Users\user\kind> set HTTP_PROXY=http://<ProxyID>:<ProxyPW>@<ProxyHost>:<ProxyPort>
C:\Users\user\kind> set HTTPS_PROXY=http://<ProxyID>:<ProxyPW>@<ProxyHost>:<ProxyPort>
C:\Users\user\kind> kind create cluster --config=sample-cluster.yaml
上記方法により、全てのノードにプロキシの設定が入っていることを確認できました。
(参考)プロキシを使わずコンテナイメージをクラスタへ追加する方法
kindにはオフライン環境でもコンテナイメージをクラスタへ追加できる機能があります。
Loading an Image Into Your Clusterに記載がある通り
下記のようなコマンドでイメージを追加できます。
オフライン環境だけでなく、kubernetesクラスタ内からイメージをpullする必要が無いときやCICDのパイプライン等でもこちらの方法も使えそうです。
C:\Users\user\kind> kind load docker-image [ <コンテナイメージ名>... ] --name <kindクラスタ名>