国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何從零開(kāi)發(fā)Kubernetes Operator?

馬哥Linux運(yùn)維 ? 來(lái)源:分布式實(shí)驗(yàn)室 ? 2023-01-05 11:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

你也許能夠?qū)?yīng)用熟練的部署到Kubernetes上,但你知道什么是Operator嗎?Operator是如何工作的?如何構(gòu)建Operator?這是一個(gè)復(fù)雜的課題,但幸運(yùn)的是,自2016年發(fā)明以來(lái),已經(jīng)開(kāi)發(fā)了許多相關(guān)工具,可以簡(jiǎn)化工程師的生活。

這些工具允許我們將自定義邏輯加入Kubernetes,從而自動(dòng)化大量任務(wù),而這已經(jīng)超出了軟件本身功能的范圍。

閑話少說(shuō),讓我們深入了解更多關(guān)于Operator的知識(shí)吧!

1什么是Operator?

等一下,你知道Kubernetes(或k8s)嗎?簡(jiǎn)單介紹一下,這是由谷歌云開(kāi)發(fā)的“可以在任何地方部署、擴(kuò)展和管理容器應(yīng)用程序的開(kāi)源系統(tǒng)”。

大多數(shù)人使用Kubernetes的方式是使用原生資源(如Pod、Deployment、Service等)部署應(yīng)用程序。但是,也可以擴(kuò)展Kubernetes的功能,從而添加滿足特定需求的新業(yè)務(wù)邏輯,這就是Operator的作用。

Operator的主要目標(biāo)是將工程師的邏輯轉(zhuǎn)換為代碼,以便實(shí)現(xiàn)原生Kubernetes無(wú)法完成的某些任務(wù)的自動(dòng)化。

負(fù)責(zé)開(kāi)發(fā)應(yīng)用程序或服務(wù)的工程師對(duì)系統(tǒng)應(yīng)該如何運(yùn)行、如何部署以及如何在出現(xiàn)問(wèn)題時(shí)做出反應(yīng)有很深的了解。將這些技術(shù)知識(shí)封裝在代碼中并自動(dòng)化操作的能力意味著在可以花費(fèi)更少的時(shí)間處理重復(fù)任務(wù),而在重要問(wèn)題上可以投入更多時(shí)間。

例如,可以想象Operator在Kubernetes中部署和維護(hù)MySQL、Elasticsearch或Gitlab runner等工具,Operator可以配置這些工具,根據(jù)事件調(diào)整系統(tǒng)狀態(tài),并對(duì)故障做出反應(yīng)。

聽(tīng)起來(lái)很有趣不是嗎?讓我們動(dòng)手干吧。

2構(gòu)建Operator

可以使用Kubernetes開(kāi)發(fā)的controller-runtime項(xiàng)目從頭構(gòu)建Operator,也可以使用最流行的框架之一加速開(kāi)發(fā)周期并降低復(fù)雜性(Kubebuilder或OperatorSDK)。因?yàn)镵ubebuilder框架非常容易使用,文檔也很容易閱讀,而且久經(jīng)考驗(yàn),因此我選擇基于Kubebuilder構(gòu)建。

不管怎樣,這兩個(gè)項(xiàng)目目前正在合并為單獨(dú)的項(xiàng)目。

設(shè)置開(kāi)發(fā)環(huán)境

開(kāi)發(fā)Operator需要以下必備工具:

  • Gov1.17.9+

  • Docker17.03+

  • kubectlv1.11.3+

  • 訪問(wèn)Kubernetes v1.11.3+集群(強(qiáng)烈建議使用kind設(shè)置自己的本地集群,它非常容易使用!)

然后安裝kubebuilder:


	

$curl-L-okubebuilderhttps://go.kubebuilder.io/dl/latest/$(goenvGOOS)/$(goenvGOARCH)&&chmod+xkubebuilder&&mvkubebuilder/usr/local/bin/

如果一切正常,應(yīng)該會(huì)看到類似輸出(版本可能會(huì)隨時(shí)間發(fā)生變化):


	

$kubebuilderversion Version:main.version{KubeBuilderVersion:"3.4.1",KubernetesVendor:"1.23.5",GitCommit:"d59d7882ce95ce5de10238e135ddff31d8ede026",BuildDate:"2022-05-06T1356Z",GoOs:"darwin",GoArch:"amd64"}

太棒了,現(xiàn)在可以開(kāi)始了!

構(gòu)建簡(jiǎn)單的Operator

接下來(lái)做個(gè)小練習(xí),構(gòu)建一個(gè)簡(jiǎn)單的foo operator,除了演示Operator的功能之外,沒(méi)有實(shí)際用處。

運(yùn)行以下命令初始化新項(xiàng)目,該命令將下載controller-runtime二進(jìn)制文件,并為我們準(zhǔn)備好項(xiàng)目。


	
		$kubebuilderinit--domainmy.domain--repomy.domain/tutorial Writingkustomizemanifestsforyoutoedit... Writingscaffoldforyoutoedit... Getcontrollerruntime: $gogetsigs.k8s.io/controller-runtime@v0.11.2 go:downloadingsigs.k8s.io/controller-runtimev0.11.2 ... Updatedependencies: $gomodtidy go:downloadinggithub.com/onsi/gomegav1.17.0 ...下面是項(xiàng)目結(jié)構(gòu)(注意這是一個(gè)Go項(xiàng)目):

	

$ls-a -rw-------1leovctstaff129Jun3016:08.dockerignore -rw-------1leovctstaff367Jun3016:08.gitignore -rw-------1leovctstaff776Jun3016:08Dockerfile -rw-------1leovctstaff5029Jun3016:08Makefile -rw-------1leovctstaff104Jun3016:08PROJECT -rw-------1leovctstaff2718Jun3016:08README.md drwx------6leovctstaff192Jun3016:08config -rw-------1leovctstaff3218Jun3016:08go.mod -rw-r--r--1leovctstaff94801Jun3016:08go.sum drwx------3leovctstaff96Jun3016:08hack -rw-------1leovctstaff2780Jun3016:08main.go

我們來(lái)看看這個(gè)Operator最重要的組成部分:
  • main.go是項(xiàng)目入口,負(fù)責(zé)設(shè)置并運(yùn)行管理器。

  • config/包含在Kubernetes中部署Operator的manifest。

  • Dockerfile是用于構(gòu)建管理器鏡像的容器文件。

等等,這個(gè)管理器組件是什么玩意兒?

這涉及到部分理論知識(shí),我們稍后再說(shuō)!

Operator由兩個(gè)組件組成,自定義資源定義(CRD,Custom Resource Definition)和控制器(Controller)。

CRD是“Kubernetes自定義類型”或資源藍(lán)圖,用于描述其規(guī)范和狀態(tài)。我們可以定義CRD的實(shí)例,稱為自定義資源(CR,Custom Resource)。

c13293c2-8c5d-11ed-bfe3-dac502259ad0.jpg

圖1. 自定義資源定義(CRD)和自定義資源(CR)

控制器(也稱為控制循環(huán))持續(xù)監(jiān)視集群狀態(tài),并根據(jù)事件做出變更,目標(biāo)是將資源的當(dāng)前狀態(tài)變?yōu)橛脩粼谧远x資源規(guī)范中定義的期望狀態(tài)。

c13bba4c-8c5d-11ed-bfe3-dac502259ad0.jpg

圖2. 控制器操作概要圖示

一般來(lái)說(shuō),控制器是特定于某種類型的資源的,但也可以對(duì)一組不同的資源執(zhí)行CRUD(創(chuàng)建、讀取、更新和刪除)操作。

在Kubernetes的文檔中舉了一個(gè)控制器的例子:恒溫器。當(dāng)我們?cè)O(shè)置溫度時(shí),告訴恒溫器所需的狀態(tài),房間的實(shí)際溫度就是當(dāng)前的實(shí)際狀態(tài),恒溫器通過(guò)打開(kāi)或關(guān)閉空調(diào),使實(shí)際狀態(tài)更接近預(yù)期狀態(tài)。

那管理器(manager)呢?該組件的目標(biāo)是啟動(dòng)所有控制器,并使控制循環(huán)共存。假設(shè)項(xiàng)目中有兩個(gè)CRD,同時(shí)有兩個(gè)控制器,每個(gè)CRD對(duì)應(yīng)一個(gè)控制器,管理器將啟動(dòng)這兩個(gè)控制器并使它們共存。

現(xiàn)在我們知道了Operator是如何工作的,可以開(kāi)始使用Kubebuilder框架創(chuàng)建一個(gè)Operator,我們從創(chuàng)建新的API(組/版本)和新的Kind(CRD)開(kāi)始,當(dāng)提示創(chuàng)建CRD和控制器時(shí),按yes。


	

$kubebuildercreateapi--grouptutorial--versionv1--kindFoo CreateResource[y/n]y CreateController[y/n]y Writingkustomizemanifestsforyoutoedit... Writingscaffoldforyoutoedit... api/v1/foo_types.go controllers/foo_controller.go Updatedependencies: $gomodtidy Runningmake: $makegenerate mkdir-p/Users/leovct/Documents/tutorial/bin GOBIN=/Users/leovct/Documents/tutorial/bingoinstallsigs.k8s.io/controller-tools/cmd/controller-gen@v0.8.0 /Users/leovct/Documents/tutorial/bin/controller-genobject:headerFile="hack/boilerplate.go.txt"paths="./..."

接下來(lái)是最有意思的部分!我們將定制CRD和控制器來(lái)滿足需求,注意看已經(jīng)創(chuàng)建了兩個(gè)新文件夾:
  • api/v1包含F(xiàn)oo CRD

  • controllers包含F(xiàn)oo控制器

自定義CRD和Controller

接下來(lái)定制我們可愛(ài)的Foo CRD。正如前面所說(shuō),這個(gè)CRD沒(méi)有任何目的,只是簡(jiǎn)單展示如何使用Operator在Kubernetes中執(zhí)行簡(jiǎn)單的任務(wù)。

Foo CRD在其定義中有name字段,該字段指的是Foo正在尋找的朋友的名稱。如果Foo找到了一個(gè)朋友(一個(gè)和朋友同名的Pod),happy狀態(tài)將被設(shè)置為true。


	

packagev1 import( metav1"k8s.io/apimachinery/pkg/apis/meta/v1" ) //FooSpecdefinesthedesiredstateofFoo typeFooSpecstruct{ //NameofthefriendFooislookingfor Namestring`json:"name"` } //FooStatusdefinestheobservedstateofFoo typeFooStatusstruct{ //HappywillbesettotrueifFoofoundafriend Happybool`json:"happy,omitempty"` } //+kubebuilderroot=true //+kubebuilderstatus //FooistheSchemaforthefoosAPI typeFoostruct{ metav1.TypeMeta`json:",inline"` metav1.ObjectMeta`json:"metadata,omitempty"` SpecFooSpec`json:"spec,omitempty"` StatusFooStatus`json:"status,omitempty"` } //+kubebuilderroot=true //FooListcontainsalistofFoo typeFooListstruct{ metav1.TypeMeta`json:",inline"` metav1.ListMeta`json:"metadata,omitempty"` Items[]Foo`json:"items"` } funcinit(){ SchemeBuilder.Register(&Foo{},&FooList{}) }

接下來(lái)實(shí)現(xiàn)控制器邏輯。沒(méi)什么復(fù)雜的,通過(guò)觸發(fā)reconciliation請(qǐng)求獲取Foo資源,從而得到Foo的朋友的名稱。然后,列出所有和Foo的朋友同名的Pod。如果找到一個(gè)或多個(gè),將Foo的happy狀態(tài)更新為true,否則設(shè)置為false。

注意,控制器也會(huì)對(duì)Pod事件做出反應(yīng)。實(shí)際上,如果創(chuàng)建了一個(gè)新的Pod,我們希望Foo資源能夠相應(yīng)更新其狀態(tài)。這個(gè)方法將在每次發(fā)生Pod事件時(shí)被觸發(fā)(創(chuàng)建、更新或刪除)。然后,只有當(dāng)Pod名稱是集群中部署的某個(gè)Foo自定義資源的“朋友”時(shí),才觸發(fā)Foo控制器的reconciliation循環(huán)。


	

packagecontrollers import( "context" corev1"k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" ctrl"sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/source" tutorialv1"my.domain/tutorial/api/v1" ) //FooReconcilerreconcilesaFooobject typeFooReconcilerstruct{ client.Client Scheme*runtime.Scheme } //RBACpermissionstomonitorfoocustomresources //+kubebuildergroups=tutorial.my.domain,resources=foos,verbs=get;list;watch;create;update;patch;delete //+kubebuildergroups=tutorial.my.domain,resources=foos/status,verbs=get;update;patch //+kubebuildergroups=tutorial.my.domain,resources=foos/finalizers,verbs=update //RBACpermissionstomonitorpods //+kubebuildergroups="",resources=pods,verbs=get;list;watch //Reconcileispartofthemainkubernetesreconciliationloopwhichaimsto //movethecurrentstateoftheclusterclosertothedesiredstate. func(r*FooReconciler)Reconcile(ctxcontext.Context,reqctrl.Request)(ctrl.Result,error){ log:=log.FromContext(ctx) log.Info("reconcilingfoocustomresource") //GettheFooresourcethattriggeredthereconciliationrequest varfootutorialv1.Foo iferr:=r.Get(ctx,req.NamespacedName,&foo);err!=nil{ log.Error(err,"unabletofetchFoo") returnctrl.Result{},client.IgnoreNotFound(err) } //GetpodswiththesamenameasFoo'sfriend varpodListcorev1.PodList varfriendFoundbool iferr:=r.List(ctx,&podList);err!=nil{ log.Error(err,"unabletolistpods") }else{ for_,item:=rangepodList.Items{ ifitem.GetName()==foo.Spec.Name{ log.Info("podlinkedtoafoocustomresourcefound","name",item.GetName()) friendFound=true } } } //UpdateFoo'happystatus foo.Status.Happy=friendFound iferr:=r.Status().Update(ctx,&foo);err!=nil{ log.Error(err,"unabletoupdatefoo'shappystatus","status",friendFound) returnctrl.Result{},err } log.Info("foo'shappystatusupdated","status",friendFound) log.Info("foocustomresourcereconciled") returnctrl.Result{},nil } //SetupWithManagersetsupthecontrollerwiththeManager. func(r*FooReconciler)SetupWithManager(mgrctrl.Manager)error{ returnctrl.NewControllerManagedBy(mgr). For(&tutorialv1.Foo{}). Watches( &source.Kind{Type:&corev1.Pod{}}, handler.EnqueueRequestsFromMapFunc(r.mapPodsReqToFooReq), ). Complete(r) } func(r*FooReconciler)mapPodsReqToFooReq(objclient.Object)[]reconcile.Request{ ctx:=context.Background() log:=log.FromContext(ctx) //ListalltheFoocustomresource req:=[]reconcile.Request{} varlisttutorialv1.FooList iferr:=r.Client.List(context.TODO(),&list);err!=nil{ log.Error(err,"unabletolistfoocustomresources") }else{ //OnlykeepFoocustomresourcesrelatedtothePodthattriggeredthereconciliationrequest for_,item:=rangelist.Items{ ifitem.Spec.Name==obj.GetName(){ req=append(req,reconcile.Request{ NamespacedName:types.NamespacedName{Name:item.Name,Namespace:item.Namespace}, }) log.Info("podlinkedtoafoocustomresourceissuedanevent","name",obj.GetName()) } } } returnreq }

我們已經(jīng)完成了對(duì)API定義和控制器的編輯,可以運(yùn)行以下命令來(lái)更新Operator manifest。


	

$makemanifests /Users/leovct/Documents/tutorial/bin/controller-genrbac:roleName=manager-rolecrdwebhookpaths="./..."outputartifacts:config=config/crd/bases

運(yùn)行Controller

我們使用Kind設(shè)置本地Kubernetes集群,它很容易使用。

首先將CRD安裝到集群中。


	

$makeinstall /Users/leovct/Documents/tutorial/bin/controller-genrbac:roleName=manager-rolecrdwebhookpaths="./..."outputartifacts:config=config/crd/bases kubectlapply-kconfig/crd customresourcedefinition.apiextensions.k8s.io/foos.tutorial.my.domaincreated

可以看到Foo CRD已經(jīng)創(chuàng)建好了。

	

$kubectlgetcrds NAMECREATEDAT foos.tutorial.my.domain2022-06-30T1745Z

然后終端中運(yùn)行控制器。請(qǐng)記住,也可以將其部署為Kubernetes集群中的deployment。

	

$makerun /Users/leovct/Documents/tutorial/bin/controller-genrbac:roleName=manager-rolecrdwebhookpaths="./..."outputartifacts:config=config/crd/bases /Users/leovct/Documents/tutorial/bin/controller-genobject:headerFile="hack/boilerplate.go.txt"paths="./..." gofmt./... govet./... gorun./main.go INFOcontroller-runtime.metricsMetricsserverisstartingtolisten{"addr":":8080"} INFOsetupstartingmanager INFOStartingserver{"path":"/metrics","kind":"metrics","addr":"[::]:8080"} INFOStartingserver{"kind":"healthprobe","addr":"[::]:8081"} INFOcontroller.fooStartingEventSource{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","source":"kindsource:*v1.Foo"} INFOcontroller.fooStartingEventSource{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","source":"kindsource:*v1.Pod"} INFOcontroller.fooStartingController{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo"} INFOcontroller.fooStartingworkers{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","workercount":1}

如你所見(jiàn),管理器啟動(dòng)了,然后Foo控制器也啟動(dòng)了,控制器現(xiàn)在正在運(yùn)行并監(jiān)聽(tīng)事件!

測(cè)試控制器

為了測(cè)試是否一切工作正常,我們創(chuàng)建兩個(gè)Foo自定義資源以及一些pod,觀察控制器的行為。

首先,在config/samples中創(chuàng)建Foo自定義資源清單,運(yùn)行以下命令在本地Kubernetes集群中創(chuàng)建資源。


	

apiVersion:tutorial.my.domain/v1 kind:Foo metadata: name:foo-01 spec: name:jack --- apiVersion:tutorial.my.domain/v1 kind:Foo metadata: name:foo-02 spec: name:joe


	

$kubectlapply-fconfig/samples foo.tutorial.my.domain/foo-1created foo.tutorial.my.domain/foo-2created

可以看到控制器為每個(gè)Foo自定義資源創(chuàng)建事件觸發(fā)了reconciliation循環(huán)。

	

INFOcontroller.fooreconcilingfoocustomresource{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-1","namespace":"default"} INFOcontroller.foofoo'shappystatusupdated{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-1","namespace":"default","status":"false"} INFOcontroller.foofoocustomresourcereconciled{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-1","namespace":"default"} INFOcontroller.fooreconcilingfoocustomresource{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-2","namespace":"default"} INFOcontroller.foofoo'shappystatusupdated{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-2","namespace":"default","status":"false"} INFOcontroller.foofoocustomresourcereconciled{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-2","namespace":"default"}

如果檢查Foo自定義資源狀態(tài),可以看到狀態(tài)為空,這正是所期望的,目前為止一切正常!

	

$kubectldescribefoos Name:foo-1 Namespace:default APIVersion:tutorial.my.domain/v1 Kind:Foo Metadata:... Spec: Name:jack Status: Name:foo-2 Namespace:default APIVersion:tutorial.my.domain/v1 Kind:Foo Metadata:... Spec: Name:joe Status:

接下來(lái)我們部署一個(gè)叫jack的Pod來(lái)觀察系統(tǒng)的反應(yīng)。

	

apiVersion:v1 kind:Pod metadata: name:jack spec: containers: -name:ubuntu image:ubuntu:latest #Justsleepforever command:["sleep"] args:["infinity"]

Pod部署完成后,應(yīng)該可以看到控制器對(duì)Pod創(chuàng)建事件作出響應(yīng),然后按照預(yù)期更新第一個(gè)Foo自定義資源狀態(tài),可以通過(guò)describe Foo自定義資源來(lái)驗(yàn)證。

	

INFOpodlinkedtoafoocustomresourceissuedanevent{"name":"jack"} INFOcontroller.fooreconcilingfoocustomresource{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-1","namespace":"default"} INFOcontroller.foopodlinkedtoafoocustomresourcefound{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-1","namespace":"default","name":"jack"} INFOcontroller.foofoo'shappystatusupdated{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-1","namespace":"default","status":true} INFOcontroller.foofoocustomresourcereconciled{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-1","namespace":"default"}

我們更新第二個(gè)Foo自定義資源規(guī)范,將其name字段的值從joe更改為jack,控制器應(yīng)該捕獲更新事件并觸發(fā)reconciliation循環(huán)。

	

INFOcontroller.foopodlinkedtoafoocustomresourcefound{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-2","namespace":"default","name":"jack"} INFOcontroller.foofoo'shappystatusupdated{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-2","namespace":"default","status":true} INFOcontroller.foofoocustomresourcereconciled{"reconcilergroup":"tutorial.my.domain","reconcilerkind":"Foo","name":"foo-2","namespace":"default"}

Yeah,成功了!我們已經(jīng)做了足夠多的實(shí)驗(yàn),你應(yīng)該明白這是怎么回事了!如果刪除名為jack的pod,自定義資源的happy狀態(tài)將被設(shè)置為false。

我們可以確認(rèn)Operator是正常工作的!最好再編寫一些單元測(cè)試和端到端測(cè)試,但本文不會(huì)覆蓋相關(guān)內(nèi)容。

為自己感到驕傲吧,你已經(jīng)設(shè)計(jì)、部署并測(cè)試了第一個(gè)Operator!恭喜!!

如果需要瀏覽完整代碼,請(qǐng)?jiān)L問(wèn):

https://github.com/leovct/kubernetes-operator-tutorial

3更多工作

我們已經(jīng)看到如何創(chuàng)建非常基本的Kubernetes operator,但遠(yuǎn)非完美,還有很多地方需要改善,下面是可以探索的主題列表:

  • 優(yōu)化事件過(guò)濾(有時(shí),事件會(huì)被提交兩次……)。

  • 完善RBAC權(quán)限。

  • 改進(jìn)日志記錄系統(tǒng)。

  • 當(dāng)operator更新資源時(shí),觸發(fā)Kubernetes事件。

  • 獲取Foo自定義資源時(shí)添加自定義字段(也許顯示happy狀態(tài)?)

  • 編寫單元測(cè)試和端到端測(cè)試。

通過(guò)這個(gè)列表,可以深入挖掘這一主題。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 自動(dòng)化
    +關(guān)注

    關(guān)注

    31

    文章

    5930

    瀏覽量

    90218
  • kubernetes
    +關(guān)注

    關(guān)注

    0

    文章

    263

    瀏覽量

    9494

原文標(biāo)題:如何從零開(kāi)發(fā)Kubernetes Operator?

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    KubePi:開(kāi)源Kubernetes可視化管理面板,讓集群管理如此簡(jiǎn)單

    KubePi:開(kāi)源Kubernetes可視化管理面板,讓集群管理如此簡(jiǎn)單 在云原生時(shí)代,Kubernetes已成為容器編排的事實(shí)標(biāo)準(zhǔn),但其復(fù)雜性卻讓許多開(kāi)發(fā)者望而卻步。KubePi作為一款現(xiàn)代化
    發(fā)表于 02-11 12:53

    Kubernetes kubectl命令行工具詳解

    kubectl是Kubernetes官方提供的命令行工具,作為與Kubernetes集群交互的主要接口,它通過(guò)調(diào)用Kubernetes API Server實(shí)現(xiàn)對(duì)集群資源的全面管理。在生產(chǎn)環(huán)境中,運(yùn)維工程師需要熟練掌握kubec
    的頭像 發(fā)表于 02-02 16:40 ?409次閱讀

    迅為RK3588開(kāi)發(fā)環(huán)境搭建“三步曲”,到一輕松上手!

    迅為RK3588開(kāi)發(fā)環(huán)境搭建“三步曲”,到一輕松上手!
    的頭像 發(fā)表于 12-01 11:51 ?1191次閱讀
    迅為RK3588<b class='flag-5'>開(kāi)發(fā)</b>環(huán)境搭建“三步曲”,<b class='flag-5'>從</b><b class='flag-5'>零</b>到一輕松上手!

    迅為3568開(kāi)發(fā)學(xué)習(xí)Linux驅(qū)動(dòng)開(kāi)發(fā):迅為一站式資料包如何讓我效率翻倍

    迅為3568開(kāi)發(fā)學(xué)習(xí)Linux驅(qū)動(dòng)開(kāi)發(fā):迅為一站式資料包如何讓我效率翻倍
    的頭像 發(fā)表于 11-05 11:16 ?400次閱讀
    迅為3568<b class='flag-5'>開(kāi)發(fā)</b>板<b class='flag-5'>從</b><b class='flag-5'>零</b>學(xué)習(xí)Linux驅(qū)動(dòng)<b class='flag-5'>開(kāi)發(fā)</b>:迅為一站式資料包如何讓我效率翻倍

    香港服務(wù)器支持Docker和Kubernetes嗎?

    在云原生技術(shù)成為主流的今天,Docker和Kubernetes(K8s)已成為現(xiàn)代化應(yīng)用開(kāi)發(fā)和部署的事實(shí)標(biāo)準(zhǔn)。對(duì)于選擇香港服務(wù)器的開(kāi)發(fā)者與企業(yè)而言,一個(gè)核心問(wèn)題是:香港服務(wù)器能否完美支持Docker
    的頭像 發(fā)表于 10-21 15:47 ?679次閱讀

    Kubernetes安全加固的核心技術(shù)

    在生產(chǎn)環(huán)境中,Kubernetes集群的安全性直接關(guān)系到企業(yè)數(shù)據(jù)安全和業(yè)務(wù)穩(wěn)定性。本文將從實(shí)戰(zhàn)角度,帶你掌握K8s安全加固的核心技術(shù)。
    的頭像 發(fā)表于 08-18 11:18 ?803次閱讀

    高效管理Kubernetes集群的實(shí)用技巧

    作為一名經(jīng)驗(yàn)豐富的運(yùn)維工程師,我深知在日常的Kubernetes集群管理中,熟練掌握kubectl命令是提升工作效率的關(guān)鍵。今天,我將分享15個(gè)經(jīng)過(guò)實(shí)戰(zhàn)檢驗(yàn)的kubectl實(shí)用技巧,幫助你像藝術(shù)家一樣優(yōu)雅地管理K8s集群。
    的頭像 發(fā)表于 08-13 15:57 ?920次閱讀

    到一:基于Air8000的LuatOS softAP配網(wǎng)功能開(kāi)發(fā)教程

    構(gòu)建穩(wěn)定可靠的網(wǎng)絡(luò)接入方案。 一、SoftAP 概述 ? 文章開(kāi)篇先簡(jiǎn)單介紹下 Air8000 工業(yè)引擎的 AP 模式,一般來(lái)說(shuō),Air8000 工業(yè)引擎使用中支持兩種無(wú)線網(wǎng)絡(luò)工作模式,分別為
    的頭像 發(fā)表于 07-21 17:32 ?598次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>零</b>到一:基于Air8000的LuatOS softAP配網(wǎng)功能<b class='flag-5'>開(kāi)發(fā)</b>教程

    生產(chǎn)環(huán)境中Kubernetes容器安全的最佳實(shí)踐

    隨著容器化技術(shù)的快速發(fā)展,Kubernetes已成為企業(yè)級(jí)容器編排的首選平臺(tái)。然而,在享受Kubernetes帶來(lái)的便利性和可擴(kuò)展性的同時(shí),安全問(wèn)題也日益凸顯。本文將從運(yùn)維工程師的角度,深入探討生產(chǎn)環(huán)境中Kubernetes容器
    的頭像 發(fā)表于 07-14 11:09 ?731次閱讀

    樹(shù)莓派部署 Kubernetes:通過(guò) UDM Pro 實(shí)現(xiàn) BGP 負(fù)載均衡!

    最近,我將家庭實(shí)驗(yàn)室的架構(gòu)核心切換為一組樹(shù)莓派。盡管在樹(shù)莓派上運(yùn)行的Kubernetes發(fā)行版眾多,但在資源受限的設(shè)備上運(yùn)行Kubernetes時(shí),控制平面的開(kāi)銷是一個(gè)常見(jiàn)挑戰(zhàn)
    的頭像 發(fā)表于 06-25 18:00 ?953次閱讀
    樹(shù)莓派部署 <b class='flag-5'>Kubernetes</b>:通過(guò) UDM Pro 實(shí)現(xiàn) BGP 負(fù)載均衡!

    汽車部件開(kāi)發(fā)項(xiàng)目管理

    汽車部件開(kāi)發(fā)項(xiàng)目管理是一個(gè)涉及多環(huán)節(jié)、多部門協(xié)作的復(fù)雜過(guò)程,需項(xiàng)目啟動(dòng)到交付全流程進(jìn)行科學(xué)規(guī)劃與管控。以下 核心流程 、 關(guān)鍵要素 、 管理工具 及 挑戰(zhàn)與應(yīng)對(duì)策略 四方面展開(kāi)說(shuō)
    的頭像 發(fā)表于 06-09 13:26 ?1575次閱讀

    【「基礎(chǔ)開(kāi)發(fā)AI Agent」閱讀體驗(yàn)】+讀《基礎(chǔ)開(kāi)發(fā)AI Agent》掌握扣子平臺(tái)開(kāi)發(fā)智能體方法

    收到發(fā)燒友網(wǎng)站寄來(lái)的《基礎(chǔ)開(kāi)發(fā)AI Agent》這本書已經(jīng)有好些天了,這段時(shí)間有幸拜讀了一下全書,掌握了一個(gè)開(kāi)發(fā)智能體的方法。 該書充分
    發(fā)表于 05-14 19:51

    Kubernetes Helm入門指南

    Helm 是 Kubernetes 的包管理工具,它允許開(kāi)發(fā)者和系統(tǒng)管理員通過(guò)定義、打包和部署應(yīng)用程序來(lái)簡(jiǎn)化 Kubernetes 應(yīng)用的管理工作。Helm 的出現(xiàn)是為了解決在 Kuberne
    的頭像 發(fā)表于 04-30 13:42 ?3084次閱讀
    <b class='flag-5'>Kubernetes</b> Helm入門指南

    Kubernetes中部署MySQL集群

    一般情況下 Kubernetes 可以通過(guò) ReplicaSet 以一個(gè) Pod 模板創(chuàng)建多個(gè) pod 副本,但是它們都是無(wú)狀態(tài)的,任何時(shí)候它們都可以被一個(gè)全新的 pod 替換。
    的頭像 發(fā)表于 03-18 16:22 ?786次閱讀
    <b class='flag-5'>Kubernetes</b>中部署MySQL集群

    Kubernetes包管理工具Helm的安裝和使用

    Helm 可以幫助我們管理 Kubernetes 應(yīng)用程序 - Helm Charts 可以定義、安裝和升級(jí)復(fù)雜的 Kubernetes 應(yīng)用程序,Charts 包很容易創(chuàng)建、版本管理、分享和分布。
    的頭像 發(fā)表于 03-13 16:06 ?2181次閱讀