k8s怎么监听自定义资源的变更?(1)

这里我们通过 k8s的 code-generate来生成操作自定义资源的代码来监听变更

第一步下载工具

下载安装 k8s code-generate

  • 查看我们的k8s版本
shell 复制代码
kubectl get node 

输出结果为

可以看到我们的k8s版本为 v1.22.0

所以此时我们要下载与之对应的版本的code-generate

shell 复制代码
git clone https://github.com/kubernetes/code-generator.git -b v0.22.0

第二步编译程序

shell 复制代码
cd code-generate;
go install ./cmd/{client-gen,lister-gen,informer-gen,deepcopy-gen}

第三步 下载对应例子查看

shell 复制代码
git clone https://github.com/kubernetes/sample-controller.git -b v0.22.0

查看文档和目录发现结构如下,重要文件为三个 doc.go register.go types.go

第四步

参照例子 也创建 pkg 目录 apis目录 和 组目录(core)(这个组目录非常重要 下面需要用到) 和 版本目录 (v1) 和三个文件

文件内容如下

core.bigbird0101 为组目录core和模块的前缀 bigbird0101

go 复制代码
/*
Copyright 2017 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// +k8s:deepcopy-gen=package
// +groupName=core.bigbird0101

// Package v1 is the v1 version of the API.

package v1 // import "bigbird0101/crd-test/pkg/core/v1"
go 复制代码
/*
Copyright 2017 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package v1

import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/runtime/schema"
)

// SchemeGroupVersion is group version used to register these objects
// core为组名称
var SchemeGroupVersion = schema.GroupVersion{Group: "core", Version: "v1"}

// Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) schema.GroupKind {
	return SchemeGroupVersion.WithKind(kind).GroupKind()
}

// Resource takes an unqualified resource and returns a Group qualified GroupResource
func Resource(resource string) schema.GroupResource {
	return SchemeGroupVersion.WithResource(resource).GroupResource()
}

var (
	// SchemeBuilder initializes a scheme builder
	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
	// AddToScheme is a global function that registers this API group & version to a scheme
	AddToScheme = SchemeBuilder.AddToScheme
)

// Adds the list of known types to Scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
	scheme.AddKnownTypes(SchemeGroupVersion,
		&Foo{},
		&FooList{},
	)
	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
	return nil
}

根据自己的需要添加types

go 复制代码
/*
Copyright 2017 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package v1

import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// Foo is a specification for a Foo resource
type Foo struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   FooSpec   `json:"spec"`
	Status FooStatus `json:"status"`
}

// FooSpec is the spec for a Foo resource
type FooSpec struct {
	DeploymentName string `json:"deploymentName"`
	Replicas       *int32 `json:"replicas"`
}

// FooStatus is the status for a Foo resource
type FooStatus struct {
	AvailableReplicas int32 `json:"availableReplicas"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// FooList is a list of Foo resources
type FooList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata"`

	Items []Foo `json:"items"`
}

第五步 执行code-generate 生成命令

shell 复制代码
cd code-generate;
bash generate-groups.sh all bigbird0101/crd-test/pkg/generated bigbird0101/crd-test/pkg/apis core:v1 \
--go-header-file=/code/code-generate/hack/boilerplate.go.txt \
--output-base /code/crd-test

可以看到生成了这个目录 这个目录有我们需要的代码

生成的deepcopy

生成了 clientset 和 informets 和 listers

遇到的坑

  1. doc.go当中的 groupName 和 register.go 中的 group是不一样的,一定要注意 ,
  2. generate-groups 中 的 GroupVersion要与 register.go中的 GroupVersion要保持一致
  3. 目录一样向如下一样 pkg/apis/组名/组版本
相关推荐
程序员爱钓鱼1 小时前
第一个 Go 程序:Hello World
前端·后端·go
spider_xcxc1 小时前
Helm 部署 K8s 集群完整笔记
java·开发语言·kubernetes
名字还没想好☜1 小时前
Go 的 select 实战:超时、非阻塞收发与优雅退出的三个套路
开发语言·数据库·golang·go·并发
张忠琳14 小时前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
Elastic 中国社区官方博客16 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
Java开发追求者18 小时前
Go环境开发配置
go·go环境开发配置·环境开发配置
前端Baymax1 天前
K8s PodCrashLoopBackOff假阳性排查
云原生·容器·kubernetes
spider_xcxc1 天前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
程序员爱钓鱼1 天前
配置 GoLand 与 VS Code 开发环境
前端·后端·go
阿标在干嘛1 天前
从物理机到K8s:政策快报平台的容器化部署实践
云原生·容器·kubernetes