首页 > 其他分享 >k8s实践之自定义控制器crd编写

k8s实践之自定义控制器crd编写

时间:2023-03-20 15:14:59浏览次数:55  
标签:resource network 自定义 controller crd go k8s samplecrd

本篇文章我们实践用k8s编写一个自定义控制器,文章参考自极客时间张磊老师的课程:深入剖析 Kubernetes。

1.自定义控制器项目

首先我们在 GOPATH 下,创建一个结构如下的项目:

$ tree $GOPATH/src/github.com/qxcheng/k8s-controller-custom-resource
.
├── controller.go
├── crd
│   └── network.yaml
├── example
│   └── example-network.yaml
├── main.go
└── pkg
    └── apis
        └── samplecrd
            ├── register.go
            └── v1
                ├── doc.go
                ├── register.go
                └── types.go

源码请参考: https://github.com/resouer/k8s-controller-custom-resource

注意将其中的相关import路径修改为自己的本地路径。例如:

"github.com/resouer/k8s-controller-custom-resource/pkg/apis/samplecrd"
->
"github.com/qxcheng/k8s-controller-custom-resource/pkg/apis/samplecrd"

2.代码生成

接下来,使用 Kubernetes 提供的代码生成工具,为上面定义的 Network 资源类型自动生成 clientset、informer 和 lister。

# 首先清空main.go controller.go

cd /root/go18/src/github.com/qxcheng/k8s-controller-custom-resource/
go mod init github.com/qxcheng/k8s-controller-custom-resource
go mod tidy
go install k8s.io/code-generator/...@latest

ROOT_PACKAGE="github.com/qxcheng/k8s-controller-custom-resource"
CUSTOM_RESOURCE_NAME="samplecrd"
CUSTOM_RESOURCE_VERSION="v1"
EXEC_DIR=$GOPATH/pkg/mod/k8s.io/[email protected]  # 版本号注意核对

# 脚本需要使用chmod授予执行权限
"${EXEC_DIR}"/generate-groups.sh all "$ROOT_PACKAGE/pkg/client" "$ROOT_PACKAGE/pkg/apis" "$CUSTOM_RESOURCE_NAME:$CUSTOM_RESOURCE_VERSION" --go-header-file "${EXEC_DIR}"/hack/boilerplate.go.txt -v 10

代码生成工作完成之后,我们再查看一下这个项目的目录结构:

$ tree
.
├── controller.go
├── crd
│   └── network.yaml
├── example
│   └── example-network.yaml
├── main.go
└── pkg
    ├── apis
    │   └── samplecrd
    │       ├── register.go
    │       └── v1
    │           ├── doc.go
    │           ├── register.go
    │           ├── types.go
    │           └── zz_generated.deepcopy.go
    └── client
        ├── clientset
        ├── informers
        └── listers

3.编译运行项目

# 将main.go和controller.go恢复。

$ go build -o samplecrd-controller .

$ ./samplecrd-controller -kubeconfig=$HOME/.kube/config -alsologtostderr=true
I0915 12:50:29.051349   27159 controller.go:84] Setting up event handlers
I0915 12:50:29.051615   27159 controller.go:113] Starting Network control loop
I0915 12:50:29.051630   27159 controller.go:116] Waiting for informer caches to sync
E0915 12:50:29.066745   27159 reflector.go:134] github.com/resouer/k8s-controller-custom-resource/pkg/client/informers/externalversions/factory.go:117: Failed to list *v1.Network: the server could not find the requested resource (get networks.samplecrd.k8s.io)
...

在另一个 shell 窗口里执行:

$ kubectl apply -f crd/network.yaml
$ kubectl apply -f example/example-network.yaml

network.yaml如果不可用请参考:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: networks.samplecrd.k8s.io
  annotations:
    "api-approved.kubernetes.io": "https://github.com/kubernetes/kubernetes/pull/78458"
spec:
  group: samplecrd.k8s.io
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        # 校验方法
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                #类型校验
                cidr:
                  type: string
                gateway:
                  type: string
  names:
    kind: Network
    plural: networks
    singular: network
  scope: Namespaced

这时候对example-network.yaml进行更新和删除,可以观察到Informer 注册的更新事件和删除事件会被触发。

标签:resource,network,自定义,controller,crd,go,k8s,samplecrd
From: https://www.cnblogs.com/qxcheng/p/17236337.html

相关文章

  • tp6自定义变量代替静态资源路径
    tp6在视图页面想使用一个变量直接代替public目录下的一些静态资源目录,可以定义 使用方式: ......
  • 自定义权限控制
    1业务场景在程序中某些选项不能让某些用户使用,需要进行权限控制,并且没有标准的权限对象,就需要自己自定义权限对象进行控制。例如:在选择配置容差时,不允许某些用户使用。......
  • Katalon使用自定义关键字实现下载(Assert Statement)
    该图是完整的下载流程: 操作步骤如下: 1.在keywords-testclass(右键-new-keyword)-myKeywords(输入名称,不选择任何筛选项,点击报错)   mykeywords文件下输入js代码:packagetes......
  • 使用自定义关键字实现上传文件功能(keyword)
    1.创建cn.groovy(右键New-package;右键new-keyword)-创建完成packagetestclassimportstaticcom.kms.katalon.core.checkpoint.CheckpointFactory.findCheckpointimportsta......
  • wpf自定义行为库(一)
    起因:我有个相对简单的WPF上位机程序,逻辑还是事件驱动那一套,虽然写的时候方便,但是代码的复用性太差了,并且各个模块的耦合度也很高,修改难度较大,于是我萌生了一个想法,将其改造......
  • Solon2 自定义 slf4j 日志添加器(比如存到数据库)
    本案需要引入已适配的slf4j日志框架(solon.logging.simple或logback-solon-plugin或log4j-solon-plugin)。1、自定义添加器入门实现自定义添加器实现一个简单的日......
  • 自定义ViewGroup 实现拖动跟快速滚动的效果
     之前做到个项目要类似listView或者GridView中的控件移动的效果(主屏上所有程序列表上的效果):1:子控件跟着手指移动2:快速拨动一下,根据拨动的速度......
  • Android自定义长按事件
    Android系统自带了长按事件,setOnLongClickListener即可监听。但是有时候,你不希望用系统的长按事件,比如当希望长按的时间更长一点的时候。这时候就需要......
  • Three.js自定义shader实现离相机越近越透明效果
    constcustomShader=newTHREE.ShaderMaterial({uniforms:{},defines:{nearDis:0.3},transparent:true,side:THREE.DoubleSide,vertexShader:......
  • 使用K8S进行蓝绿部署的简明实操指南
    在之前的应用部署系列文章里,我们已经介绍过什么是蓝绿部署。如需回顾,点击下方文章链接即可重温。本文我们将会介绍如何使用Kubernetes实现蓝绿部署。 应用部署初探:3......