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

  • 相关阅读:
    codeforces C. Fixing Typos 解题报告
    codeforces B. The Fibonacci Segment 解题报告
    codeforces B. Color the Fence 解题报告
    codeforces B. Petya and Staircases 解题报告
    codeforces A. Sereja and Bottles 解题报告
    codeforces B. Levko and Permutation 解题报告
    codeforces B.Fence 解题报告
    tmp
    API 设计 POSIX File API
    分布式跟踪的一个流行标准是OpenTracing API,该标准的一个流行实现是Jaeger项目。
  • 原文地址:https://www.cnblogs.com/yxh168/p/12221508.html
Copyright © 2011-2022 走看看