When we want to operate the kubernetes resources, like the crds that we defined and the related objects we created. We should use some tools to operate these resource.
For now, most of coder use "code-generator" to generate some related function to help us to operate the objects, like "deepcopy-gen","informer-gen","lister-gen" and so on.
For example, I create one repo and I have already put all my necessary components there. The details about how to create a repo please see the mannual of github
In the repo, we can use go.mod to manage our project, and we should install some dependency repo:
go mod init <your-project-name>
go get k8s.io/apimachinery
go get k8s.io/client-go
go get k8s.io/code-generator
and then we should create some important directories. for my project:
mkdir -p pkg/apis/nodehealth/v1alpha1
cd pkg/apis/nodehealth/v1alpha1
in /v1alpha1 we put some crd definition files. we create file
doc.go
in doc.go
// +k8s:deepcopy-gen=package
// +groupName=compute.company.com
package v1alpha1
create file types.go
package v1alpha1
import (
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// NodeHealth is a specification for a NodeHealth resource
type NodeHealth struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec NodeHealthSpec `json:"spec"`
Status NodeHealthStatus `json:"status"`
}
type Ping struct {
PingFrequency *int32 `json:"pingFrequency"`
PingTimes *int32 `json:"pingTime"`
}
// NodeHealthSpec is the spec for a NodeHealth resource
type NodeHealthSpec struct {
Replicas *int32 `json:"replicas"`
NodeName string `json:"nodeName"`
Cluster string `json:"cluster"`
CheckSetting Ping `json:"ping"`
}
type NodeStatus struct {
LastHealthStatus string `json:"lastHealthStatus"`
LastCheckTimeStamp time.Time `json:"lastCheckTimeStamp"`
LastHealthyTimeStamp time.Time `json:"lastHealthyTimeStamp"`
LastUnHealthyTimeStamp time.Time `json:"lastUnHealthyTimeStamp"`
}
// NodeHealthStatus is the status for a NodeHealth resource
type NodeHealthStatus struct {
AvailableReplicas int32 `json:"availableReplicas"`
HealthStatus []NodeStatus `json:"healthStatus"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// NodeHealthList is a list of NodeHealth resources
type NodeHealthList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata"`
Items []NodeHealth `json:"items"`
}
go mod vendor
chmod -R 777 vendor
mkdir hack && cd hack
create tool.go
// +build tools
/*
Copyright 2019 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.
*/
// This package imports things required by build scripts, to force `go mod` to see them as dependencies
package tools
import _ "k8s.io/code-generator"
and create code-gen script: "update-codegen.sh"
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
package_path="/Users/yuanmh/Desktop/code/k8s-crds-clientsets"
../vendor/k8s.io/code-generator/generate-groups.sh "deepcopy,client,informer,lister" ../pkg/client ../pkg/apis nodehealth:v1alpha1 --go-header-file ../hack/boilerplate.go.txt
code-generator hase some commands options. If you want to know more about it, you can go to the doc. To be honest, the doc sucks!!! I cannot get any useful information there. I have encountered many problems, and found the way by myself.
cd hack
./update-codegen.sh
Generating deepcopy funcs
Generating clientset for nodehealth:v1alpha1 at ../pkg/client/clientset
Generating listers for nodehealth:v1alpha1 at ../pkg/client/listers
Generating informers for nodehealth:v1alpha1 at ../pkg/client/informers
We can see that the funcs have been created succesfully in the directories.
OK, that‘s all about generate crd‘s clients, next we will discover how to use these clients, informers, listers to operate our crds.
https://blog.openshift.com/kubernetes-deep-dive-code-generation-customresources/
git: https://github.com/kubernetes/code-generator
原文:https://www.cnblogs.com/yuanmh/p/15100987.html