码迷,mamicode.com
首页 > 其他好文 > 详细

k8s创建自定义资源

时间:2020-01-22 14:36:17      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:api   $path   close   pac   inline   enc   否则   控制器   network   

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

k8s创建自定义资源

标签:api   $path   close   pac   inline   enc   否则   控制器   network   

原文地址:https://www.cnblogs.com/yxh168/p/12221508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!