CRD制作步驟
1.在GOPATH/src創建一個項目根目錄 以mynet項目為示例
2.在根目錄/apis/api組名 目錄下創建一個register.go用來放置全局變量 API組名是myapi API版本是v1

package mynet const ( GroupName="mynet.k8s.io" Version = "v1" )
3.創建API版本目錄 在mynet/apis/api組名/v1(版本) 目錄下創建一個doc.go用來生成注釋

// +k8s:deepcopy-gen=package // +groupName=mynet.k8s.io package v1
4.在根目錄/apis/api組名/v1(版本) 目錄下創建一個types.go用來定義資源類型字段

package v1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // +genclient // +genclient:noStatus // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type Network struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec Networkspec `json:"spec"` } type Networkspec struct { Cidr string `json:"cidr"` Gateway string `json:"gateway"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type NetworkList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata"` Items []Network `json:"items"` }
5.在根目錄/apis/api組名/v1(版本) 目錄下創建一個register.go用來注冊客戶端

package v1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "mynet/apis/myapi" ) var SchemeGroupVersion = schema.GroupVersion{ Group: myapi.GroupName, Version: myapi.Version, } var ( SchemeBuilder = runtime.NewSchemeBuilder(addknownTypes) AddToScheme = SchemeBuilder.AddToScheme ) func Resource(resource string) schema.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } func kind(kind string) schema.GroupKind { return SchemeGroupVersion.WithKind(kind).GroupKind() } func addKnowTypes(scheme *runtime.Scheme) error { scheme.AddKnowTypes( SchemeGroupVersion, &Network{}, &NetworkList{}, ) metav1.AddToGroupVersion(scheme,SchemeGroupVersion) return nil }
6.使用code-generator生成client代碼
./generate-groups.sh all mynet/apis/myapi/client mynet/apis myapi:v1
使用code-generator項目要注意它本身的版本問題 版本過高或者過低生成的clientset在后面執行build的時候都會提示異常 無法生成可執行文件
https://github.com/kubernetes/code-generator/releases 在這個地址中手動選擇合適版本. go get 安裝的是最新版本
7.創建自定義crd 自定義資源 相當於資源類

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: networks.mynet.k8s.io
spec:
group: mynet.k8s.io
version: v1
names:
kind: Network
plural: networks
scope: Namespaced
創建類成功
8.創建自定義的網絡實例根據自定義crd來實例化資源對象

apiVersion: mynet.k8s.io/v1 kind: Network metadata: name: net1 spec: cidr: "192.168.0.0/16" gateway: "192.168.0.1"
創建自定義API對象成功
到這一步還是僅僅可以添加自定義的API對象 還得為這個API對象編寫一個自定義控制器 只有創建一個對應的自定義控制器才能監聽API對象的增刪改查操作
觸發自己的業務邏輯處理代碼 這里就是聲明式API和命令式API的區別
自定義控制器的創建
1.編譯環境 go的版本必須為v1.13 否則構建會出現失敗

wget https://studygolang.com/dl/golang/go1.13.linux-amd64.tar.gz tar -xzvf go1.13.linux-amd64.tar.gz vi /etc/profile export GOROOT=/root/go export PATH=$PATH:/root/go/bin export GOPATH=$HOME/gopath https://github.com/yxh1990/sample-controller 基於此項目進行自定義代碼開發 go get -d k8s.io/sample-controller cd $GOPATH/src/k8s.io/sample-controller /root/gopath/bin/godep restore 執行此命令會有一個錯誤但是可以忽略不計 繼續執行下一條指令 go build -o sample-controller .
go版本較低會造成語法異常
執行 restore的時候 此處的錯誤可以忽略 因為我們並沒有使用到此模塊
編譯成功后 會在當前目錄下生成一個可執行的二進制文件sample-controller