Kubernetes と Controller

この記事は [WESEEK Advent Calendar](https://qiita.com/advent-calendar/2020/weseek) 2020 9日目の記事です。

こんにちは！ [WESEEK, Inc.](https://weseek.co.jp/) で長期インターンをさせていただいております [yamagai] (https://twitter.com/yamagai_0919)と申します。
今月でインターン開始から半年になります。時の流れは早いものですね。。。

今回は、業務で使っている Kubernetes の設計思想の一部に触れてみようと思います！

# Kubernetesの構成要素
まずは、Kubernetesクラスタの主なコンポーネントについて簡単に説明します。


![components-of-kubernetes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640444/60157745-627a-db8b-0a5c-f33c2ac21d38.png)
引用元(図):https://kubernetes.io/ja/docs/concepts/overview/components/



- kube-apiserver
    - Kubernetes APIを外部に提供するコンポーネントで、kubectl コマンドの叩き先。
- etcd
    - Kubernetesの全てのクラスター情報の保存場所。ここにアクセス出来るのはkube-apiserverのみ。
- kube-controller-manager
    - DeploymentやServiceなどのオブジェクトを管理する複数のControllerプロセスを単一のプロセスとして実行するコンポーネント。
- cloud-controller-manager
    - kube-controller-managerのうち、実行環境がクラウドの場合のみに使用するControllerプロセスを実行するコンポーネント。
- kube-scheduler
    - どのノードにどのPodを立ち上げるかを管理してくれるコンポーネント。
- kubelet
    - コンテナが正常に実行されている状態を保ってくれるコンポーネント。
- kube-proxy
    - Serviceリソースから作られるエンドポイントをもとにiptablesの設定をしてくれるコンポーネント。

[公式ドキュメント](https://kubernetes.io/ja/docs/concepts/overview/components/)にさらに詳しく記載があるのでぜひご覧ください！

今回は、これらの中でも kube-controller-manager が管理する **Controller** というものに注目します。

その前に基本的なKubernetesのアーキテクチャを再確認しましょう。

# Kubernetesのアーキテクチャ

Kubernetesはよく宣言的アーキテクチャと言われます。

- マニフェストファイルなどでDeploymentなどのリソースのあるべき状態を宣言する
- 各種Controller がそれらのリソースを管理してくれる

という仕組みになっています。

では、次に Controller について見ていきます。


# Controller とは

Controller は Kubernetes のリポジトリでは[ここ](https://github.com/kubernetes/kubernetes/tree/master/pkg/controller)で定義されています。

Controller とは「リソースの管理をしてくれるプロセス」と書きました。
![Controller (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640444/75042b98-2b69-c48b-7e2c-7a7b39648bf2.png)

ここでいう管理とは画像のように、

1. Pod がなんらかの理由で死ぬ
2. Controller がそれを見つける
3. Controller がマニフェスト通りの状態になるように調整する

という一連の流れを担うことを指します。

簡単にいうと、「あるべき状態を維持してくれる」ということですね！

# Controller の設計思想

基本原理として、**Reconciliation Loop(突き合わせループ)**という考え方があります。


![スクリーンショット 2020-12-09 20.40.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640444/072e0896-f6fc-925e-81fb-28208ce75d78.png)
引用元(図):https://blog.kubeflow.org/mlops/


画像には3つの工程が書いてありますが、これは上記でも説明した Controller の動きと同じですね！

ちなみに、この3つの工程の一つ一つの中でも Kubernetesのコンポーネントたちが様々な処理をしています。
内部の詳しい処理については、今後コードも載せつつ記事に出来たらと思います！


なにはともあれ、Controller はこの**Reconciliation Loop**によって常に理想の状態を維持してくれています。


我々人間も Controller を見習うべきかもしれませんね。。。


# まとめ
- Kubernetes は様々なコンポーネントで成り立っている
- 中でも kube-controller-manager が管理する **Controller** は重要な役割を果たしている
- Controller の基本原理として、**Reconciliation Loop(突き合わせループ)**という考え方がある

※この記事は [WESEEK Tips wiki](https://tips.weseek.co.jp/) に 2020/12/09 に投稿された記事の転載です。
Tips wiki では、IT企業の技術的な情報やプロジェクトの情報を公開可能な範囲で公開してます。

# 参考リンク
- 公式ドキュメント
    - https://kubernetes.io/ja/docs/concepts/overview/components/
- ゼロから始めるKubernetes Controller
    - https://speakerdeck.com/govargo/under-the-kubernetes-controller-36f9b71b-9781-4846-9625-23c31da93014
- Kubernetesのコードリーディングをする上で知っておくと良さそうなこと
    - https://medium.com/@bells17/things-you-should-know-about-reading-kubernetes-codes-933b0ee6181d
- Kubernetes Internal(Youtube チャンネル)
    - めちゃくちゃためになる情報を発信されているチャンネルです
    - いつも見ています、陰ながら応援しています
    - https://www.youtube.com/channel/UCpkd51NdxThtTSR3L6T83fw