おつかれさまです。
Kubernetes The Hard Way(以下KTHW)を一通りやった記録です。
なんでやったの
仕事でKubernetesを触ることになったからです。前から勉強しないとなぁ、とは思っていたけど優先度が低かったので後回しでした。今回いよいよやるかと腰を上げた感じです。
前提
KTHWをやる前にKubernetes公式チュートリアルをやっていました。
後は社内勉強会に参加して、Kindを使ってちっちゃいクラスタを立てたりしていました。
どんな環境でやったの
以下の日本語訳のものを使いました。
この日本語訳だとGCPを使用しており、そのまま行いました。(案件がGCPで、GCPにも慣れないといけないため丁度良かった)勉強用のプロジェクトを建ててそこにリソースを建てる形です。ちなみに会社の環境なので自分の懐は痛みませんでした。ありがとうございます。(本社の方に頭を下げながら)
クライアント(kubectlやgcloudコマンドを実行するところ)は会社PCのHyper-Vで建てたUbuntuを使用しました。GUIでインストールしましたが、KTHW自体はコマンドベースで進むので、CUIオンリーでも問題ないと思います。実は最初はWindowsでやっていたのですが、掲載されているのがLinuxかmacOSの手順なので途中からubuntuに切り替えました。シェルのコマンドとpowershellの変換と、cfsslをWindowsに入れるのが面倒だっただけなので、やろうと思えばWindowsでもできると思います。ちなみにWSLでできるかどうかは試してないのでわかりません。
すすめかた
手順はコマンドベースで記載されています。Linuxのコマンドをかじったことがある人なら、コピペすればそれほど苦労なく1週終えることができると思います。
1週終えることではなく、Kubernetesの理解を深めることが目的なので、わからないところや疑問に思ったところはその都度調べながら進めるようにしました。
掲載されているkubernetes公式ドキュメントのリンクを読むのはもちろん、環境変数については実際にどんな値が入っているかechoで確認したり、証明書についてはopensslコマンドで中身を見てみたりしました。
途中VPC内に作るサブネットとpod内のサブネット、グローバルのIPアドレスなどたくさんのリソースが登場してこんがらがるので、ノートに図を描きながら進めました。
写経することで頭に入るタイプなので、最初はコピペせずにひとつひとつ手入力していました。これがつまずく原因になるとはこの時は夢にも思っていなかったのであります。ゴゴゴゴゴゴゴ
つまづいた点
09のワーカーノードのブートストラップをするところで想定通りの動作をしなくなりました。具体的には、controllerからkubectl get nodesでworker3台が見えず、「No resource found」と言われてしまいました。workerのkubeletのログを見ると「unable to register node "worker-0" with API server:node is forbbiden: User "system/node:worker-0" cannot create resource "nodes" in API group " " at the cluster scope」というエラーが出ており、どうやらkubeletとAPI Serverが正しく通信できていないことが分かりました。controllerとworkerのping疎通を確認したり、サービスをリスタートしたりしましたが、解決しないので、KTHWの手順を最初から見直し、確認したところ、worker用のCSR(証明書の材料となるもの)を作る段階で、CNに入れる値をミスしていたことが原因と分かりました。KubernetesにNode AuthorizationというNodeの権限管理を行う機能があり、そこで証明書のCNを見ているみたいですね。なので、CNの値をミスると正しくNodeを認証できずエラーとなっていた模様です。
コピペせず手打ちで写経していたのが裏目に出て、コロンとピリオドを打ち間違えていたようです。\(^o^)/うるとらぴえん
証明書を作り直すところからやり直したりしてみましたが、結局リカバリできず、リソースを消して最初からやり直すことにしました。正直問題を切り分けるまでいろんなコマンドを知ることができたし、周回することでより知識も深まるので良しとしました。
最初からやり直すことで上手くいき、無事最後まで完走することができました。
やってみて良かったこと
もともとオンプレミスとVMで育った人間で、コンテナやオーケストレーションが全く違う畑の技術だと思っていました。しかし、実際にKTHWで手を動かしてみたところ、systemdやルーティング、ロードバランサーといった、自分になじみのある知識で構成されていることが分かりました。躓いた時も、トラブルシューティングは「まずログでエラーがないか見る」「ネットワーク的に疎通がないか確認する」といったまず当たり前のことから始まることが分かり、違う畑の技術ではなく延長上にあることを実感しました。「コンテナとは何か?」についてはいまだによくわかっていませんが、これを突き詰めることで「OSとは何か?」(※)に近づいていくのがとても面白いと感じます。
※OSとはinitプロセスから始まるものか?→initプロセスから始まるコンテナもあるよ みたいな話
KTHW自体はそれほど難しくありません。これを自分の好きな環境で建ててみるのが真のHard Wayなんだろうなと思いました。自前でハードウェアを用意してクラスタを作ってみたら、もっと深く理解できるんでしょうね。今は復職明けでお金が心配なこともあり、購入に至っていませんが、DeskminiかintelNUCでそれぞれいくらになるか試算しています。(´∀`*)
おわりに
次は何をしようかな( `ー´)
追記:Kubernetes完全ガイド第2版を読み始めました。読み終わったらまたブログ書こうと思います。