zoukankan      html  css  js  c++  java
  • 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

         使用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
    资源类定义(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

  • 相关阅读:
    MySQL 5.6 中 TIMESTAMP 的变化
    NetWork
    Esper
    maven nexus linux私服搭建
    file not found app文件
    设计模式之十五:訪问者模式(Visitor Pattern)
    邻接表 几篇不错的解说
    自己定义带三角形箭头的TextView
    linux程序调试命令addr2line之入门简单介绍(本文先不聊gdb调试)
    AndroidManifest 中android:exported
  • 原文地址:https://www.cnblogs.com/yxh168/p/12221508.html
Copyright © 2011-2022 走看看