zoukankan      html  css  js  c++  java
  • k8s client-gen

    client-gen

    When we want to operate the kubernetes resources, like the crds that we defined and the related objects we created. We should use some tools to operate these resource.

    For now, most of coder use "code-generator" to generate some related function to help us to operate the objects, like "deepcopy-gen","informer-gen","lister-gen" and so on.

    Step by step to create a clientset for your crd

    1. Create one repo

    For example, I create one repo and I have already put all my necessary components there. The details about how to create a repo please see the mannual of github

    2. Define our client

    In the repo, we can use go.mod to manage our project, and we should install some dependency repo:

     go mod init <your-project-name>
     go get k8s.io/apimachinery
     go get k8s.io/client-go
     go get k8s.io/code-generator
    

    and then we should create some important directories. for my project:

    mkdir -p pkg/apis/nodehealth/v1alpha1 
    cd pkg/apis/nodehealth/v1alpha1 
    

    in /v1alpha1 we put some crd definition files. we create file

    doc.go
    

    in doc.go

    // +k8s:deepcopy-gen=package
    // +groupName=compute.company.com
    
    package v1alpha1
    
    

    create file types.go

    package v1alpha1
    
    import (
    	"time"
    
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    )
    
    // +genclient
    // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
    
    // NodeHealth is a specification for a NodeHealth resource
    type NodeHealth struct {
    	metav1.TypeMeta   `json:",inline"`
    	metav1.ObjectMeta `json:"metadata,omitempty"`
    
    	Spec   NodeHealthSpec   `json:"spec"`
    	Status NodeHealthStatus `json:"status"`
    }
    
    type Ping struct {
    	PingFrequency *int32 `json:"pingFrequency"`
    	PingTimes     *int32 `json:"pingTime"`
    }
    
    // NodeHealthSpec is the spec for a NodeHealth resource
    type NodeHealthSpec struct {
    	Replicas     *int32 `json:"replicas"`
    	NodeName     string `json:"nodeName"`
    	Cluster      string `json:"cluster"`
    	CheckSetting Ping   `json:"ping"`
    }
    
    type NodeStatus struct {
    	LastHealthStatus       string    `json:"lastHealthStatus"`
    	LastCheckTimeStamp     time.Time `json:"lastCheckTimeStamp"`
    	LastHealthyTimeStamp   time.Time `json:"lastHealthyTimeStamp"`
    	LastUnHealthyTimeStamp time.Time `json:"lastUnHealthyTimeStamp"`
    }
    
    // NodeHealthStatus is the status for a NodeHealth resource
    type NodeHealthStatus struct {
    	AvailableReplicas int32        `json:"availableReplicas"`
    	HealthStatus      []NodeStatus `json:"healthStatus"`
    }
    
    // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
    
    // NodeHealthList is a list of NodeHealth resources
    type NodeHealthList struct {
    	metav1.TypeMeta `json:",inline"`
    	metav1.ListMeta `json:"metadata"`
    
    	Items []NodeHealth `json:"items"`
    }
    
    

    3. create a vendor to store the code-generator codes

    1. we should create a vendor dir
    go mod vendor
    
    1. in the root of the project, make all the code in vendor readable
    chmod -R 777 vendor
    

    4. create code-gen scripts:

    mkdir hack && cd hack
    

    create tool.go

    // +build tools
    
    /*
    Copyright 2019 The Kubernetes Authors.
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    */
    
    // This package imports things required by build scripts, to force `go mod` to see them as dependencies
    package tools
    
    import _ "k8s.io/code-generator"
    

    and create code-gen script: "update-codegen.sh"

    #!/usr/bin/env bash
    
    set -o errexit
    set -o nounset
    set -o pipefail
    
    package_path="/Users/yuanmh/Desktop/code/k8s-crds-clientsets"
    
    
    ../vendor/k8s.io/code-generator/generate-groups.sh "deepcopy,client,informer,lister" 
    ../pkg/client 
    ../pkg/apis 
      nodehealth:v1alpha1 
      --go-header-file ../hack/boilerplate.go.txt
    
    

    code-generator hase some commands options. If you want to know more about it, you can go to the doc. To be honest, the doc sucks!!! I cannot get any useful information there. I have encountered many problems, and found the way by myself.

    5. execute the script to create lister, informer and deepcopy funcs

    cd hack
    ./update-codegen.sh    
    Generating deepcopy funcs
    Generating clientset for nodehealth:v1alpha1 at ../pkg/client/clientset
    Generating listers for nodehealth:v1alpha1 at ../pkg/client/listers
    Generating informers for nodehealth:v1alpha1 at ../pkg/client/informers
    

    We can see that the funcs have been created succesfully in the directories.

    OK, that's all about generate crd's clients, next we will discover how to use these clients, informers, listers to operate our crds.

    https://blog.openshift.com/kubernetes-deep-dive-code-generation-customresources/
    git: https://github.com/kubernetes/code-generator

    斯是陋室惟汝德馨!欢迎来访!
  • 相关阅读:
    【转】Dalvik虚拟机的启动过程分析
    【转】Android 之ActivityThead、ActivityManagerService 与activity的管理和创建
    【转】应用程序的入口是ActivityThread
    【转】Android中Application类用法
    【转】360浏览器极速与兼容模式的解释
    操作系统学习(七)--操作系统之外设显示器和键盘
    操作系统学习(六)-- 虚拟内存(页面置换算法)
    操作系统学习(五)-- 操作系统之内存管理
    操作系统学习(四)-- 操作系统之进程同步和死锁
    数据库系统学习(八)-SQL语言与数据库完整性和安全性
  • 原文地址:https://www.cnblogs.com/yuanmh/p/15100987.html
Copyright © 2011-2022 走看看