扩展kubernetes两个最常用最需要掌握的东西:自定义资源CRD 和 adminsion webhook, 本文教你如何十分钟掌握CRD开发.
kubernetes允许用户自定义自己的资源对象,就如同deployment statefulset一样,这个应用非常广泛,比如prometheus opterator就自定义Prometheus对象,再加上一个自定义的controller监听到kubectl create Prometheus时就去创建Pod组成一个pormetheus集群。rook等等同理。
我需要用kubernetes调度虚拟机,所以这里自定义一个 VirtualMachine 类型
kubebuilder
kubebuilder能帮我们节省大量工作,让开发CRD和adminsion webhook变得异常简单。
安装
通过源码安装:
git clone https://github.com/kubernetes-sigs/kubebuilder
cd kubebuilder
make build
cp bin/kubebuilder $GOPATH/bin
或者下载二进制:
os=$(go env GOOS)
arch=$(go env GOARCH)
# download kubebuilder and extract it to tmp
curl -sL https://go.kubebuilder.io/dl/2.0.0-beta.0/${os}/${arch} | tar -xz -C /tmp/
# move to a long-term location and put it on your path
# (you'll need to set the KUBEBUILDER_ASSETS env var if you put it somewhere else)
sudo mv /tmp/kubebuilder_2.0.0-beta.0_${os}_${arch} /usr/local/kubebuilder
export PATH=$PATH:/usr/local/kubebuilder/bin
还需要装下kustomize 这可是个渲染yaml的神器,让helm颤抖。
go install sigs.k8s.io/kustomize/v3/cmd/kustomize
使用
注意你得先有个kubernetes集群,一步安装走你
创建CRD
kubebuilder init --domain sealyun.com --license apache2 --owner "fanux"
kubebuilder create api --group infra --version v1 --kind VirtulMachine
安装CRD并启动controller
make install # 安装CRD
make run # 启动controller
然后我们就可以看到创建的CRD了
# kubectl get crd
NAME AGE
virtulmachines.infra.sealyun.com 52m
来创建一个虚拟机:
# kubectl apply -f config/samples/
# kubectl get virtulmachines.infra.sealyun.com
NAME AGE
virtulmachine-sample 49m
看一眼yaml文件:
# cat config/samples/infra_v1_virtulmachine.yaml
apiVersion: infra.sealyun.com/v1
kind: VirtulMachine
metadata:
name: virtulmachine-sample
spec:
# Add fields here
foo: bar
这里仅仅是把yaml存到etcd里了,我们controller监听到创建事件时啥事也没干。
把controller部署到集群中
make docker-build docker-push IMG=f