JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

k8s从入门到精通(十二):从零开始编写一个k8s operator

wys521 2024-10-15 15:49:10 精选教程 34 ℃ 0 评论

k8s的deployment 和 statefulset 只能满足常规的业务部署,但如果是一些负责的资源管理,就需要用户自定义CRD,并且配合operator 完成资源的管理,本篇文章从零开始构建一个k8s 的operator。

创建项目

首先我们需要安装operator-sdk,它是编写operator的脚手架。然后我们初始化项目

# mkdir demo-operator
# cd demo-operator
# operator-sdk init --domain youdomain.com --repo github.com/xxx/demo-operator

上面的domain是crd 里面资源的版本用的,后面会看到。

创建API

# operator-sdk create api --group apps --version v1 --kind HelloApp --resource --controller

执行完成后 operator-sdk 会为我们自动生成很多代码

# ls
api  bin  config  controllers  Dockerfile  go.mod  go.sum  hack  main.go  Makefile  PROJECT

上面的api 定义了我们的model;bin 存放二进制工具controller-gen;controller 是核心控制器代码;Dockerfile 用于将operator构建成docker镜像;main.go 是项目启动文件。

实现控制逻辑

本例中,我们通过定义一个helloapp 的对象,它有两个参数分别是image 和size,其中image代表镜像,size 代表副本数。我们通过将helloapp 映射到到一个deployment (可以分别对应到deployment spec 里面image 和replicas )帮我完成资源管理。我们先修改 api/v1/helloapp_types.go 文件,定义我们model

type HelloAppSpec struct {
	Image string `json:"image,omitempty"`
	Size  int32  `json:"size"`
}

修改完成后别忘了执行”make generate“重新生成版本转化代码。

然后修改 controllers/helloapp_controller.go 定义我们的控制逻辑,核心就是通过reconcile方法不停地对比状态,执行对应的资源操作,对齐目标状态和期望状态。关于控制器逻辑请参见之前关于k8s 核心原理的文章。

func (r *HelloAppReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
  //获取helloapp对象
  err := r.Client.Get(ctx, req.NamespacedName, helloApp)
  // 获取helloapp 对应的deployment是否存在
  err = r.Client.Get(ctx, types.NamespacedName{Name: helloApp.Name, Namespace: helloApp.Namespace}, found)
  //如果不存在就依据image 和 size 创建一个deployment
  if err != nil && errors.IsNotFound(err) {
		dep := r.deployHelloApp(helloApp)
  }
  //如果存在,则检查副本数是否一致
  size := helloApp.Spec.Size
	  if *found.Spec.Replicas != size {
      //如果不一致,则更新deployment副本数
    	found.Spec.Replicas = &size
		  err = r.Client.Update(ctx, found)
    }
  

部署CRD

我们需要先通过 make 命令帮我们生成 crd yaml

# make manifests

之后便可以通过install 安装crd。

# make install

当然你可以直接进入 config/crd/bases 目录手动安装

# kubectl apply -f .

部署operator

operator的部署有两种方式,一种是本地部署,直接go run即可

# go run main.go

它需要依赖本地 ~/.kube/config 文件。

第二种方法是集群内部署,我们需要先构建镜像

 # make docker-build IMG=xxx/demo-operator:latest

然后执行config/rbac 目录的rbac 授权 operator。之后就可以通过deployment部署operator。

  
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-operator-deployment
  namespace: demo-operator-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-operator-controller
  template:
    metadata:
      labels:
        app: demo-operator-controller
    spec:
      containers:
        - name: demo-operator-controller
          image: xxx/demo-operator:latest
          imagePullPolicy: Always
      serviceAccountName: demo-operator-svc

最后就可以通helloapp 操作操作资源了

apiVersion: youdomain.com/v1
kind: HelloApp
metadata:
  name: helloapp-sample
spec:
  image: "nginx"
  size: 1

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表