zoukankan      html  css  js  c++  java
  • kubebuilder用途及用法示例

    kubebuilder用来自定义k8s 资源类型,例如GuestBook类型(和deployment、ingress等资源类似),用只需要简单的命令,和框架化的代码填充即可完成自定资源的定义。kubebuilder还可以控制该资源类型的创建、删除等操作的脚手架工程。这里的控制不是指用户使用kubectl create/delete来控制资源创建和删除的意思,而是用来动态显示资源状态的。例如deployment资源类型,如果是多副本的话,就需要创建多个副本,并感知目前创建了几个副本。如果某个副本异常退出还需要创建新的副本来顶替上。同样,如果副本数被用户调小,则需要删除一些副本。首先,上一张kubebuilder的架构图:

    从上图可以看出controller是Kubernetes和任何其他operator的核心。控制器的任务是确保任何给定对象的实际状态(包括集群状态和可能的外部状态,如Kubelet的运行容器或云提供商的负载平衡器)与对象中的期望状态相匹配。每个控制器关注一个根类型,但可能与其他类型交互。这个过程称之为reconciling. 在控制器运行时中,为特定类型实现协调的逻辑称为Reconciler.在xxx_controller.go文件中,我们可以看到Reconcile函数,你可以在里面添加客制化代码。

    webhook是修改请求和验证请求的,如果通过不了验证一般情况下报错返回。

    kubebuilder安装

    到https://github.com/kubernetes-sigs/kubebuilder/releases 页面下载合适的release二进制kubebuilder版本
    chmod +x kubebuilder && mv kubebuilder /usr/local/bin/

    创建API

    下面以创建一个myingress资源为例,这个工程的工作目录为/root/share/hello/src/github.com/world
    mkdir /root/share/hello/src/github.com/world -p
    export GOPATH=/root/share/hello/
    export GOPROXY=https://goproxy.cn
    cd /root/share/hello/src/github.com/world

    kubebuilder init --domain my.domain //这一步可能要等一会
    // 默认namespaced为true
    kubebuilder create api --group net --version v1 --kind MyIngress
    // 如果需要修改namespace为cluster,可以使用下面的命令强制更新DpvsIngress API 定义
    kubebuilder create api --group net --version v1 --kind MyIngress --namespaced=false --force
    这是去api目录下找到xxx_types.go文件,添加客制化属性。

    添加客制化定义

    一般在xxx_types.go 中的添加一些spec属性,举例如下所示:

    type WorldSpec struct {
    	// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
    	// Important: Run "make" to regenerate code after modifying this file
    
    	// Foo is an example field of DpvsIngress. Edit world_types.go to remove/update
    	Foo string `json:"foo,omitempty"`
    
    	Selector *metav1.LabelSelector `json:"selector,omitempty"`
    	Servers []Servers  `json:"servers"`
    }
    
    type Servers struct {
    	Servers []VIPInfo `json:"vipInfo,omitempty"`
    }
    
    type VIPInfo struct {
    	VIP        string   `json:"vip"`
    	Database   Databaseinfo   `json:"database"`
    }
    
    type Databaseinfo   struct {
    	name string `json:"name "`
    	ip string `json:"ip "`
    }
    

    然后执行以下命令:
    make manifests
    make install #期间报错少了什么组件就安装什么组件
    make run

    这个步骤报错及解决方法如下:
    (1) "invalid configuration: no configuration has been provided, try setting KUBERNETES_MASTER environment variable"
    可以通过export KUBECONFIG=/xxx/xxx设置kubeconfig文件来解决,但是当修改了api/v1下面的代码需要重新make时,可能需要unset该变量否则无法make install

    (2)"metrics server failed to listen. You may want to disable the metrics server or use another port if it is due to conflicts {"error": "error listening on :8080: listen tcp :8080: bind: address already in use"}"
    修改当前目录下的main.go 中 flag.StringVar(&metricsAddr, "metrics-bind-address", ":8090", "The address the metric endpoint binds to.") 语句的监听端口为本机未占用端口
    然后这个main函数就运行起来了,看了似乎是个daemon程序。
    修改后再次执行make install,会在config/crd/bases/目录下生成资源类型YAML文件,并自动更新该资源类型。然后使用如下yaml文件创建一个资源实例:

    apiVersion: my.domain/v1
    kind: World
    metadata:
      name: world-sample
    spec:
      # TODO(user): Add fields here
      selector:
        matchLabels:
          tag: abc
      servers:
        - vipInfo:
            - vip: "172.0.0.254"
              database:
                name: "zone1"
                ip: "192.168.1.1"
        - vipInfo:
            - vip: "172.0.0.253"
              database:
                name: "zone2"
                ip: "192.168.1.2"
    

    自定义资源类似的删除

    删除自定义资源类型前,先把资源实例删掉。然后再用yaml资源定义文件删除资源类型,如果找不到资源类型文件则可以直接到etcd搜索关键字再删除。
    另外,利用kubebuilder生成的CRD YAML创建客制化资源时,有时不会马上生效,可以等一会就可以创建该资源实例了。

    参考

  • 相关阅读:
    互联网协议入门详解(转)
    文件流结尾的EOF详解
    数字签名是什么?
    SSL/TLS协议运行机制的概述(转)
    图解SSL/TLS协议(转)
    RSA算法原理(转)
    HTML代码简写法:Emmet和Haml(转)
    HTML Email 编写指南(转)
    PHP CodeBase: 判断用户是否手机访问
    Spring Data JPA之Derived query
  • 原文地址:https://www.cnblogs.com/janeysj/p/15572991.html
Copyright © 2011-2022 走看看