このドキュメントは【wantedly】custom controllerを使ってk8sを学ぶハンズオン で利用した資料です。イベント当日は hackmd をメインのドキュメントとして用いますが、アーカイブでは適宜別の場所に移すかもしれません。その場合はわかり易い場所にリンクを置いておきます。
公式ドキュメント
色々あるけど今日は下の2点に集中します。
minikube start
で手元に kubernetes クラスタを用意できる。
minikube に関しては 公式ドキュメント を参照
下の yaml を nginx.yaml
として保存してみる
apiversion: apps/v1
kind: deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchlabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerport: 80
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
pod (よく知らない人はプロセスと思ってもらってここでは大丈夫)が起動します。
ここで一つどれか消してみると勝手に復活してきます。
$ kubectl get po
name ready status restarts age
nginx-deployment-6b474476c4-2z547 1/1 running 0 10m
nginx-deployment-6b474476c4-gbgck 1/1 running 0 10m
nginx-deployment-6b474476c4-zhvrl 1/1 running 0 10m
$ kubectl delete po nginx-deployment-6b474476c4-zhvrl
pod "nginx-deployment-6b474476c4-zhvrl" deleted
$ kubectl get po
name ready status restarts age
nginx-deployment-6b474476c4-2z547 1/1 running 0 10m
nginx-deployment-6b474476c4-8kmqf 1/1 running 0 8s
nginx-deployment-6b474476c4-gbgck 1/1 running 0 10m
勝手に復活してきたことに注目 -> 自己修復
このペアが作れれば自分 kubernetes を拡張できる!
実際に controller を書いてみることで kubernetes の中身がわかった気になる。というのが今回の目標です。
417872
まで行く
kubebuilder は curl -l -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env goos)/$(go env goarch)
で install できる
ここでは repository と kubernetes cluster を用意します。
$ minikube start
$ mkdir math-controller
$ kubebuilder init --domain potsbo.k8s.wantedly.com
$ git init
$ git add .
$ git commit
init が失敗する場合は--skip-go-version-check
をつけるといいかもしれない
$ kubebuilder create api --group math --version v1beta1 --kind number --controller --resource
$ make manifests
これで resource を作ることができる。
下のように resource の定義を変えてみる。
diff --git a/api/v1beta1/number_types.go b/api/v1beta1/number_types.go
index 95f25ea..9cd3a7d 100644
--- a/api/v1beta1/number_types.go
+++ b/api/v1beta1/number_types.go
@@ -28,8 +28,8 @@ type numberspec struct {
// insert additional spec fields - desired state of cluster
// important: run "make" to regenerate code after modifying this file
- // foo is an example field of number. edit number_types.go to remove/update
- foo string `json:"foo,omitempty"`
+ // value is an example field of number. edit number_types.go to remove/update
+ value int64 `json:"value,omitempty"`
}
// numberstatus defines the observed state of number
したのコマンドで kubernetes に適応できる。
$ make manifests
$ make install
c6c09d8b
まで
$ make install
$ make run
$ kubectl apply -f config/samples/math_v1beta1_number.yaml
$ kubectl get number
ここまでで好きな resource が作れるということがわかった。
なにかを作ったり消したりすることしか出来なくて面白くない
下のことをやっていく
kubebuilder create api --group math --version v1beta1 --kind tuple --controller --resource
https://github.com/potsbo/math-controller/commit/bca73cffec800fafe944637d03791ffccd9e18db
https://github.com/potsbo/math-controller/commit/9685d6b657a6e1bdbb5690af2810a1be185696b5
kubebuilder create api --group math --version v1beta1 --kind fermat --controller --resource
数学の問題
4を法として1に合同な素数は二個の平方数の和で表される。