成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇帶給你KubeBuilder 簡(jiǎn)明教程

開(kāi)源
這篇文章主要講解了 kubebuilder的安裝使用方式,以及涉及到的一些簡(jiǎn)單的概念,項(xiàng)目目錄結(jié)構(gòu)的說(shuō)明.

[[398025]]

Operator 概述

Operator 是 Kubernetes 的擴(kuò)展軟件,它利用 定制資源 管理應(yīng)用及其組件。Operator 遵循 Kubernetes 的理念,特別是在控制器 方面[^1]

k8s 的是一個(gè)高度自動(dòng)化的系統(tǒng),其中涵蓋了常見(jiàn)應(yīng)用程序所需的大部分功能,例如服務(wù)發(fā)現(xiàn),負(fù)載均衡,HPA等等,這些功能是由 k8s 自帶的一些控制器實(shí)現(xiàn)的,但是需求總是永無(wú)止境的,當(dāng)我們有類似需求但是 k8s 又無(wú)法很好的滿足的時(shí)候我們就可以使用 Operator 和 Custome Resource(自定義資源)來(lái)達(dá)到類似的效果。

例如常見(jiàn)的需求就有部署一個(gè)數(shù)據(jù)庫(kù),節(jié)點(diǎn)自動(dòng)化運(yùn)維,日志采集組件配置等等

從 Operator 理念的提出到現(xiàn)在已經(jīng)有了很多工具可以幫助我們快速低成本的開(kāi)發(fā),其中最常用的就是 CoreOS 開(kāi)源的 operator-sdk[^3]和 k8s sig 小組維護(hù)的 kubebuilder[^2],我們這個(gè)系列選用 kubebuilder。

開(kāi)始之前我們先了解兩個(gè)馬上就會(huì)涉及到的核心概念

GV & GVK & GVR

GV: Api Group & Version

  • API Group 是相關(guān) API 功能的集合
  • 每個(gè) Group 擁有一或多個(gè) Versions

GVK: Group Version Kind

  • 每個(gè) GV 都包含 N 個(gè) api 類型,稱之為 Kinds,不同 Version 同一個(gè) Kinds 可能不同

GVR: Group Version Resource

  • Resource 是 Kind 的對(duì)象標(biāo)識(shí),一般來(lái) Kind 和 Resource 是 1:1 的,但是有時(shí)候存在 1:n 的關(guān)系,不過(guò)對(duì)于 Operator 來(lái)說(shuō)都是 1:1 的關(guān)系

舉個(gè)🌰,我們?cè)?k8s 中的 yaml 文件都有下面這么兩行,例如上篇文章我們部署的 nginx deployment

  1. apiVersion: apps/v1 # 這個(gè)是 GV,G 是 apps,V 是 v1 
  2. kind: Deployment    # 這個(gè)就是 Kind 
  3. sepc:               # 加上下放的 spec 就是 Resource了 
  4.   ... 

根據(jù) GVK K8s 就能找到你到底要?jiǎng)?chuàng)建什么類型的資源,根據(jù)你定義的 Spec 創(chuàng)建好資源之后就成為了 Resource,也就是 GVR。GVK/GVR 就是 K8s 資源的坐標(biāo),是我們創(chuàng)建/刪除/修改/讀取資源的基礎(chǔ)[^4]。

KubeBuilder 簡(jiǎn)明教程

安裝

訪問(wèn)官方倉(cāng)庫(kù)下載已經(jīng)編譯好的二進(jìn)制文件: Releases · kubernetes-sigs/kubebuilder (github.com)

  • 本文編寫的時(shí)候 kubebuilder 已經(jīng)推出了 v3.0.0-rc.0 版本,所以為了避免剛寫完新版就已經(jīng) release 了的尷尬情況,本文直接使用的是 3.0 版本
  • 下載好了之后記得將對(duì)應(yīng)文件加入 PATH 當(dāng)中

安裝成功之后使用 kubebuilder version 可以查看安裝的版本信息

  1. ❯ kubebuilder version 
  2. Version: main.version{KubeBuilderVersion:"3.0.0-rc.0", KubernetesVendor:"1.19.2", GitCommit:"90fe4124c4c6965c6bfac63339888956952cda90", BuildDate:"2021-04-08T17:36:28Z", GoOs:"linux", GoArch:"amd64"

項(xiàng)目初始化

先創(chuàng)建一個(gè)空文件夾,然后在文件夾內(nèi)執(zhí)行下方命令

  1. kubebuilder init --domain lailin.xyz --repo github.com/mohuishou/blog-code/k8s-operator/02-kubebuilder 
  • –-domain lailin.xyz 我們的項(xiàng)目的域名
  • --repo xxx 是倉(cāng)庫(kù)地址,同時(shí)也是 go mode中的repo地址

如果你 golang 版本過(guò)低或者過(guò)高都有可能出現(xiàn)下方的錯(cuò)誤信息,我這里是因?yàn)槭褂玫?1.16 版本太高了

  1. 2021/04/25 20:47:14 failed to initialize project: unable to run pre-scaffold tasks of "base.go.kubebuilder.io/v3": go version 'go1.16' is incompatible because 'requires 1.13 <= version < 1.16'. You can skip this check using the --skip-go-version-check flag 

這種情況下可以添加 --skip-go-version-check 忽略這個(gè)錯(cuò)誤,但是還是建議使用官方推薦的版本

  1. kubebuilder init --domain lailin.xyz --repo github.com/mohuishou/blog-code/k8s-operator/02-kubebuilder --skip-go-version-check 

項(xiàng)目目錄

  1. ├── Dockerfile 
  2. ├── Makefile # 這里定義了很多腳本命令,例如運(yùn)行測(cè)試,開(kāi)始執(zhí)行等 
  3. ├── PROJECT  # 這里是 kubebuilder 的一些元數(shù)據(jù)信息 
  4. ├── config 
  5. │   ├── default    # 一些默認(rèn)配置 
  6. │   ├── manager    # 部署 crd 所需的 yaml 
  7. │   ├── prometheus # 監(jiān)控指標(biāo)數(shù)據(jù)采集配置 
  8. │   └── rbac # 部署所需的 rbac 授權(quán) yaml 
  9. ├── go.mod 
  10. ├── go.sum 
  11. ├── hack 
  12. │   └── boilerplate.go.txt 
  13. └── main.go 

創(chuàng)建 api

  1. kubebuilder create api --group apps --version v1 --kind Application 

執(zhí)行之后我們可以發(fā)現(xiàn)項(xiàng)目結(jié)構(gòu)發(fā)生了一些變化

  1. ├── api 
  2. │   └── v1 
  3. │       ├── application_types.go # 這里是定義 spec 的地方 
  4. │       ├── groupversion_info.go # GV 的定義,一般無(wú)需修改 
  5. │       └── zz_generated.deepcopy.go 
  6. ├── config 
  7. │   ├── crd # 自動(dòng)生成的 crd 文件,不用修改這里,只需要修改了 v1 中的 go 文件之后執(zhí)行 make generate 即可 
  8. │   ├── default 
  9. │   ├── manager 
  10. │   ├── prometheus 
  11. │   ├── rbac 
  12. │   └── samples # 這里是 crd 示例文件,可以用來(lái)部署到集群當(dāng)中 
  13. ├── controllers 
  14. │   ├── application_controller.go # 在這里實(shí)現(xiàn) controller 的邏輯 
  15. │   └── suite_test.go # 這里寫測(cè)試 

實(shí)現(xiàn) Controller

定義 CR

  1. // api/v1/application_types.go 
  2.  
  3. // ApplicationSpec defines the desired state of Application 
  4. type ApplicationSpec struct { 
  5.  // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster 
  6.  // Important: Run "make" to regenerate code after modifying this file 
  7.  
  8.  // Product 該應(yīng)用所屬的產(chǎn)品 
  9.  Product string `json:"product,omitempty"

修改之后我們執(zhí)行一下 make manifests generate 可以發(fā)現(xiàn)已經(jīng)生成了相關(guān)的字段,并且代碼中的字段注釋也就是 yaml 文件中的注釋

  1. # config/crd/bases/apps.lailin.xyz_applications.yaml 
  2. ...... 
  3.    properties: 
  4.               product: 
  5.                 description: Product 該應(yīng)用所屬的產(chǎn)品 
  6.                 type: string 
  7. ...... 

實(shí)現(xiàn) controller

kubebuilder 已經(jīng)幫我們實(shí)現(xiàn)了 Operator 所需的大部分邏輯,我們只需要在 Reconcile 中實(shí)現(xiàn)業(yè)務(wù)邏輯就行了

  1. // controllers/application_controller.go 
  2.  
  3. func (r *ApplicationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { 
  4.  _ = r.Log.WithValues("application", req.NamespacedName) 
  5.  
  6.  r.Log.Info("app changed""ns", req.Namespace) 
  7.  
  8.  return ctrl.Result{}, nil 

邏輯修改好之后,我們先執(zhí)行 make install 安裝 CRD,然后執(zhí)行 make run運(yùn)行 controller

  1. go run ./main.go 
  2. 2021-04-25T21:55:55.578+0800    INFO    controller-runtime.metrics     metrics server is starting to listen     {"addr"":8080"
  3. 2021-04-25T21:55:55.579+0800    INFO    setup   starting manager 
  4. 2021-04-25T21:55:55.579+0800    INFO    controller-runtime.manager     starting metrics server  {"path""/metrics"
  5. 2021-04-25T21:55:55.579+0800    INFO    controller-runtime.manager.controller.application       Starting EventSource    {"reconciler group""apps.lailin.xyz""reconciler kind""Application""source""kind source: /, Kind="
  6. 2021-04-25T21:55:55.680+0800    INFO    controller-runtime.manager.controller.application       Starting Controller     {"reconciler group""apps.lailin.xyz""reconciler kind""Application"
  7. 2021-04-25T21:55:55.680+0800    INFO    controller-runtime.manager.controller.application       Starting workers        {"reconciler group""apps.lailin.xyz""reconciler kind""Application""worker count": 1} 

然后我們部署一個(gè)測(cè)試的 crd kubectl apply -f config/samples/apps_v1_application.yaml

  1. apiVersion: apps.lailin.xyz/v1 
  2. kind: Application 
  3. metadata: 
  4.   name: application-sample 
  5. spec: 
  6.   # Add fields here 
  7.   product: test 

然后可以看到之前寫的日志邏輯已經(jīng)觸發(fā)

  1. 2021-04-25T21:57:12.618+0800    INFO    controllers.Application app changed     {"ns""default"

Kubebuilder 注釋

在生成的代碼當(dāng)中我們可以看到很多 //+kubebuilder:xxx 開(kāi)頭的注釋,對(duì) Go 比較熟悉的同學(xué)應(yīng)該知道這些注釋是給對(duì)應(yīng)的代碼生成器服務(wù)的,在 Go 中有一個(gè)比較常用的套路就是利用 go gennerate生成對(duì)應(yīng)的 go 代碼。

kubebuilder 使用 controller-gen 生成代碼和對(duì)應(yīng)的 yaml 文件,這其中主要包含 CRD 生成、驗(yàn)證、處理還有 WebHook 的 RBAC 的生成功能,下面我簡(jiǎn)單介紹一下,完整版可以看 kubebuilder 的官方文檔

CRD 生成

  • //+kubebuilder:subresource:status 開(kāi)啟 status 子資源,添加這個(gè)注釋之后就可以對(duì) status進(jìn)行更新操作了
  • //+groupName=nodes.lailin.xyz 指定 groupname
  • //+kubebuilder:printcolumn 為 kubectl get xxx 添加一列,這個(gè)挺有用的
  • ......

CRD 驗(yàn)證,利用這個(gè)功能,我們只需要添加一些注釋,就給可以完成大部分需要校驗(yàn)的功能

  • //+kubebuilder:default:= 給字段設(shè)置默認(rèn)值
  • //+kubebuilder:validation:Pattern:=string 使用正則驗(yàn)證字段
  • ......

Webhook

  • //+kubebuilder:webhook 用于指定 webhook 如何生成,例如我們可以指定只監(jiān)聽(tīng) Update 事件的 webhook

RBAC 用于生成 rbac 的權(quán)限

  • //+kubebuilder:rbac

總結(jié)

這篇文章主要講解了 kubebuilder的安裝使用方式,以及涉及到的一些簡(jiǎn)單的概念,項(xiàng)目目錄結(jié)構(gòu)的說(shuō)明,下一篇文章我們就一起來(lái)實(shí)現(xiàn)一個(gè)真實(shí)的 Operator 需求

參考文獻(xiàn)

[^1]: Operator 模式 | Kubernetes:

https://kubernetes.io/zh/docs/concepts/extend-kubernetes/operator/

[^2]: kubebuilder 官方文檔, 這個(gè)是 master 分支的文檔,待 3.0 發(fā)布后去掉 master 即可:

https://master.book.kubebuilder.io/quick-start.html

[^3]: operator-sdk:

https://sdk.operatorframework.io/

[^4]: 深入解析 Kubebuilder:讓編寫 CRD 變得更簡(jiǎn)單:

https://developer.aliyun.com/article/719215

 

責(zé)任編輯:姜華 來(lái)源: mohuishou
相關(guān)推薦

2021-05-11 09:31:31

kustomizeoperator kubernetes

2022-07-06 07:57:37

Zookeeper分布式服務(wù)框架

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-09-18 07:43:33

ApolloJava配置中心

2021-10-14 09:58:24

消息中間件ActiveMQ Java

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)

2023-03-29 07:45:58

VS編輯區(qū)編程工具

2021-04-14 14:16:58

HttpHttp協(xié)議網(wǎng)絡(luò)協(xié)議

2021-04-08 11:00:56

CountDownLaJava進(jìn)階開(kāi)發(fā)

2021-07-21 09:48:20

etcd-wal模塊解析數(shù)據(jù)庫(kù)

2022-04-29 14:38:49

class文件結(jié)構(gòu)分析

2024-06-13 08:34:48

2021-03-12 09:21:31

MySQL數(shù)據(jù)庫(kù)邏輯架構(gòu)

2021-04-01 10:51:55

MySQL鎖機(jī)制數(shù)據(jù)庫(kù)

2022-02-17 08:53:38

ElasticSea集群部署

2022-03-22 09:09:17

HookReact前端

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-07-08 07:30:13

Webpack 前端Tree shakin

2021-04-23 08:59:35

ClickHouse集群搭建數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 涩涩视频在线观看免费 | 国产三级精品三级在线观看四季网 | 国产高清精品网站 | 国产日韩精品久久 | 亚洲伊人久久综合 | 久久精品久久久久久 | 国产91精品久久久久久久网曝门 | 爱高潮www亚洲精品 中文字幕免费视频 | 亚洲成人一区二区在线 | cao在线| 久久伊人一区二区 | 国产精品久久久久久久久污网站 | 在线成人av | 日本精品一区二区 | 国产伦一区二区三区久久 | 美女黄网站视频免费 | 日本超碰在线 | 999国产视频 | 国产粉嫩尤物极品99综合精品 | 韩日三级| 国产精品不卡视频 | 免费看黄视频网站 | 欧美videosex性极品hd | 免费在线黄色av | 日韩毛片| 亚洲国产区 | 日本爱爱视频 | 国产福利视频网站 | 国产一区二区不卡 | 成人在线视频一区 | 欧美成人一区二区三区 | 中文字幕亚洲一区二区三区 | 天堂va在线观看 | 一级特黄色毛片 | 综合久久亚洲 | 中文字幕乱码视频32 | 99热这里都是精品 | 在线一区观看 | 日韩久久久久久 | 夜夜撸av | 精品国产乱码久久久久久闺蜜 |