关于operator-sdk怎么安装,请参考官方文档:https://sdk.operatorframework.io/docs/installation/install-operator-sdk/
1. 创建operator新项目
1)初始化项目,注意,一定要初始化go mod,否则operator-sdk无法识别项目依赖,且以下命令均在空文件夹hello-world-operator下执行:
2)创建api和控制器,创建HelloWorldManager的自定义资源类型:
以上命令执行成功后,可观察到项目目录中创建出了api/v1和controllers文件夹,后面我们的开发主要基于这两个文件夹中的go文件:
2. 定义crd数据结构
1)在xxx_types中定义HelloWorldManager的数据结构,需要什么定义什么即可:
代码如下:
package v1
import (
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
// HelloWorldManagerSpec defines the desired state of HelloWorldManager
type HelloWorldManagerSpec struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file
Size *int32 `json:"size"`
Image string `json:"image"`
Resources corev1.ResourceRequirements `json:"resources,omitempty"`
Envs []corev1.EnvVar `json:"envs,omitempty"`
Ports []corev1.ServicePort `json:"ports,omitempty"`
}
// HelloWorldManagerStatus defines the observed state of HelloWorldManager
type HelloWorldManagerStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "make" to regenerate code after modifying this file
appsv1.DeploymentStatus `json:",inline"`
}
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// HelloWorldManager is the Schema for the helloworldmanagers API
type HelloWorldManager struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec HelloWorldManagerSpec `json:"spec,omitempty"`
Status HelloWorldManagerStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
// HelloWorldManagerList contains a list of HelloWorldManager
type HelloWorldManagerList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []HelloWorldManager `json:"items"`
}
func init() {
SchemeBuilder.Register(&HelloWorldManager{
}, &HelloWorldManagerList{
})
}
2)定义完成后,执行make generate,该命令为更新api/v1/xxxdeepcopy.go文件,sdk会自动帮助我们生成实现了runtime.Object接口的代码。
3)执行make manifests生成crd清单,该清单用于在k8s集群中注册我们的自定义资源类型:
3. 编写controller,完成自己的业务逻辑
我们所有的业务逻辑在controllers下的xxx_controller.go下的Reconcile方法完成即可,该方法可以监听资源状态的变化。
下面代码的主要逻辑为判断资源是否存在,不存在则创建,存在则更新为最新的(并没有真正更新,而是输出了一段话,伙伴们可以填充自己的逻辑):
package controllers
import (
"context"
"encoding/json"
"fmt"
"github.com/go-logr/logr"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/api/rbac/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runt