主要參考項目 https://github.com/kubernetes/code-generatorgit
1. git clone https://github.com/kubernetes/code-generatorgithub
2. 建立本身的項目例如 k8s-controller-exampleexpress
3. 複製 code-generator 項目的vendor, hack 目錄到本身的項目下apache
4. 建立doc.go types.go 文件json
保持這個目錄結構api
其中 pkg/apis是固定的 bash
controllerexample是groupnameapp
v1alpha1 是 versionless
doc.go types.go register.go 都是本身寫的ide
doc.go
// +k8s:deepcopy-gen=package // +groupName=controllerexample.github.com package v1alpha1
types.go
package v1alpha1 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 App struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec AppSpec `json:"spec"` Status AppStatus `json:"status"` } // FooSpec is the spec for a Foo resource type AppSpec struct { DeploymentName string `json:"deploymentName"` Replicas *int32 `json:"replicas"` } // FooStatus is the status for a Foo resource type AppStatus struct { AvailableReplicas int32 `json:"availableReplicas"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // FooList is a list of Foo resources type AppList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata"` Items []App `json:"items"` }
code-generator 經過一些特殊註釋來生成代碼
// +k8s:deepcopy-gen=package // +groupName=controllerexample.github.com
doc.go的註釋放在了package上 這是全局註釋,針對這個package , 注意把這些註釋的先後都加上空行
+k8s:deepcopy-gen=package 爲這個package下的全部type生成deepcopy方法
+groupName=controllerexample.github.com 針對本身的groupname來修改 要對應到實際建立的目錄名稱
5. 修改 hack/update-codegen.sh 文件
#!/usr/bin/env bash # 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. set -o errexit set -o nounset set -o pipefail SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/.. CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo ../code-generator)} # generate the code with: # --output-base because this script should also be able to run inside the vendor dir of # k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir # instead of the $GOPATH directly. For normal projects this can be dropped. ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ github.com/xuchenCN/k8s-controller-example/pkg/client github.com/xuchenCN/k8s-controller-example/pkg/apis \ controllerexample:v1alpha1 \ --output-base "$GOPATH/src" \ --go-header-file ${SCRIPT_ROOT}/hack/boilerplate.go.txt # To use your own boilerplate text use: # --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt
v1alpha1.register.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 v1alpha1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" samplecontroller "github.com/xuchenCN/k8s-controller-example/pkg/apis/controllerexample" ) // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = schema.GroupVersion{Group: samplecontroller.GroupName, Version: "v1alpha1"} // 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 = runtime.NewSchemeBuilder(addKnownTypes) AddToScheme = SchemeBuilder.AddToScheme ) // Adds the list of known types to Scheme. func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &App{}, &AppList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil }
controllerexample.register.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 controllerexample const ( GroupName = "controllerexample.github.com" )
6. 執行./hack/update-codegen.sh