真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

自定義K8SCDR的利器kubebuilder怎么用

自定義K8S CDR的利器kubebuilder怎么用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

創(chuàng)新互聯(lián)公司擁有10多年的建站服務經(jīng)驗,在此期間,我們發(fā)現(xiàn)較多的客戶在挑選建站服務商前都非常的猶豫。主要問題集中:在無法預知自己的網(wǎng)站呈現(xiàn)的效果是什么樣的?也無法判斷選擇的服務商設計出來的網(wǎng)頁效果自己是否會滿意?創(chuàng)新互聯(lián)公司業(yè)務涵蓋了互聯(lián)網(wǎng)平臺網(wǎng)站建設、移動平臺網(wǎng)站制作、網(wǎng)絡推廣、按需網(wǎng)站建設等服務。創(chuàng)新互聯(lián)公司網(wǎng)站開發(fā)公司本著不拘一格的網(wǎng)站視覺設計和網(wǎng)站開發(fā)技術(shù)相結(jié)合,為企業(yè)做網(wǎng)站提供成熟的網(wǎng)站設計方案。

概述

用于在Go中快速構(gòu)建和發(fā)布Kubernetes API的SDK 它建立在用于構(gòu)建核心Kubernetes API的規(guī)范技術(shù)之上,以提供簡化的抽象來減少開發(fā)工作。 

項目:

  • chaos-mesh:一個Pingcap 基于 kubebuilder 開發(fā)的 chaos 項目,代碼量不大 & 比較簡明,工具也很實用 [傳送門]

  • kube-service:一個阿里同學的作品(看著像小玩具,不了解是否實用了),作為CRD的學習例子很不錯 [傳送門]

功能

  • 使用包括基本結(jié)構(gòu)的項目初始化

    • 在規(guī)范版本中獲取包依賴性。

    • 主程序入口點

    • 用于格式化,生成,測試和構(gòu)建的Makefile

    • 用于構(gòu)建容器映像的Dockerfile

  • 腳手架API

    • 資源(模型)定義

    • 控制器實現(xiàn)

    • 資源和控制器的集成測試

    • CRD定義

  • 用于實現(xiàn)API的簡單抽象

    • Controllers

    • Resource Schema Validation

    • Validating Webhooks

  • 用于發(fā)布API以安裝到集群中的工件

    • Namespace

    • CRDs

    • RBAC Roles and RoleBindings

    • Controller StatefulSet + Service

  • API參考文檔和示例

運行流程

client-go給的一個workQueue的例子

  • 把代碼分為通用的Common part和Special Part

    • 前者是client-go的基本流程

    • 后者部分是controller自身邏輯部分

安裝和使用

安裝

源碼安裝

git clone https://github.com/kubernetes-sigs/kubebuilder
cd kubebuilder
make build
cp bin/kubebuilder $GOPATH/bin

二進制安裝

os=$(go env GOOS)
arch=$(go env GOARCH)

# download kubebuilder and extract it to tmp
curl -sL https://go.kubebuilder.io/dl/2.0.0-beta.0/${os}/${arch} | tar -xz -C /tmp/

# extract the archive
sudo mv /tmp/kubebuilder_2.0.0-beta.0_${os}_${arch} /usr/local/kubebuilder

# update your PATH to include /usr/local/kubebuilder/bin
export PATH=$PATH:/usr/local/kubebuilder/bin

輔助工具 kustomize

go install sigs.k8s.io/kustomize

使用

創(chuàng)建新API

先切換目錄,kubebuilder 這點不好,不自動創(chuàng)建一個專用目錄

mkdir -p $GOPATH/src/github.com/crdAPIDemo/
cd $GOPATH/src/github.com/crdAPIDemo/

初始化項目目錄

export GO111MODULE="on"
export GOPROXY=https://goproxy.cn
kubebuilder init --domain k8s.io --license apache2 --owner "The Kubernetes Authors"

API創(chuàng)建

  • 創(chuàng)建一個名為Sloop的新API

kubebuilder create api --group ships --version v1beta1 --kind Sloop

運行

make install & make run

啟動一個實例

  • config/samples 下有示例配置可用

kubectl apply -f config/samples/ships_v1beta1_sloop.yaml

可通過
    kubectl get crd
查看
執(zhí)行的內(nèi)容
  • yaml內(nèi)容

apiVersion: ships.k8s.io/v1beta1
kind: Sloop
metadata:
  name: sloop-sample
spec:
  # Add fields here
  foo: bar

僅將yaml存入etcd controller監(jiān)聽到事件時,沒有做任何動作

  • 部署 controller

make docker-build docker-push IMG=fanux/ships-controller    // 執(zhí)行總失敗,提示有g(shù)it拉取不到
make deploy  // 但忽略上一步的失敗,本操作可以執(zhí)行

開發(fā)

開發(fā)

  • 定義Spec對象(api/v1beta1/sloop_types.go) 增加配置項

type SloopSpec 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 Sloop. Edit Sloop_types.go to remove/update
	Foo string `json:"foo,omitempty"`
    
    // 新增字段加在這里...
    Cpu string `json:"cpu,omitempty"`
    Memory string `json:"memory,omitempty"`
}
  • 編輯原yaml文件內(nèi)容(config/samples/ships_v1beta1_sloop.yaml ) 為Spec對象,提供具體配置的值

apiVersion: ships.k8s.io/v1beta1
kind: Sloop
metadata:
  name: sloop-sample
spec:
  # Add fields here
  foo: bar
  
  cpu: "1"              // 增加內(nèi)容
  memory: "500M"        // 增加內(nèi)容

生效

kubectl apply -f config/samples/

查看

kubectl get Sloop.ships.k8s.io -o yaml

// 輸出:新的CRD定義內(nèi)容
apiVersion: v1
items:
- apiVersion: ships.k8s.io/v1beta1
  kind: Sloop
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"ships.k8s.io/v1beta1","kind":"Sloop","metadata":{"annotations":{},"name":"sloop-sample","namespace":"default"},"spec":{"cpu":"1","foo":"bar","memory":"500M"}}
    creationTimestamp: "2020-01-19T09:07:41Z"
    generation: 2
    name: sloop-sample
    namespace: default
    resourceVersion: "150773"
    selfLink: /apis/ships.k8s.io/v1beta1/namespaces/default/sloops/sloop-sample
    uid: 6a715921-86af-4dae-b25d-be193d64c4b2
  spec: 
    cpu: "1"                //變化內(nèi)容,已生效
    foo: bar        
    memory: 500M            //變化內(nèi)容,已生效
kind: List
metadata:
  resourceVersion: ""
  selfLink: "

Reconcile 唯一需要實現(xiàn)的接口

作用

  • CRD只是定義資源,controller才是實現(xiàn)

    • controller把輪訓與事件監(jiān)聽都封裝在這一個接口里了.你不需要關(guān)心怎么事件監(jiān)聽的

  • controller內(nèi)部

    • CURD及其他邏輯,都由Reconcile()來做分發(fā)

代碼示例

(controllers/sloop_controller.go)

  • 原內(nèi)容

package controllers

import (
        "context"
        "github.com/go-logr/logr"
        "k8s.io/apimachinery/pkg/runtime"
        ctrl "sigs.k8s.io/controller-runtime"
        "sigs.k8s.io/controller-runtime/pkg/client"
        shipsv1beta1 "github.com/crdAPIDemo/api/v1beta1"
)

// SloopReconciler reconciles a Sloop object
type SloopReconciler struct {
        client.Client
        Log    logr.Logger
        Scheme *runtime.Scheme
}

// +kubebuilder:rbac:groups=ships.k8s.io,resources=sloops,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=ships.k8s.io,resources=sloops/status,verbs=get;update;patch
func (r *SloopReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
        _ = context.Background()
        _ = r.Log.WithValues("sloop", req.NamespacedName)

        return ctrl.Result{}, nil
}

func (r *SloopReconciler) SetupWithManager(mgr ctrl.Manager) error {
        return ctrl.NewControllerManagedBy(mgr).
                For(&shipsv1beta1.Sloop{}).
                Complete(r)
}
  • 修改為

package controllers

import (
        "context"
        "fmt"
        "github.com/go-logr/logr"
        "k8s.io/apimachinery/pkg/runtime"
        ctrl "sigs.k8s.io/controller-runtime"
        "sigs.k8s.io/controller-runtime/pkg/client"
        shipsv1beta1 "github.com/crdAPIDemo/api/v1beta1"
)

// SloopReconciler reconciles a Sloop object
type SloopReconciler struct {
        client.Client
        Log    logr.Logger
        Scheme *runtime.Scheme
}

// +kubebuilder:rbac:groups=ships.k8s.io,resources=sloops,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=ships.k8s.io,resources=sloops/status,verbs=get;update;patch
func (r *SloopReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
        ctx := context.Background()
        log := r.Log.WithValues("sloop", req.NamespacedName)

        // your logic here
        vm := &shipsv1beta1.Sloop{}
        if err := r.Get(ctx, req.NamespacedName, vm); err != nil {
                log.Info("unable to fetch vm : %v", err)
        } else {
                fmt.Println("INFO:", vm.Spec.CPU, vm.Spec.Memory)
        }

        return ctrl.Result{}, nil
}

func (r *SloopReconciler) SetupWithManager(mgr ctrl.Manager) error {
        return ctrl.NewControllerManagedBy(mgr).
                For(&shipsv1beta1.Sloop{}).
                Complete(r)
}
  • 編譯和使用

make; make install; make run

kubectl apply -f config/samples   // 會打印出日志

關(guān)于自定義K8S CDR的利器kubebuilder怎么用問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。


本文題目:自定義K8SCDR的利器kubebuilder怎么用
標題路徑:http://weahome.cn/article/gigocd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部