GWということでkuberbetesに入門してみました。最初は何から手をつけていいのかわからず試行錯誤したので、そのあたりの知見をまとめてみます。完全に理解したレベルなので誤った部分もあるかもしれません。
ちなみに@amsy810さんのこちらの本を辞書のように使いながら奮闘しましたw
覚えることや理解すべき概念が多くて大変でした。。
k8sでできること
k8sはコンテナオーケストレーションツールです。コンテナ化された各アプリケーションの管理およびネットワークをいい感じにしてくれます。
yamlで宣言的に書くことができ簡単にInfra as Codeが実現できます。kubectlというcliツールを使うことで簡単に設定の変更を反映することができます。
ただ、覚えることが非常に多く(後述のリソースが大量にあるため)細かい設定ができるものの学習コストは高いようです。(少なくともdockerに比べたら学習コストは高いなと感じました。)
リソースとは
リソースとは、k8sの様々な機能のことです。リソースとそのオプションを指定してk8sの中でアプリケーションを構築していきます。このリソースが実にたくさんあってどれから手をつけたら良いのかわかりにくいので、よく使う(であろう)リソースを紹介します。
deployment
deploymentはk8s内の各アプリケーションのコンテナ群のことです。podがk8sにおける各アプリケーションの最低構成要素です。そのpodを管理するのがreplica setでpodの作成や削除等を行います。さらにdeplooymentはそのreplica setを管理します。ローリングアップデートの際に新しいreplca setを作成したりします。
と、こんな感じで複雑な包含関係になっているのですが、基本的にはdeploymentを作成するだけであとはk8sがよしなにやってくれるみたいです。
service
serviceはL4ロードバランシングを行うリソースです。一番よく使われる使い方としては、deployment内のどのpodにアクセスするかの決定です。deployment単体では外部からのアクセスを受けることができないので、serviceを使って外部からアクセスができるように設定します。
ingress
ingressはL7ロードバランサです。パスやホストによってリバースプロキシしたり、HTTPSの終端になったりできます。
serviceと違って固定のportで公開できるのでここに最初にアクセスがくるようにしておくのが一般的?(このあたり全然まだ理解できてない)
secret
secretは秘匿したい情報をkey-value型で保管できる便利なリソースです。DBの接続情報などをこれで管理するのがよいみたいです。
何を構築すればよいのか
基本的にはdeploymentを構築するところから始めるのがいいように思われます。(もちろん最初にクラスタの作成は必要)これがないとそもそもコンテナが動く環境は作れないからです。
deploymentが作れたらserviceを使って外部からアクセスできるようにしましょう。これで最低限動くものの確認ができます。
次は、他のdeploymentを構築するのがよいでしょう。deploymentどうしの相互接続は正直難しいですがこのあたりをなんとか動かせるようになると、なんとなくk8sの全体像が見えてきます。
勘違いしがちなところ
podは基本ひとつのコンテナで構成される
最初はpodがアプリケーションの最初単位だから、docker-composeのように複数のコンテナを起動するものだと思っていました。
が、実際は基本的に1pod1containerです。podの設計パターンとしてアンバサダーパターンなど複数のコンテナからなる構成のものがありますが、メインのコンテナ自体は一個でそれを補助するコンテナが存在するときもあるってだけの話です。
docker-composeと違ってそれぞれのdeploymentは結構独立してる
上記の理由により、一個のサーバーやプロセスごとにひとつのdeploymentを構築することになるので、docker-composeのように各サーバーが密接に関係しているというよりかは独立して構築していくものです。
負荷がかかりそうなところだけスケールしたり、独立してアップデートしたりといったことができるのでこのような仕組みになっているのはとても納得できます。
まだよくわかってないところ
IP・Host周り
内部のIPや外部のIPがあったりして全然理解できてません。というか、IPに対する理解が弱いのでもっとネットワークについて勉強しないとなぁのお気持ちです。
Hostやドメイン周りもよくわかってないのでネットワークの勉強がてら頑張ります。
podのパターン
podの設計パターンの存在自体は認識できたのですが、実際に構築するイメージが掴めていないので頑張ります。。
目標はサーバーのdeploymentにCloudSQLProxyを導入してCloudSQLに接続することです!