インターネット接続の制限のあるオフライン環境でkubernetesクラスタを構築する。
今回はAWS上にクローズドな環境を構築して試す。
※OSはCentOS7
※worker nodeは初期はminionという名称でしたが、workerに記載統一
各クラスタ(master/worker)のセットアップは、基本的に以下を参照
http://qiita.com/suzukihi724/items/d3270121009120f9c9f0
セットアップファイルをオフラインで持ち込み、完全手動でインストールする方法もあるが、yumなどを利用してオンライン環境でインストールした後に、オフライン環境へ持ち込む(もしくはクローズドな環境でyumを利用できるように設定する)手段が容易。
AWSの場合は、オンライン環境でセットアップ後に、AMIを作成し、クローズドなネットワーク内で該当のAMIをベースにインスタンスを起動する。
上記方法でkubernetesクラスタのセットアップはでき、kubectl get nodesコマンドでworkerノードを正しく認識できるようになったが、Podを作成すると、ステータスがRunningにならず正常にPodを生成できない事象に遭遇。
※CreatingContainerから遷移しない。
このような場合のデバッグには、以下のコマンドが有効。
kubectl logs [Pod名]
kubectl describe pod [Pod名]
ログを確認すると、beta.gcr.io/google_containers/pause:2.0というイメージの取得に失敗していた。
クローズドな環境のため、外部レジストリの通信が拒否されるためである。そもそもpauseって??と思ったが、Pod内のコンテナのネットワーク接続用のコンテナらしい。
クローズドな環境の場合、このコンテナイメージをオンライン環境で取得(docker pull)し、オフライン環境内のPrivate Docker RegistryにPushしておく必要がある。
さらに、kubernetesクラスタが、pauseのイメージをbeta.gcr.ioではなく、プライベートレジストリから取得するための設定が必要。
kubernetesでprivate docker registryを利用する方法は以下参照
さらに、kubeletの設定でpauseの取得先を指定する必要がある。
sudo vi /etc/kubernetes/kubelet
以下がpauseコンテナの取得先設定。
デフォルトはbeta.gcr.io/google_containers/pause:2.0の模様
# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image="[PrivateRegistryのパス]/pause:2.0"