TL;DR
- AI Platform Pipelines をデプロイする GKE のノードプールのイメージタイプは
Container-Optimized OS with Docker
でなければならない。 - GKE 1.19 からデフォルトが
Container-Optimized OS with Containerd (cos_containerd)
に変わっており、それを選択しているとタスクが必ず失敗する。 - GKE の Web コンソールからノードプールを作り直すことで対処可能。
K8s クラスタを手動作成した
AI Platform Pipelines(以後 Pipelines)のインスタンスを作るとき、デプロイ先となる k8s クラスタを自動的に作ってもらうことができます。
最近 Pipelines をデプロイする機会があり、自動的に作ってもらおうと思ったのですが、内部の仕様が変わったのか
Basic authentication was removed for GKE cluster versions >= 1.19.
というエラーメッセージを出力して失敗しました。
これはこれで問題なのですが、自分ではどうすることもできないので仕方がなく AI Platform Pipelines 用の Google Kubernetes Engine クラスタを構成するを参照しながら GKE クラスタを手動で作ることに。設定は基本的にデフォルトのまま、唯一ドキュメントで指定されている下記の点だけを変更しました:
- 2 CPU 4 GB memory ノードが 3 つ以上必要
- アクセススコープは "Allow full access to all Cloud APIs"
タスクを実行しても必ず失敗する
そうして起動した Pipelines に意気揚々とアクセスし、パイプラインをアップロードして Run を作ってみると、全て同様のエラーメッセージでタスクが失敗。
This step is in Error state with this message: failed to save outputs: Error response from daemon: No such container: xxxxxxxx.
ログを見るとタスクの中身自体は適切に実行され成功している様子が伺えます。最初から存在するチュートリアル的パイプラインも同じように失敗することから、パイプライン側の問題ではないだろうことは明らかでした。
イメージタイプが異なっていた
手元に以前 Pipelines が自動的に作成し、正しく動いている GKE クラスタが存在していたので、設定を比較してみることにしました。じっと眺めてみると、今回作ったクラスタはデフォルトノードプールのイメージタイプが Container-Optimized OS with Containerd (cos_containerd)
な一方、動いているクラスタは Container-Optimized OS with Docker
になっていることに気が付きました。どうやら GKE 1.19 からイメージタイプのデフォルト値が変わったようです。
ノードプールを作り直したら直った
というわけで試しにイメージタイプが Container-Optimized OS with Docker
になっているノードプールを新しく作って入れ替えたところ、正しく動くようになりました。