Kubernetesのアーキテクチャを(ゆるく)学びなおす

K8sアーキテクチャを(ゆるく)学びなおす

きっかけは、Kubernetes Meetupでのお話。

Kubernetesの前身である「Borg」の開発者の一人、Joe Bedaさんのお話をお聞きしたとき。 「K8sコンポーネント、ちゃんと理解してるか自信ない…」と気づいてしまいました。

業務で扱うようになって2か月。少しずつK8sのことを理解した「気持ち」にはなっていたものの、いざどういう仕組みでK8sが動いているのかを自分に問うと、全く説明できそうにないことに絶望。

今後社内でK8s(の概念)に触れる方々が増える見込みです。弊社内ではKubernetes導入PJの一人でもある自分がコンポーネント部分の理解が曖昧なままだと、間違った知見を広めてしまう怖さがあるな…と思いました。

今回の目的は以下です。

  • 実際にK8sを触ってみての実体験を踏まえて、K8sコンポーネントを理解する
  • 今後社内でK8sユーザが増えていくときに正しくわかりやすい知見を広められるように準備する
  • 現時点でK8sコンポーネントのわからない部分を明確にする

勉強させていただいていた書籍、サイトは以下です。

先輩社員が「この本の19章(アーキテクチャの説明)がいいんだよぉ」と教えてくださり、読んでみたらなるほど!と。 K8s界隈で知らない人はいないんじゃないか、位有名な青山真也さんの有名本。 1章~4章、19章⇒5章~の順で読み進めるのが個人的に良かったです。今回みたいに振り返りの為に何度でも読みたい、19章。

日本マイクロソフト真壁徹さんの、優しく(時に面白く)細やかにアーキテクチャを学べるスライドです。 真壁さんからはコンテナーについても以下の資料で優しくおしえて頂きました。Sense of Humor。
https://www.slideshare.net/ToruMakabe/essentials-of-container

Kubernetesクラスタコンポーネント概略

後先考えずに書き始めたら楽しくなってしまい、ただのおふざけ落書きになってしまいました。成果物はこちらです。

f:id:dombri:20190609232151j:plain
Kubernetesゆるいコンポーネント

「kubectl」から始まるdeploymentのapply説明部分をゆるい図に表してみました。 描くのが楽しくて無駄にカラフルになってしまった。

現段階では「自分の為」にアウトプットしていますのでご容赦ください。いつか「誰かの為」になるようなアウトプットができるひとになりたい。

まずはMaster Node上で動くコンポーネントから。

API Server

kubectlからのリクエストを受けたり、Controller ManagerSchedulerkubeletという各コンポーネントからもリクエストを受け、Kubernetes APIを提供する。

etcd

Kubernetesクラスタに関するすべての情報が保存される。 =etcdのデータを守ることが最も大切! 「単一障害点にならないようにクラスタを組んで冗長性を」「etcdctl snapshot コマンド等を使ってetcdクラスタの状態を定期的にバックアップ」と書籍では紹介がありました。

Scheduler

Nodeが割り当てられていないPodを見つけると、Nodeの状態や諸々の状態を加味してどのNodeで起動するかを決める。その情報をAPI Serverに送り更新することでスケジューリングする。

Controller Manager

多種多様なコントローラが1つのバイナリにまとめられて動作するコンポーネント。これらのコントローラは有効・無効化できる(知らなかった)。 DeploymentやReplicaSetに関するコントローラが存在し、それらの状態を監視していることでReplicaSetやPodを作成してくれる。ただし、実際のスケジューリングはSchedulerが行っておりあくまで「登録」までが役目。

Kubernetes Node 上でも大事なコンポーネントが動いている。

kubelet

Container Runtimeと連携して、コンテナの起動・停止等の管理を行うコンポーネント。SchedulerがPodの起動Nodeを決定すると、そのNodeのkubeletが検知してコンテナ起動する。 ただし、静的に起動させたいコンテナ(※どんなもの?)がある場合は、Node上の特定のパスにmanifestを配置することでSchedulerに関係なく起動することができるらしい。

このほかにkube-proxykube-dnsがありますが、昨日のバッティング練習の影響で両肘から先が筋肉痛の為次回に回します。。特にkube-proxyはちゃんと知っておきたい。

全然わかってなったよ、コンポーネント

図を描きながら「こーいうことだったのか!」とすっきりした部分がたくさんありました。例えばController ManagerとAPIのかかわり、Schedulerの役割等。
一方で、まだいまいちつかみ切れていないコンポーネントもあります。特にetcd、kube-proxy。
このあたりの深堀は次回にします。