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
RubyでKubernetesプログラミング
Search
Satoru Takeuchi
PRO
January 18, 2025
Technology
2
120
RubyでKubernetesプログラミング
北陸三県.rb Lightning Talks in Kanazawaの発表スライドです。
https://kzrb.doorkeeper.jp/events/180430
Satoru Takeuchi
PRO
January 18, 2025
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
プロセスの生成 exec編
sat
PRO
1
31
プロセスの生成 fork&exec編
sat
PRO
0
22
プロセスの生成 コピーオンライトを使ったfork編
sat
PRO
0
25
プロセスの生成 fork編
sat
PRO
0
28
静的ライブラリと 共有ライブラリの違いを実験で確認
sat
PRO
1
37
ハイテク休憩
sat
PRO
2
200
利きプロセススケジューラ
sat
PRO
5
3.2k
俺とVSCode Python Debugger Extension
sat
PRO
1
210
コード再利用のしくみ ライブラリ
sat
PRO
3
78
Other Decks in Technology
See All in Technology
The future we create with our own MVV
matsukurou
0
1.8k
自社 200 記事を元に整理した読みやすいテックブログを書くための Tips 集
masakihirose
1
240
Git scrapingで始める継続的なデータ追跡 / Git Scraping
ohbarye
4
110
スケールし続ける事業とサービスを支える組織とアーキテクチャの生き残り戦略 / The survival strategy for Money Forward’s engineering.
moneyforward
0
250
20250116_JAWS_Osaka
takuyay0ne
2
160
アジャイルチームが変化し続けるための組織文化とマネジメント・アプローチ / Agile management that enables ever-changing teams
kakehashi
3
3k
Fearsome File Formats
ange
0
580
2025年のARグラスの潮流
kotauchisunsun
0
740
OPENLOGI Company Profile
hr01
0
58k
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
54k
機械学習を「社会実装」するということ 2025年版 / Social Implementation of Machine Learning 2025 Version
moepy_stats
3
450
エンジニアリングマネージャー視点での、自律的なスケーリングを実現するFASTという選択肢 / RSGT2025
yoshikiiida
4
3.3k
Featured
See All Featured
Optimizing for Happiness
mojombo
376
70k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Facilitating Awesome Meetings
lara
50
6.2k
Being A Developer After 40
akosma
89
590k
Learning to Love Humans: Emotional Interface Design
aarron
274
40k
Scaling GitHub
holman
459
140k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.5k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Rails Girls Zürich Keynote
gr2m
94
13k
Gamification - CAS2011
davidbonilla
80
5.1k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Transcript
Rubyで Kubernetesプログラミング Jan. 18th, 2025 Satoru Takeuchi X: satoru_takeuchi 1
• sat(武内 覚) ◦ X: satoru_takeuchi • 会社員 ◦ Kubernetes(K8s)上で動く分散ストレージの開発
• 個人事業主 ◦ 本や記事の執筆 2
懺悔の時間 • Rubyで実用的なプログラムを書いたのが20年前 • kanazawa.rbに参加してから6年、Rubyの話をしたことがほぼ無い 3
何しに来たの? 4
何しに来たの? • 3県合同Rubyイベントなので久々にRubyを触ってみることにした • K8sクライアントをRubyで書くことにした 5
KubernetesのRubyクライアント探し • 公式サイトにサポートされているライブラリが載っていた ◦ https://kubernetes.io/docs/reference/using-api/client-libraries/ … 6
メンテされてなかった • 最終コミットは4年前 ◦ https://github.com/kubernetes-client/ruby 7
メンテされてなかった • 最終コミットは4年前 ◦ https://github.com/kubernetes-client/ruby 8 ☠終了☠
まだ終わらんよ • “Community-maintained client libraries”節の中にk8s-rubyというものを発見 ◦ https://github.com/k8s-ruby/k8s-ruby • 過去にKontenaという会社が開発していて、会社close後にforkしてコミュニティベー スで開発が続いているらしい
9
動作環境 • OS: Ubuntu 24.0.1 • kind: v0.26.0 • kubernetes:
v1.32.0 • ruby: 3.2.3 • k8s-ruby: v0.16.0 10
比較対象: Go(client-go)でpod一覧表示 package main import ( "context" "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" ) func main() { config , _ := clientcmd .BuildConfigFromFlags ("", "/home/sat/.kube/config" ) clientset , _ := kubernetes .NewForConfig (config ) pods, _ := clientset .CoreV1 ().Pods("").List(context .Background (), metav1 .ListOptions {}) for _, pod := range pods.Items { fmt.Printf ("ns=%s, name= %s\n", pod.GetNamespace (), pod.GetName ()) } } 11
k8s-rubyならこうなる • まあまあ短くなる • 実行結果 12 require 'k8s-ruby' client =
K8s::Client .config( K8s::Config .load_file( ’/home/sat/.kube/config' )) client.api( 'v1').resource( 'pods' , namespace: 'default' ).list().each do |pod| puts "ns=#{pod.metadata.namespace }, pod= #{pod.metadata.name }" end $ bundle exec ./test.rb ns=default, name=nginx ns=default, name=nginx2
コントローラも書けるよ • K8sのコントローラとは、あるリソースの状態を監視してなんらかのアクションをする プログラム • 今回はpodに心霊現象を起こすコントローラを作る 13
ソース #!/usr/bin/ruby require 'k8s-ruby' client = K8s::Client .config( K8s::Config .load_file(
’/home/sat/.kube/config' )) client.api( 'v1').resource( 'pods' , namespace: 'default' ).watch() do |event | pod = client.api( 'v1').resource( 'pods' , namespace: 'default' ).get(event.resource.metadata.name) pod.metadata. annotations[ 'message' ] = "???" client.api( 'v1').resource( 'pods' , namespace: 'default' ).update_resource (pod) end 14
今は霊圧を感じない… 15 $ kubectl get pod nginx -o yaml apiVersion:
v1 kind: Pod metadata: annotations: … spec:
コントローラを実行して… 16 $ kubectl get pod nginx -o yaml …
$ bundle exec ./spiritual-pod-controller.rb &
podをリストすると… 17 … $ kubectl get pod nginx -o yaml
怪奇現象が…! 18 … $ kubectl get pod nginx -o yaml
apiVersion: v1 kind: Pod metadata: annotations: … spiritual-message: タスケテ... … spec:
まとめ • RubyでK8sプログラミングができることがわかった • どれだけ実用に耐えるかはよくわからない ◦ 開発が活発じゃなさそう ◦ ドキュメントが皆無 ◦
ここ数年追加された機能には対応していなさそう • サンプルコード ◦ https://github.com/satoru-takeuchi/test-k8s-ruby 19