Slide 1

Slide 1 text

Rubyで Kubernetesプログラミング Jan. 18th, 2025 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

● sat(武内 覚) ○ X: satoru_takeuchi ● 会社員 ○ Kubernetes(K8s)上で動く分散ストレージの開発 ● 個人事業主 ○ 本や記事の執筆 2

Slide 3

Slide 3 text

懺悔の時間 ● Rubyで実用的なプログラムを書いたのが20年前 ● kanazawa.rbに参加してから6年、Rubyの話をしたことがほぼ無い 3

Slide 4

Slide 4 text

何しに来たの? 4

Slide 5

Slide 5 text

何しに来たの? ● 3県合同Rubyイベントなので久々にRubyを触ってみることにした ● K8sクライアントをRubyで書くことにした 5

Slide 6

Slide 6 text

KubernetesのRubyクライアント探し ● 公式サイトにサポートされているライブラリが載っていた ○ https://kubernetes.io/docs/reference/using-api/client-libraries/ … 6

Slide 7

Slide 7 text

メンテされてなかった ● 最終コミットは4年前 ○ https://github.com/kubernetes-client/ruby 7

Slide 8

Slide 8 text

メンテされてなかった ● 最終コミットは4年前 ○ https://github.com/kubernetes-client/ruby 8 ☠終了☠

Slide 9

Slide 9 text

まだ終わらんよ ● “Community-maintained client libraries”節の中にk8s-rubyというものを発見 ○ https://github.com/k8s-ruby/k8s-ruby ● 過去にKontenaという会社が開発していて、会社close後にforkしてコミュニティベー スで開発が続いているらしい 9

Slide 10

Slide 10 text

動作環境 ● OS: Ubuntu 24.0.1 ● kind: v0.26.0 ● kubernetes: v1.32.0 ● ruby: 3.2.3 ● k8s-ruby: v0.16.0 10

Slide 11

Slide 11 text

比較対象: 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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

コントローラも書けるよ ● K8sのコントローラとは、あるリソースの状態を監視してなんらかのアクションをする プログラム ● 今回はpodに心霊現象を起こすコントローラを作る 13

Slide 14

Slide 14 text

ソース #!/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

Slide 15

Slide 15 text

今は霊圧を感じない… 15 $ kubectl get pod nginx -o yaml apiVersion: v1 kind: Pod metadata: annotations: … spec:

Slide 16

Slide 16 text

コントローラを実行して… 16 $ kubectl get pod nginx -o yaml … $ bundle exec ./spiritual-pod-controller.rb &

Slide 17

Slide 17 text

podをリストすると… 17 … $ kubectl get pod nginx -o yaml

Slide 18

Slide 18 text

怪奇現象が…! 18 … $ kubectl get pod nginx -o yaml apiVersion: v1 kind: Pod metadata: annotations: … spiritual-message: タスケテ... … spec:

Slide 19

Slide 19 text

まとめ ● RubyでK8sプログラミングができることがわかった ● どれだけ実用に耐えるかはよくわからない ○ 開発が活発じゃなさそう ○ ドキュメントが皆無 ○ ここ数年追加された機能には対応していなさそう ● サンプルコード ○ https://github.com/satoru-takeuchi/test-k8s-ruby 19