Kubernetes環境が壊れた。まずい
会社で検証用に(私だけで)使っていたKubernetesが不調になってしまいました。kubectlコマンドを使ってPodを作ろうにもスケジューリングできないというエラーとやらでPodが一向に作れませんでした。しかしkubectl get node
とか叩くとNode Readyだったりします。
原因は私
で、原因が判明。この環境ではGPU Podも作れるような環境になっているのですが、apt-get upgrade
を実行したつもりがapt upgrade
を実行してしまったため、Nvidia-Dockerに引きづられてDockerのバージョンがDocker CE 18.06に上がってしまったのが原因でした。普段Ansibleでやっているのにコマンドなんて叩くから。。
Nvidia-DockerはStableの2.0.3を利用しています。対応しているDockerのバージョンは次のファイルに記載がありました。私はUbuntu Server 16.04を使っているのでバージョン17.12.1までであれば対応するようです。それは動かなくなっても仕方ないですね。
nvidia-docker/Makefile at v2.0.3 · NVIDIA/nvidia-docker · GitHub
Nvidia-DockerのUbuntu 18.04サポートはもう少し先
ちなみにmasterリポジトリーはもうちょっと新しいバージョンのDockerもサポートする記述があるので、将来は対応すると思われます。Ubuntu 18.04 LTSのサポートなんかも記載があります。
nvidia-docker/Makefile at master · NVIDIA/nvidia-docker · GitHub
現在Kubernetes 1.11を使っていますので、KubernetesのリリースノートによるとDockerの1.11.2から1.13.1までかDocker 17.03.xを使うのが良さそうです。Kubernetes公式的にはDocker 17.03.xを推奨でしょうか。
JujuでKubernetes GPU環境をデプロイする
で、これをJujuでデプロイしようとするとWorkerノードのデフォルトの設定から次のようなデプロイを行います。
- NVIDIA GPUの実装されていないノードはdocker.ioパッケージがインストールされる。Xenialの場合は17.03.2。
- NVIDIA GPUの実装されているノードはdocker-ceの17.12.1、対応するバージョンのNvidia-Docker関連が入る。
GPUが使えるノードとそうでないノードでDockerのバージョンに差異があるのがデフォルトになっています。ちょっと気持ちが悪いですね。そもそもKubernetes公式のリファレンスではDocker 17.03.xが推奨なので、このバージョンをできれば入れておきたいです。そこでJujuのYAMLに次の設定を追加してJuju deploy
してみました。
以下はYAMLファイルの一部分の抜き出しです。
... kubernetes-worker: annotations: gui-x: '100' gui-y: '850' charm: cs:~containers/kubernetes-worker-231 expose: true num_units: 2 options: channel: 1.11/stable docker_runtime: auto nvidia-docker-package: nvidia-docker2=2.0.3+docker17.03.2-1 nvidia-container-runtime-package: nvidia-container-runtime=2.0.0+docker17.03.2-1 docker-ce-package: docker-ce=17.03.2~ce-0~ubuntu-xenial to: - 1 ...
nvidia-docker-packageとnvidia-container-runtime-package、docker-ce-packageのバージョンは、apt list -a
コマンドで出力されたバージョンの中から最新のものを選びました。
そのほかのノードの設定も、bundle.yamlの設定を見つつ、必要そうなところを変更したbundle.yamlを使ってjuju deploy bundle.yaml
を実行するだけです。...通常ならば。
そして今日も沼にハマる
デプロイは順調に進むのですが、GPU WorkerノードのセットアップのところでNvidia-Docker関連のパッケージのセットアップのところでWARNING: The following packages cannot be authenticated!
みたいなエラーが出るようです。
また証明書かgpgkey関連の問題かなと調べたら、つい最近報告されたIssueにこんなものがあるのを発見。
nvidia docker signatures invalid? · Issue #837 · NVIDIA/nvidia-docker · GitHub
とりあえず問題が起こっているノードにログインしてコマンドを打って、Juju Deployを再開したところうまくいきました。なんでgpgkey変えたし。
% juju ssh kubernetes-worker/1 % curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - % juju resolve kubernetes-worker/1
ちなみにJuju Deploy中にJuju Machineが確保されてstartedになったタイミングで、gpgkeyを投入してもうまくいきます。タイミング的にはそっちの方が楽ですね。
NVIDIA関連バージョンの維持
一応、apt-mark holdでバージョンを保持することにしました。
% juju ssh kubernetes-worker/1 -- sudo apt-mark hold docker-ce cuda-repo-ubuntu1604 nvidia-docker2 nvidia-container-runtime
Rook 0.8.3
Rook 0.8.3がリリースされていたので、ついでに新しいものを使うようにセットアップしました。問題なく動作しています。Rook 0.8.xはKubernetes 1.11.xまでをサポートしています。
新しいRookを試したいから、Kubernetesのクラスターを再構築したんだ...そういうことにしておきます。
Juju 2.4.4
Juju 2.4.4が出ており、クライアントは2.4.4に更新されていたので、次のように実施してJujuエージェントを更新しました。いつもこの瞬間はドキドキします。
% juju switch controller % juju upgrade-juju % juju switch k8s % juju upgrade-juju
Macにresolverを設定
macOSは/etc/resolverの下に色々なDNSサーバーを仕込むことができます。会社のMacでは設定していたのですが、家のマシンでも設定しておきました。これでVPN越しではありますが、家と会社で作ったKubernetes環境とかをいじることができます。便利。
設定方法は次のページを参考にしました。
iOS 12.0.1に更新
iOS 12.0.1が来ていたので、朝のうちにダウンロードして会社でアップデートしておきました。iOS 12以降、ここ最近Apple Watchのカレンダーの同期がうまくいっていなかったのですが、iOS 12.0.1に更新したら同期できました。
ちなみにカレンダーの同期の問題があるのに気がついたのは今朝のことです。Wi-FiとBluetoothの接続性の問題にパッチがあったみたいで、そのおかげかもしれません。気のせいかもしれませんが、バッテリーの持ちも改善している気がします。
とはいえ私のApple Watchは初代なので、そろそろApple Watch 4に変えたいところです。