Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
カスタムコントローラは万能なのでアプリケーションを作るためにも使える
Search
yugo kobayashi
September 09, 2020
1
520
カスタムコントローラは万能なのでアプリケーションを作るためにも使える
yugo kobayashi
September 09, 2020
Tweet
Share
More Decks by yugo kobayashi
See All by yugo kobayashi
[k8sjp]KubeCon_NA_2023_Recap.pdf
koba1t
0
70
[k8sjp #56] Kustomize v5 を含む最新機能とテクニックの紹介
koba1t
2
9.5k
kustomizeのあまり知られていないが 便利な機能 (kustomize edit,create) の紹介
koba1t
0
3k
Recap: Customizing Kustomize with Client-Side Custom Resources
koba1t
0
240
Ephemeral_Containers_という謎の機能をk8sはどうやって実現しているのか.pdf
koba1t
1
240
CLE33
koba1t
0
48
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
52
13k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Why Our Code Smells
bkeepers
PRO
334
57k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
It's Worth the Effort
3n
183
27k
Building an army of robots
kneath
302
43k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
Code Review Best Practice
trishagee
64
17k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
10 Git Anti Patterns You Should be Aware of
lemiorhan
654
59k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Transcript
カスタムコントローラは万能だから アプリケーションを作るためにも使える
自己紹介 name: 小林優吾 org: 信州大学 team: kstm github: koba1t twitter:
0x6b6f62 role: infrastructure engineer -> software engineer OS: "Arch Linux" 2
1. 概要 3
概要 CRD+カスタムコントローラは非常に強力な機能 - カスタムコントローラのReconciliation loop - CustomResourceDefinitionによるAPIの拡張 4
Reconciliation loop Declarative Managementの実装部分 > 定義された状態になるように常に自律的に動き続ける> kubernetesの高い耐障害性や自動化を実現する部分 5
APIの拡張 独自のリソースをk8sのリソースと同等に扱える - kube-apiserverを使ったリソースのCRUD - etcdでリソースの永続化 - kubectl,dashboardが使える - k8sのRBACを利用したアクセスの認可
> あまり言及されないけど、とても便利 https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/ 6
今回のセッションの趣旨 私が構築、開発しているシステムが要件的にk8s上で動かすのが困難 だった。 CRDの利点を行かしてカスタムコントローラを1つのmicroserviceのよう に扱うことで困難だった点を解消して全体的にcloudnativeなアーキテク チャにできた。 7
目次 1. 概要 2. 開発の経緯 3. 構成の検討 4. カスタムコントローラの実装 5.
システム全体の構成 6. まとめ 8
2. 開発の経緯 9
状況 大学で授業で使用するため に、学生がブラウザから操作 できるIDEとかのアプリケー ションを提供してる ---------> -> この演習を行う環境を作 成、運用するためのシステム を作成することになった
10 > ソフトウェアを変更できるようにする必要がある
要件 既存のソフトウェアをそのまま使用したい > プログラミングに使うCloud9 > データベースに使うmariadb+phpmyadmin -> ユーザが1Serverを要求する感じになる 11
ユーザが1ホストを要求する 12
追加の制約 このシステムの運用作業を行うのは1+1人 しかもどちらも運用に専念するわけではない -> 可能な限り自動化して手がかからないようにする 私は学生という性質上卒業というイベントがある -> (このプロジェクトが続けば)後任の学生が引き継ぐ -> 見通しが利くように構成したい
13
3. 構成の検討 14
kubernetesを使う上での課題 1ユーザにつき1つコンテナを割り当てる機能はk8sには無い > 公式の機能では簡単に実装できない 何らかのシステムをk8sとは別に作る必要がある --> kubernetesで作るのは向いていないのでは? 15
kubernetesの利点 - Auto-scaling - Self-healing - Scheduling - Portability >
なんとかこの利点を生かして構築したい 16
カスタムコントローラを使えば良さそう カスタムコントローラを使えばkubernetes上でかなり自由なことができる これを使ってkubernetesに無い機能を実装すれば良さそう > ただ、全部の機能をカスタムコントローラで実装するのは複雑になる > かなりの回数くり返し呼ばれるからあまり複雑な処理はしない方が良さそう 17
必要になる機能は... - ユーザ用のコンテナを作成し - ユーザを識別するための認証をして - ユーザのhttpアクセスをそのユーザ用のコンテナに流す 18
正直kubernetesで上手く扱えなさそうなのは ユーザごとのコンテナを作る部分だけ ここのみをカスタムコントローラにすれば 実装が複雑にならなくて良い感じになりそう > 他の部分は普通に実装しても大丈夫そう > 認証部分とかproxy部分とかを柔軟に変えられる 19
CRD+CC - 構成が複雑にならない - k8sのエコシステムに適合する - k8s本来の挙動から外れた使い かたにならない 20
4. 実際の実装 21
実際に作成した 22
定義したCRDの内容 `Template`と`Userland`の二種類のリソースを定義した - Templateで実際にどんなコンテナが必要か定義 (実態はdeploymentのspec.template.specの定義をそのまま使ってる) - Userlandで使用するユーザのユーザ名(と対応するTemplate)だけを定義 23
24
25
26
27
28
29
カスタムコントローラの実装 - kubebuilderで実装 コンテナの定義とユーザの定義を分けることでコンテナの内容(imageのversionとか configとか)の集中的な管理をしている -> ユーザごとのdeploymentの内容に差があると運用が大変になりそう TemplateリソースとUserlandリソースを見て、Templateリソースを元にusernameを入 れたDepoymentとServiceを作成するだけの単純な動作をする 30
システム全体で見ると crdのリソースを操作するコンポーネントがあるmicroserviceっぽくなった 31
5. システム全体の構成(例) 32
33
34 vscode-koba1t-svc.default.svc.cluster.local X-User: koba1t github.com/koba1t
35 yamlで定義
CRDならSAで権限管理できる ServiceAccountで権限を与える形式にすれば、最小限の範囲の権限にできる -> Templateを定義するリソースとUserを定義するリソース分離した -> ユーザ管理と作成されるコンテナの定義のための権限を分けることができる > ユーザを追加削除する権限で、作成されるコンテナの内容を変更されたくない 36
proxyでリソース作るのならcrdは必要無いのでは? - proxyで作ったリソースを管理するのが困難になる - imageのアップデートとか - deploymentだけでなくserviceとかも必要だけどまとめて管理したい 37
kubebuilderの不便な点 内部的にcontroller-runtimeを使っている - crdのリソースをclient-goで使えない!!!!!!! -> https://github.com/kubernetes-sigs/kubebuilder/issues/1152 -> kubebuilderでサポートする予定はないらしい -> コントローラ外からの場合でもcontroller-runtimeを使えば良いらしい
38
6. まとめ - システム全体を良い感じに分割して構成できる気がする -> 結果的にmicroserviceっぽくなった -> 各コンポーネントも複雑なことをしていなくてシンプル - CloudNativeに適さないようなシステムだが、CRD+カスタムコントローラの活用でk8s
に適したアーキテクチャにすることができた - カスタムコントローラはReconcile loop自体のメリットも大きいが、 kubernetesのAPIの一部として扱うことができるメリットも大きい -> SAでのRBACだったり、api-serverを自前で用意しなくて良いのは便利 39
kubernetesに合わないようなworkloadだったり要望だったりがあ るシステムでも カスタムコントローラを柔軟に活用すれば良い感じにCloudNative なシステムを簡単に作れるかもしれない 40
カスタムコントローラはできることも豊富だけど カスタムコントローラを使う方法も豊富で便利 41
END 42