【k8s】kubernetes编写自己的operator(operator-sdk:v1.xxx)

本文档详细介绍了如何使用Operator-SDK在kubernetes上编写和部署自己的operator,包括创建新项目、定义CRD数据结构、编写业务逻辑、本地调试、部署以及删除operator和CRD资源的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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/runtime"
	"k8s.io/apimachinery/pkg/runtime/schema"
	"reflect"
	ctrl "sigs.k8s.io/controller-runtime"
	"sigs.k8s.io/controller-runtime/pkg/client"

	csdnv1 "csdn.net/api/v1"
)

// HelloWorldManagerReconciler reconciles a HelloWorldManager object
type HelloWorldManagerReconciler struct {
   
   
	client
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级战斗王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值