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
4
180
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
絶対殺すSIGKILLシグナルと絶対死なないプロセス
sat
PRO
3
47
シェルのセッション
sat
PRO
2
19
プロセスの生成 exec編
sat
PRO
1
36
プロセスの生成 fork&exec編
sat
PRO
0
30
プロセスの生成 コピーオンライトを使ったfork編
sat
PRO
0
28
プロセスの生成 fork編
sat
PRO
0
33
静的ライブラリと 共有ライブラリの違いを実験で確認
sat
PRO
1
48
ハイテク休憩
sat
PRO
2
200
利きプロセススケジューラ
sat
PRO
5
3.3k
Other Decks in Technology
See All in Technology
実践!OpenTelemetry
oracle4engineer
PRO
0
130
Kubernetes x k6 で負荷試験基盤を開発して 負荷試験を民主化した話 / Kubernetes x k6
sansan_randd
0
480
re:Invent Recap (January 2025)
scalefactory
0
340
これからSREになる人と、これからもSREをやっていく人へ
masayoshi
3
3k
まだ間に合う! エンジニアのための生成AIアプリ開発入門 on AWS
minorun365
PRO
4
440
もし今からGraphQLを採用するなら
kazukihayase
9
4.4k
GraphRAG: What I Thought I Knew (But Didn’t)
sashimimochi
1
250
バクラクの組織とアーキテクチャ(要約)2025/01版
shkomine
13
3.2k
プロダクト価値を引き上げる、「課題の再定義」という習慣
moeka__c
0
220
デザインから逆算して難易度を見積もるための観点
fumiyasac0921
0
100
ObservabilityCON on the Road Tokyoの見どころ
hamadakoji
0
240
Grid表示のレイアウトで Flow layoutsを使う
cffyoha
1
160
Featured
See All Featured
Faster Mobile Websites
deanohume
306
31k
Building Your Own Lightsaber
phodgson
104
6.2k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
39
1.9k
Done Done
chrislema
182
16k
Being A Developer After 40
akosma
89
590k
Optimizing for Happiness
mojombo
376
70k
Music & Morning Musume
bryan
46
6.3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
380
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Why Our Code Smells
bkeepers
PRO
335
57k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
290
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
620
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