k8s创建自定义资源

CRD制作步骤

    1.在GOPATH/src创建一个项目根目录   以mynet项目为示例

      

   2.在根目录/apis/api组名 目录下创建一个register.go用来放置全局变量     API组名是myapi        API版本是v1

    

package mynet

const (
  GroupName="mynet.k8s.io"
  Version = "v1"
)
API组下register.go

    3.创建API版本目录 在mynet/apis/api组名/v1(版本) 目录下创建一个doc.go用来生成注释

   

// +k8s:deepcopy-gen=package

// +groupName=mynet.k8s.io
package v1
doc.go

  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"`
}
types.go

  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
}
register.go

  6.使用code-generator生成client代码

    ./generate-groups.sh all mynet/apis/myapi/client mynet/apis myapi:v1

   

 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
资源类定义(network.yaml)

   创建类成功

 

   8.创建自定义的网络实例根据自定义crd来实例化资源对象

apiVersion: mynet.k8s.io/v1
kind: Network
metadata:
  name: net1
spec:
  cidr: "192.168.0.0/16"
  gateway: "192.168.0.1"                        
net1.yaml

 创建自定义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

猜你喜欢

转载自www.cnblogs.com/yxh168/p/12221508.html