自定義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
先切換目錄,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 查看
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í)行
定義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: "
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)知識。