mac:example-inc jianzhang$ operator-sdk new learn-operatorINFO[0000] Creating new Go operator 'learn-operator'. INFO[0000] Created go.mod INFO[0000] Created tools.goINFO[0000] Created cmd/manager/main.goINFO[0000] Created build/Dockerfile INFO[0000] Created build/bin/entrypoint INFO[0000] Created build/bin/user_setup INFO[0000] Created deploy/service_account.yaml INFO[0000] Created deploy/role.yaml INFO[0000] Created deploy/role_binding.yaml INFO[0000] Created deploy/operator.yaml INFO[0000] Created pkg/apis/apis.goINFO[0000] Created pkg/controller/controller.goINFO[0000] Created version/version.goINFO[0000] Created .gitignore INFO[0000] Validating project INFO[0022] Project validation successful. INFO[0022] Project creation complete.
packageapisimport ("k8s.io/apimachinery/pkg/runtime")// AddToSchemes may be used to add all resources defined in the project to a Schemevar AddToSchemes runtime.SchemeBuilder// AddToScheme adds all Resources to the SchemefuncAddToScheme(s *runtime.Scheme) error {return AddToSchemes.AddToScheme(s)}
pkg/controller/controller.go
packagecontrollerimport ("sigs.k8s.io/controller-runtime/pkg/manager")// AddToManagerFuncs is a list of functions to add all Controllers to the Managervar AddToManagerFuncs []func(manager.Manager) error// AddToManager adds all Controllers to the ManagerfuncAddToManager(m manager.Manager) error {for _, f :=range AddToManagerFuncs {if err :=f(m); err !=nil {return err } }returnnil}
开始编写逻辑代码
使用`add api` 创建新的API资源
使用 --kind 来指定新API的名称,这里命名为 `Learn`
mac:learn-operator jianzhang$ operator-sdk add api --api-version=app.learn.com/v1 --kind=LearnINFO[0000] Generating api version app.learn.com/v1 for kind Learn. INFO[0000] Created pkg/apis/app/group.goINFO[0033] Created pkg/apis/app/v1/learn_types.goINFO[0033] Created pkg/apis/addtoscheme_app_v1.goINFO[0033] Created pkg/apis/app/v1/register.goINFO[0033] Created pkg/apis/app/v1/doc.goINFO[0033] Created deploy/crds/app.learn.com_v1_learn_cr.yaml INFO[0037] Created deploy/crds/app.learn.com_learns_crd.yaml INFO[0037] Running deepcopy code-generation for Custom Resource group versions: [app:[v1], ] INFO[0045] Code-generation complete. INFO[0045] Running OpenAPI code-generation for Custom Resource group versions: [app:[v1], ] INFO[0054] Created deploy/crds/app.learn.com_learns_crd.yaml INFO[0054] Code-generation complete. INFO[0054] API generation complete.
typeLearnSpecstruct {// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file// Add custom validation using kubebuilder tags: https://book-v1.book.kubebuilder.io/beyond_basics/generating_crd.html// Size is the size of the learn deployment Size int32`json:"size"`}// LearnStatus defines the observed state of Learn// +k8s:openapi-gen=truetypeLearnStatusstruct {// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file// Add custom validation using kubebuilder tags: https://book-v1.book.kubebuilder.io/beyond_basics/generating_crd.html// PodNames are the names of the learn pods PodNames []string`json:"podnames"`}
$ sed -i "" 's|REPLACE_IMAGE|quay.io/jiazha/learn-operator|g' deploy/operator.yaml
可以看到,在部署之前,当前集群中并无 kind 资源:
mac:learn-operator jianzhang$ oc get learn
error: the server doesn't have a resource type "learn"
开始部署:
mac:learn-operator jianzhang$ oc create -f deploy/role.yaml
role.rbac.authorization.k8s.io/learn-operator created
mac:learn-operator jianzhang$ oc create -f deploy/role_binding.yaml
rolebinding.rbac.authorization.k8s.io/learn-operator created
mac:learn-operator jianzhang$ oc create -f deploy/operator.yaml
deployment.apps/learn-operator created
mac:learn-operator jianzhang$ oc create -f deploy/crds/app.learn.com_learns_crd.yaml
customresourcedefinition.apiextensions.k8s.io/learns.app.learn.com created
可以看到该operator已经运行起来了,并且该集群中已经有了learn资源了!
mac:learn-operator jianzhang$ oc get pods
NAME READY STATUS RESTARTS AGE
learn-operator-768d88c6d6-8g9lz 1/1 Running 0 10m
mac:learn-operator jianzhang$ oc get learn
No resources found.