ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

JujuとかKubernetesとか色々今日やったこと

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に変えたいところです。