Open4
k8sのお勉強
k8sの勉強するための環境やOSSなどをまとめる
最初の環境
- クラスタ: k3d
- Docker Registry: k3d組み込みのlocal registry
- サービス公開: cloudflare tunnels
- k3dのExposing Serviceに従って公開し、ホストのcloudflaredで公開
良かったところ
- 立てるのが簡単ですぐ壊して作り直しができる
課題や問題点
- つかうk3dのDockerイメージでkubeletなどのバージョンがきまっているので、クラスタのバージョンアップまではできなそう。
- なんかあったときに壊せばいいかという感じになってトラブル対応とか勉強にならない
- PVにはlocal-path-provisionerを使うことになるが、dockerのbind mountなどを組み合わせて変な対応をしないといけない
- 公開できるポートが1つだけ
- ドキュメントに書いてない方法でLoadBalancerの追加設定をして、追加のIngress Controller入れれば複数ポート公開できるんだけど、うまく動かなかったときにあまり本質的でないところに時間がかかる、クラスタの再作成が必要というのがちょっと嫌だった
- 勉強用なのでそこまで重要ではないが可用性は上がらない
やっぱり本物?のk8sクラスタがほしい...となって今やっているのは下記
環境: OKE(Oracle Cloud)
- クラスタ: OKE + A1.Flex
- Docker Registry: Gitlab
- サービス公開: cloudflaredをクラスタ内にデプロイして公開
良かったところ
- 下記の範囲なら無料で運用可能
- A1.Flexインスタンス 2core, 12GB x 2台
- Basic Cluster
- コントロールプレーンはマネージドで、ノードも2台で構成できるので可用性が高くできる
課題や問題点
- ちょっとOCIの勉強が必要, 無料アカウントだとA1.Flexインスタンスが枯渇してて建てられない: 後で記事にする
- OCIのBlockVolumeは最低50GB, ノードの2台にも最低50GB割り当てる必要がある。無料枠は200GBなので無料枠の範囲で収めようとするとPVが2つしか使えない。
- → CephをBlockVolume PVを直接使って構築して、アプリケーションはCeph PVを使うようにすればもっと小さい単位で分割して使えるのでは?Volume Backupも5つまで無料枠で取れるのでレプリカも個人運用ならいらないし
k8sのマニフェスト管理ツールの比較
kustomize
- kubectl/argocdなどほぼ標準で組み込まれている
- base(yaml)に対してoverlays/patch(yaml)を作って環境ごとのマニフェストを作成するようなイメージ
所感
- 色々なツールに組み込まれててデファクト感ある
- 生yamlちょっと辛そう
Grafana tanka
- jsonnetでk8sマニフェストを書くためのなにか(ライブラリ+コマンド?)
所感
- jsonnetを覚えるのがちょっと大変
- そんなに使われてはなさそう
CUE
- 設定記述言語
所感
- 制約の書き方が面白そう
- が、LSPなどの開発まで手が回ってない感じでエディタなども含めるとまだ書きづらそう
CDK8s
- AWS CDKのようにしてプログラミング言語で記述してマニフェストを生成する
- cdk8s importでCRDをベースに型/クラス生成ができる(
kubectl get customresourcedefinitions.apiextensions.k8s.io -o yaml > crds.yaml && cdk8s import crds.yaml
でクラスタ内のCRDの型/クラスをすべて生成)
所感
- CDKを使い慣れているからかもしれないが、CRD含めて型付きでかけるのがとても良かった。仕事とかだとチームメンバーのスキルによっては採用が難しいとかがあるのかもしれない。
- Helmのvaluesに対して型を生成する方法はなさそう.
- cdk8sコマンドをArgoCD上などで実行するのはカスタムイメージつけたり実行コストが結構高そうなので、ローカルでsynthまでして生成されたマニフェストもGitで管理するのがとりあえずは簡単. 最終的なマニフェストのレビューもできるし