日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Kubernetes CRD & Operator 簡介

來源: 責(zé)編: 時間:2024-01-02 09:29:05 198觀看
導(dǎo)讀Kubernetes CRD在 kubernetes 中有一系列內(nèi)置的資源,諸如:pod、deployment、configmap、service …… 等等,它們由 k8s 的內(nèi)部組件管理。而除了這些內(nèi)置資源之外,k8s 還提供了另外一種方式讓用戶可以隨意地自定義資源,這就

Kubernetes CRD

在 kubernetes 中有一系列內(nèi)置的資源,諸如:pod、deployment、configmap、service …… 等等,它們由 k8s 的內(nèi)部組件管理。而除了這些內(nèi)置資源之外,k8s 還提供了另外一種方式讓用戶可以隨意地自定義資源,這就是 CRD (全稱 CustomResourceDefinitions) 。MI328資訊網(wǎng)——每日最新資訊28at.com

MI328資訊網(wǎng)——每日最新資訊28at.com

例如,我可以通過 CRD 去定義一個 mypod、myjob、myanything 等等資源,一旦注冊成功,那么這些自定義資源便會享受與內(nèi)置資源相同的待遇。具體而言就是:MI328資訊網(wǎng)——每日最新資訊28at.com

  • 我們可以像使用 kubectl 增刪改查 deployment 一樣去操作這些 CRD 自定義資源。
  • CRD 自定義資源的數(shù)據(jù)跟 pod 等內(nèi)置資源一樣會存儲到 k8s 控制平面的 etcd 中。

需要注意的是,CRD 在不同的語境下有不同的含義,有時候可能只是指 k8s 中的 CustomResourceDefinitions 這一種特定的資源,有時候也可能是指用戶通過 CRD 所創(chuàng)建出來的自定義資源。MI328資訊網(wǎng)——每日最新資訊28at.com

狹義上的 CRD (全稱 CustomResourceDefinitions) 是 k8s 中的一種特殊的內(nèi)置資源,我們可以通過它去創(chuàng)建我們自定義的其它資源。例如,我們可以通過 CRD 去創(chuàng)建一個叫 CronTab 的資源:MI328資訊網(wǎng)——每日最新資訊28at.com

apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata:  # 名稱必須匹配 <plural>.<group>  name: crontabs.stable.example.comspec:  # group 名稱,用于 REST API: /apis/<group>/<version>  group: stable.example.com  versions:    - name: v1      served: true      storage: true      schema:        openAPIV3Schema:          type: object          properties:            # 定義屬性            spec:              type: object              properties:                cronSpec:                  type: string                image:                  type: string  # 作用范圍可以是 Namespaced 或者 Cluster  scope: Namespaced  names:    # 復(fù)數(shù)名稱,使用于 URL: /apis/<group>/<version>/<plural>    plural: crontabs    # 單數(shù)名稱,可用于 CLI    singular: crontab    # 駝峰單數(shù),用于資源清單    kind: CronTab    # 名字簡寫,可用于 CLI    shortNames:    - ct

一旦我們 apply 這個 yaml 文件,那么我們的自定義資源 CronTab 也就注冊到 k8s 了。這個時候我們就可以任意操作這個自定義資源,比如 my-crontab.yaml:MI328資訊網(wǎng)——每日最新資訊28at.com

apiVersion: "stable.example.com/v1"kind: CronTabmetadata:  name: my-new-cron-objectspec:  cronSpec: "* * * * */5"  image: my-awesome-cron-image

執(zhí)行 kubectl apply -f my-crontab.yaml 就可以創(chuàng)建我們自定義的 CronTab,執(zhí)行 kubectl get crontab 就可以查詢到我們自定義的 CronTab 列表。MI328資訊網(wǎng)——每日最新資訊28at.com

MI328資訊網(wǎng)——每日最新資訊28at.com

通過 CRD 自定義資源的優(yōu)點(diǎn)是,我們無需操心自定義資源的數(shù)據(jù)存儲,也無需再額外實(shí)現(xiàn)一個 http server 去對外暴露操作這些自定義資源的 API 接口,因?yàn)檫@些 k8s 都幫我們做好了,我們只需要像其它內(nèi)置資源一樣使用自定義資源即可。MI328資訊網(wǎng)——每日最新資訊28at.com

但是!只有 CRD 往往是不夠的,例如上文中我們執(zhí)行 kubectl apply -f my-crontab.yaml 創(chuàng)建了一個 crontab 自定義資源,但是這個 crontab 不會有任何執(zhí)行的內(nèi)容(不會跑任何程序),而很多場景下我們是希望自定義資源能夠執(zhí)行點(diǎn)什么。這個時候我們就需要 Operator 了。MI328資訊網(wǎng)——每日最新資訊28at.com

Operator

Operator 其實(shí)就是 custom resource controller(自定義資源的控制器),它干的事情就是監(jiān)聽自定義資源的變更,然后針對性地做一些操作。例如,監(jiān)聽到某個自定義資源被創(chuàng)建后,Operator 可以讀取這個自定義資源的屬性然后創(chuàng)建一個 pod 去運(yùn)行具體的程序,并將這個 pod 綁定到自定義資源對象上。MI328資訊網(wǎng)——每日最新資訊28at.com

MI328資訊網(wǎng)——每日最新資訊28at.com

那 Operator 以何種方式存在呢?其實(shí)它跟普通的服務(wù)一樣,可以是 deployment,也可以是 statefuleSet。MI328資訊網(wǎng)——每日最新資訊28at.com

至于常說的 Operator pattern 其實(shí)就是 CRD + custom controller 這種模式。MI328資訊網(wǎng)——每日最新資訊28at.com

Kubebuilder

我們在構(gòu)建項(xiàng)目時常常希望有一個好用的框架,能夠提供一系列工具幫助開發(fā)者更輕松地進(jìn)行創(chuàng)建、測試和部署。而針對 CRD 和 Operator 的場景就有這么一個框架 Kubebuilder。MI328資訊網(wǎng)——每日最新資訊28at.com

接下來我將會使用 Kubebuilder 創(chuàng)建一個小項(xiàng)目,其中會創(chuàng)建一個自定義資源 Foo ,并在 controller 中監(jiān)聽這個資源的變更并把它打印出來。MI328資訊網(wǎng)——每日最新資訊28at.com

1. 安裝

# download kubebuilder and install locally.curl -L -o kubebuilder "https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)"chmod +x kubebuilder && mv kubebuilder /usr/local/bin/

2. 創(chuàng)建一個測試目錄

mkdir kubebuilder-testcd kubebuilder-test

3. 初始化項(xiàng)目

kubebuilder init --domain mytest.domain --repo mytest.domain/foo

4. 定義 CRD

假設(shè)我們想要定義一個如下格式的 CRD:MI328資訊網(wǎng)——每日最新資訊28at.com

apiVersion: "mygroup.mytest.domain/v1"kind: Foometadata:  name: xxxspec:  image: image  msg: message

那么我們需要創(chuàng)建一個 CRD(本質(zhì)上也是創(chuàng)建一個 API ):MI328資訊網(wǎng)——每日最新資訊28at.com

kubebuilder create api --group mygroup --version v1 --kind Foo

執(zhí)行之后輸入 y 確認(rèn)生成,然后 kubebuilder 會幫我們自動創(chuàng)建一些目錄和文件,其中:MI328資訊網(wǎng)——每日最新資訊28at.com

  • api/v1/foo_types.go 文件中定義了這個 CRD(也是 API)。
  • internal/controllers/foo_controller.go 文件則是控制 CRD 的業(yè)務(wù)邏輯。

由于自動生成的文件只是一個基本框架,我們需要按照自己的需求進(jìn)行相應(yīng)的修改。MI328資訊網(wǎng)——每日最新資訊28at.com

a. 在代碼中修改 CRD 的結(jié)構(gòu)MI328資訊網(wǎng)——每日最新資訊28at.com

首先,修改 api/v1/foo_types.go 調(diào)整 CRD 的結(jié)構(gòu)(注意不要刪除 //+kubebuilder 這種注釋):MI328資訊網(wǎng)——每日最新資訊28at.com

// FooSpec defines the desired state of Footype FooSpec struct {    Image string `json:"image"`    Msg   string `json:"msg"`}// FooStatus defines the observed state of Footype FooStatus struct {    PodName string `json:"podName"`}

b. 通過命令自動生成 CRD yamlMI328資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行 make manifests 命令之后,kubebuilder 就會在 config/crd/bases 目錄下生成一個 mygroup.mytest.domain_foos.yaml 文件,這個文件就是我們定義 CRD 的 yaml 文件:MI328資訊網(wǎng)——每日最新資訊28at.com

---apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata:  annotations:    controller-gen.kubebuilder.io/version: v0.13.0  name: foos.mygroup.mytest.domainspec:  group: mygroup.mytest.domain  names:    kind: Foo    listKind: FooList    plural: foos    singular: foo  scope: Namespaced  versions:  - name: v1    schema:      openAPIV3Schema:        description: Foo is the Schema for the foos API        properties:          apiVersion:            description: 'APIVersion defines the versioned schema of this representation              of an object. Servers should convert recognized schemas to the latest              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'            type: string          kind:            description: 'Kind is a string value representing the REST resource this              object represents. Servers may infer this from the endpoint the client              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'            type: string          metadata:            type: object          spec:            description: FooSpec defines the desired state of Foo            properties:              image:                type: string              msg:                type: string            required:            - image            - msg            type: object          status:            description: FooStatus defines the observed state of Foo            properties:              podName:                type: string            required:            - podName            type: object        type: object    served: true    storage: true    subresources:      status: {}

make manifests 指令執(zhí)行的具體內(nèi)容定義在了 Makefile 文件中:MI328資訊網(wǎng)——每日最新資訊28at.com

.PHONY: manifestsmanifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.    $(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases

從中可以看到其實(shí) kubebuilder 使用了 controller-gen 工具去掃描代碼中特定格式的注釋(如 //+kubebuilder:...)進(jìn)而生成的 CRD yaml 文件。MI328資訊網(wǎng)——每日最新資訊28at.com

5. 補(bǔ)充 controller 邏輯

假設(shè)我們要監(jiān)聽用戶創(chuàng)建的自定義資源 Foo 然后把它的屬性打印出來。MI328資訊網(wǎng)——每日最新資訊28at.com

a. 修改 controller 補(bǔ)充業(yè)務(wù)邏輯MI328資訊網(wǎng)——每日最新資訊28at.com

修改 internal/controllers/foo_controller.go 文件補(bǔ)充我們自己的業(yè)務(wù)邏輯,如下:MI328資訊網(wǎng)——每日最新資訊28at.com

func (r *FooReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {    l := log.FromContext(ctx)    // 補(bǔ)充業(yè)務(wù)邏輯    foo := &mygroupv1.Foo{}    if err := r.Get(ctx, req.NamespacedName, foo); err != nil {        l.Error(err, "unable to fetch Foo")        return ctrl.Result{}, client.IgnoreNotFound(err)    }    // 打印 Foo 屬性    l.Info("Received Foo", "Image", foo.Spec.Image, "Msg", foo.Spec.Msg)    return ctrl.Result{}, nil}// SetupWithManager sets up the controller with the Manager.func (r *FooReconciler) SetupWithManager(mgr ctrl.Manager) error {    return ctrl.NewControllerManagedBy(mgr).        For(&mygroupv1.Foo{}).        Complete(r)}

b. 進(jìn)行測試MI328資訊網(wǎng)——每日最新資訊28at.com

注意:測試需要有本地或遠(yuǎn)程的 k8s 集群環(huán)境,其將會默認(rèn)使用跟當(dāng)前 kubectl 一致的環(huán)境。MI328資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行 make install 注冊 CRD ,從 Makefile 中可以看到其實(shí)際執(zhí)行了如下指令:MI328資訊網(wǎng)——每日最新資訊28at.com

.PHONY: installinstall: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config.    $(KUSTOMIZE) build config/crd | $(KUBECTL) apply -f -

執(zhí)行 make run 運(yùn)行 controller,從 Makefile 中可以看到其實(shí)際執(zhí)行了如下指令:MI328資訊網(wǎng)——每日最新資訊28at.com

.PHONY: runrun: manifests generate fmt vet ## Run a controller from your host.    go run ./cmd/main.go

然后可以看到如下輸出:MI328資訊網(wǎng)——每日最新資訊28at.com

...go fmt ./...go vet ./...go run ./cmd/main.go2023-12-19T15:14:18+08:00       INFO    setup   starting manager2023-12-19T15:14:18+08:00       INFO    controller-runtime.metrics      Starting metrics server2023-12-19T15:14:18+08:00       INFO    starting server {"kind": "health probe", "addr": "[::]:8081"}2023-12-19T15:14:18+08:00       INFO    controller-runtime.metrics      Serving metrics server  {"bindAddress": ":8080", "secure": false}2023-12-19T15:14:18+08:00       INFO    Starting EventSource    {"controller": "foo", "controllerGroup": "mygroup.mytest.domain", "controllerKind": "Foo", "source": "kind source: *v1.Foo"}2023-12-19T15:14:18+08:00       INFO    Starting Controller     {"controller": "foo", "controllerGroup": "mygroup.mytest.domain", "controllerKind": "Foo"}2023-12-19T15:14:19+08:00       INFO    Starting workers        {"controller": "foo", "controllerGroup": "mygroup.mytest.domain", "controllerKind": "Foo", "worker count": 1}

我們提交一個 foo.yaml 試試:MI328資訊網(wǎng)——每日最新資訊28at.com

apiVersion: "mygroup.mytest.domain/v1"kind: Foometadata:  name: test-foospec:  image: test-image  msg: test-message

執(zhí)行 kubectl apply -f foo.yaml 之后我們就會在 controller 的輸出中看到 foo 被打印了出來:MI328資訊網(wǎng)——每日最新資訊28at.com

2023-12-19T15:16:00+08:00       INFO    Received Foo    {"controller": "foo", "controllerGroup": "mygroup.mytest.domain", "controllerKind": "Foo", "Foo": {"name":"test-foo","namespace":"aries"}, "namespace": "aries", "name": "test-foo", "reconcileID": "8dfd629e-3081-4d40-8fc6-bcc3e81bbb39", "Image": "test-image", "Msg": "test-message"}

這就是使用 kubebuilder 的一個簡單示例。MI328資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

Kubernetes 的 CRD 和 Operator 機(jī)制為用戶提供了強(qiáng)大的擴(kuò)展性。CRD 允許用戶自定義資源,而 Operators 則可以管理這些資源。正是這種擴(kuò)展機(jī)制為 Kubernetes 生態(tài)系統(tǒng)提供了極大的靈活性和可塑性,使得它可以更廣泛的應(yīng)用于各種場景中。MI328資訊網(wǎng)——每日最新資訊28at.com

參考資料:MI328資訊網(wǎng)——每日最新資訊28at.com

  • https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
  • https://kubernetes.io/docs/concepts/extend-kubernetes/operator/
  • https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/
  • https://book.kubebuilder.io/introduction

本文鏈接:http://www.www897cc.com/showinfo-26-55048-0.htmlKubernetes CRD &amp; Operator 簡介

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Go 語言為什么不支持并發(fā)讀寫 map?

下一篇: 優(yōu)化 Kubernetes 中的資源分配:CPU/內(nèi)存申請和限制的重要性

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Redmi Buds 4開箱簡評:才199還有降噪 可以無腦入

    在上個月舉辦的Redmi Note11T Pro系列新機(jī)發(fā)布會上,除了兩款手機(jī)新品之外,Redmi還帶來了兩款TWS真無線藍(lán)牙耳機(jī)產(chǎn)品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們在Redmi Note11T
  • 5月iOS設(shè)備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動,不過iOS由于設(shè)備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設(shè)
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學(xué)習(xí)反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進(jìn)行反混淆,尤其是使用自定義混淆器對其進(jìn)行混淆時。什么是混
  • K6:面向開發(fā)人員的現(xiàn)代負(fù)載測試工具

    K6 是一個開源負(fù)載測試工具,可以輕松編寫、運(yùn)行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設(shè)計(jì)為功能強(qiáng)大、可擴(kuò)展且易于使用。k6 可用于測試各種應(yīng)用程序,包括 Web
  • 2023年,我眼中的字節(jié)跳動

    此時此刻(2023年7月),字節(jié)跳動從未上市,也從未公布過任何官方的上市計(jì)劃;但是這并不妨礙它成為中國最受關(guān)注的互聯(lián)網(wǎng)公司之一。從2016-17年的抖音強(qiáng)勢崛起,到2018年的&ldquo;頭騰
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場,應(yīng)該選擇什么樣的著裝?&rdquo;近日,在網(wǎng)絡(luò)上,一個與著裝相關(guān)的帖子引發(fā)關(guān)注,在該帖子里,一位在高級寫字樓亞洲金
  • 華為開發(fā)者大會2023日程公開:開設(shè)鴻蒙HarmonyOS 4體驗(yàn)區(qū)

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發(fā)者大會 2023 的詳細(xì)日程。整場大會將于 8 月 4 日-6 日之間舉行,屆時將發(fā)布最新一代鴻蒙 H
  • 華為將推出盤古數(shù)字人大模型 可幫助用戶12小時完成數(shù)字人生成

    在今日舉行的2023年華為云數(shù)字文娛AI創(chuàng)新峰會上,華為云全球Marketing與銷售服務(wù)總裁石冀琳表示,華為云將在后續(xù)推出盤古數(shù)字人大模型,可幫助用戶12小
  • OPPO K11采用全方位護(hù)眼屏:三大護(hù)眼能力減輕視覺疲勞

    日前OPPO官方宣布,全新的OPPO K11將于7月25日正式發(fā)布,將主打旗艦影像,和同檔位競品相比,其最大的賣點(diǎn)就是將配備索尼IMX890主攝,堪稱是2000檔位影像表
Top 主站蜘蛛池模板: 晋江市| 绩溪县| 孙吴县| 邓州市| 德保县| 大石桥市| 钟山县| 锡林郭勒盟| 兖州市| 武宁县| 通化市| 喀什市| 景谷| 石城县| 大同市| 益阳市| 马公市| 仙居县| 唐河县| 汶川县| 绥德县| 石景山区| 通化市| 巴马| 吴桥县| 和田市| 永靖县| 富平县| 紫云| 青川县| 灵璧县| 连云港市| 陵川县| 马边| 梧州市| 营口市| 毕节市| 金乡县| 凉山| 林口县| 腾冲县|