下载 kubebuilder
curl -L https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH) -o kubebuilder
mv kubebuilder /usr/local/bin/
初始化 kubebuilder 项目
# domain 随意,代表 k8s 的集群
kubebuilder init --domain my.domain
创建 operator api
kubebuilder create api --group app --version v1 --kind MyCRD
# 然后一直按 yes,创建出 controller
在集群中创建出 CRD 和 CR
自定义 CRD 资源
type MyCRDSpec 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 Guestbook. Edit guestbook_types.go to remove/update
// 想写什么就写什么
Username string `json:"username"`
Password string `json:"password"`
Image string `json:"image"`
}
生成 CRD yaml 和填写 CR
生成 CRD :make install
填写 CR:
apiVersion: app.my.domain/v1
kind: MyCRD
metadata:
labels:
app.kubernetes.io/name: mycrd
app.kubernetes.io/instance: mycrd-sample
app.kubernetes.io/part-of: kubebuilder-test
app.kubernetes.io/managed-by: kustomize
app.kubernetes.io/created-by: kubebuilder-test
name: mycrd-sample
spec:
username: ar
password: ar
image: hub.byted.org
创建 CRD 和 CR 到集群中
kubectl apply -f config/crd/bases/app.my.domain_mycrds.yaml
kubectl apply -f config/samples/app_v1_mycrd.yaml
创建 controller 监听 CRD
func (r *MyCRDReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
// 资源增删改之后都会触发 Reconcile,kubebuilder
_ = log.FromContext(ctx)
// TODO(user): your logic here
fmt.Println("start reconcile")
cr := appv1.MyCRD{}
err := r.Get(ctx, req.NamespacedName, &cr)
if err != nil {
if errors.IsNotFound(err) {
return ctrl.Result{}, nil
}
return ctrl.Result{}, err
}
// 举例,如果 name 为 ar 就变成 qyrzr
if cr.Spec.Username == "ar" {
fmt.Println("use nickname")
cr.Spec.Username = "qyrzr"
err = r.Update(ctx, &cr)
if err != nil {
fmt.Println("failed to change username")
return ctrl.Result{}, err
}
}
return ctrl.Result{}, nil
}