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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM