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