(IKS)前回に続いて、Kubernetesのエコシステムをまとめていく。今回はKubernetesのクラスタの構築手段について書く。Kubernetesのアーキテクチャとりあえず、Kubernetesのクラスタとは何かについて書く。Kubernetesはざっくりマスタコンポーネントとノードコンポーネントに分けられる。これらは同一または別個のマシンにデプロイできて、HTTPS通信を介して一つのクラスタを構成する。マスタコンポーネントをデプロイしたマシン群はコントロールプレーンと呼ばれることがある。ノードコンポーネントをデプロイした1マシンは単にノードと呼ばれるが、ワーカノードと呼ぶことも多い。ノードは1クラスタに複数あるのが普通で、数百ノード~数千ノードという規模の構成も可能。コンテナとかサービスとか永続化ボリューム)を定義してやると、Kubernetesがそれに従ってリソースを準備してアプリをデプロイしてくれる。アプリを構成する各Podをどのノード上で動かすかはコントロールプレーンが動的に決める。マスタコンポーネントKubernetesクラスタやその上で動くアプリケーションの構成を管理するコンポーネント群で、それぞれがGo製の単一バイナリのサーバアプリケーション。以下の4つのコンポーネントがある。(実際にはもう一つあるけど、マネージドKubernetesを提供するクラウドプロバイダが使うやつなので普通は気にしなくていい。APIを提供するサーバ。ユーザはkubectlというコマンドラインツールや任意のHTTPクライアントを使ってこれと話し、アプリのリソース定義を投入する。list)をサポートしていて、クライアントがリソースごとの定義や状態の更新通知をリアルタイムに受けられるようになっている。1.12で非推奨になった。)etcdkube-apiserverが受け取ったリソース定義、アプリケーションの状態、Kubernetesクラスタ内で発生したイベントなどの情報を永続化するデータベース。データベースのアーキテクチャは分散キーバリューストア。kube-apiserverだけが参照、更新する。実はKubernetesとは別のプロジェクトのもので、etcdはetcdでKubernetesとは別にクラスタを組める。gRPCのAPIでデータの変更をwatchできるので、Kubernetesはこれを利用してリアクティブな感じに動く。operationを使ってPod定義の作成をwatchして、各Podをどのノードにデプロイするかを決める。Affinity)定義を鑑みてくれる。この、Podをデプロイするノードを決める処理をスケジューリングという。operationを使って色んなリソース定義をwatchする。kube-controller-managerはそのプロセス内部でリソース種別毎にgoroutineでコントローラを実行し、リソース定義と実際のリソース状態を比較し、その差を埋めるように処理をするのが主な役割。コンポーネント間はHTTPSやgRPCで通信するので、ネットワークさえつながっていればそれぞれがどこで動いていてもいいんだけど、普通はetcd以外の3つは同一マシンで動かして、冗長化構成にするときもその単位でする。ノードコンポーネントノードのマシンやPodやコンテナを管理・監視するコンポーネント群で、それぞれがGo製の単一バイナリのサーバアプリケーション。以下の2つのコンポーネントがある。CRI実装)と話しをするのが主な仕事。ノードの状態監視もする。API呼び出しを受け付けて以下のような処理もする。execで指定されたコマンドをコンテナで実行する。logsで指定されたコンテナのログを取得する。port-forwardでローカルホストのポートをコンテナのポートに転送する。kube-proxyKubernetesクラスタ内でロードバランサ的な役割をするServiceと、そのバックエンド接続を表すEndpointというリソースを監視し、それらの定義に従ってiptablesやipvsのルールをいじってPod間の通信を転送したり、ノードのポートを開けて外部からPodにつなげるようにしてくれる。上記の通りKubernetesクラスタは結構複雑で、構築するとなると色んなコンポーネントをインストールして、HTTPS通信のためのサーバ・クライアント証明書を作って、設定ファイルを沢山作って、コンテナランタイムをインストールしたりとかなり大変。Kubernetesコミュニティ内外でこの問題に対する様々な取り組みがある。Kubernetesクラスタ構築ツールKubernetesクラスタを自動で構築するツールがいくつかある。それらを利用して、プロダクション向けのクラスタを自分の環境に作ることができる。kubeadmkubeadmはKubernetesコミュニティ製の本家本元ツール。(2018年12月)。Goで書かれた単一バイナリで、マスタのマシンとノードのマシンでシンプルなコマンドを実行するとクラスタが作れるけど、コンテナランタイムとかkubeletとかは事前にインストールしておく必要があり、ちょっと面倒。kopskopsもKubernetesコミュニティ製。KubernetesクラスタをAWSとかGCEに構築できる。(前者はAWS公式によるサポート。)Goで書かれた単一バイナリで、コマンドを実行するとVMのインスタンスを作ったりネットワークや権限周りの設定をしてくれたりしたうえでKubernetesクラスタを構築してくれる。kubespraykubesprayもKubernetesコミュニティ製。プレーンな(ベアメタルな)マシンのほか、AWS、GCE、Azure、OpenStack、vSphereなどの環境にKubernetesクラスタを構築できる。Ansibleのプレイブックになっているところが特徴で、それゆえ中の処理が追いやすくてカスタマイズもしやすい。Juju、JAASJujuはUbuntuの開発元であるCanonical社が提供するGo製のツール。JAASはそのSaaS版。Kubernetesに特化しているわけではなく、汎用的な分散システムをモデリングするためのツールで、AWS、GCE、Azureなどの環境にVMや関連リソースや任意のアプリケーションをデプロイして管理できる。Storeで共有できるようにしている。StoreにKubernetesのCharmがあって、これでKubernetesクラスタを構築できる。ansible-k8s、packer-k8s拙作のツール。ansible-k8sが任意のマシンにKubernetesクラスタを構築するAnsibleプレイブック。packer-k8sは、VirtualBoxかESXiでVMを作ってansible-k8sでKubernetesクラスタを構築するPackerのテンプレート。GitHubに挙げているものはシングルノード構成しか対応してないけど、職場ではマルチノード構成(とHyper-V)に対応させたものを使ってる。kindkindはKubernetesコミュニティによるツール。kindというコマンドを一回実行するだけで、Dockerコンテナとして動くKubernetesクラスタを手軽に構築できる。マルチノードクラスタも作れるけど、あくまでテスト用途向けのツール。Kubernetes自身のテストに使われている。BreezeBreezeはGUIでオンプレミス環境にプロダクションレディなKubernetesクラスタを構築できるツール。コアはAnsibleのPlaybookで、kubesprayと似てる。特徴的なのは、クラスタ構築に必要なKubernetesコンポーネント(のコンテナイメージ)、Docker、Dockerレジストリ(Harbor)、YUMリポジトリサーバ、aptリポジトリサーバを同梱していることで、オフラインでもクラスタ構築できること。Breeze自体がDockerコンテナとして動くので、実行も簡単。出来合いKubernetesクラスタツールを使って構築するのもそれなりの学習コストと作業が発生して簡単ではないので、出来合いのものを使う手もある。プロダクション用のものはなく、開発用ばかり。MinikubeMinikubeはKubernetesコミュニティ製の本家本元ツール。minikubeというGo製のコマンドを実行すると、Kubernetesセットアップ済みのVMイメージをダウンロードして、ホストOSから使えるようにしてくれる。Kubernetesに特化したVagrantみたいな感じ。VMを動かす仮想環境としてはVirtualBox、KVM、Hyper-V、hyperkitがサポートされている。Macは、それぞれOSネイティブなハイパバイザでLinuxのVMを立ち上げてDockerを使えるようにしてくれるもの。(前者は近いうちにハイパバイザからWSL2に変わる。Macは2018年1月頭からKubernetesを同梱するようになり、Minikubeと同じようなことができるようになった。Minikubeに比べてKubernetesクラスタの設定はあまりいじれないけど、こっちのほうがセットアップは簡単。KatacodaのKubernetesコースKatacodaはオンラインでIT技術を触って学べるサービス。そのKubernetesコースでは、ブラウザ上でkubectlを実行してKubernetesクラスタを触ることができる。できることは限られているが、ちょっとkubectlを触ってみたいくらいの時にはいいかも。KubernetesはDocker社が提供するKubernetesお試し環境。kubeadmでクラスタを作るところからやらされて地味にめんどくさい。今試そうとしたらなんだか繋がりにくいし、セッションがすぐ切れてクラスタを作るところまで進めなかった。