0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

馬哥Linux運維 ? 來源:分布式實驗室 ? 2023-01-05 11:27 ? 次閱讀

你也許能夠將應用熟練的部署到Kubernetes上,但你知道什么是Operator嗎?Operator是如何工作的?如何構建Operator?這是一個復雜的課題,但幸運的是,自2016年發(fā)明以來,已經開發(fā)了許多相關工具,可以簡化工程師的生活。

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

閑話少說,讓我們深入了解更多關于Operator的知識吧!

1什么是Operator?

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

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

Operator的主要目標是將工程師的邏輯轉換為代碼,以便實現(xiàn)原生Kubernetes無法完成的某些任務的自動化。

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

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

聽起來很有趣不是嗎?讓我們動手干吧。

2構建Operator

可以使用Kubernetes開發(fā)的controller-runtime項目從頭構建Operator,也可以使用最流行的框架之一加速開發(fā)周期并降低復雜性(Kubebuilder或OperatorSDK)。因為Kubebuilder框架非常容易使用,文檔也很容易閱讀,而且久經考驗,因此我選擇基于Kubebuilder構建。

不管怎樣,這兩個項目目前正在合并為單獨的項目。

設置開發(fā)環(huán)境

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

  • Gov1.17.9+

  • Docker17.03+

  • kubectlv1.11.3+

  • 訪問Kubernetes v1.11.3+集群(強烈建議使用kind設置自己的本地集群,它非常容易使用?。?/span>

然后安裝kubebuilder:


	

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

如果一切正常,應該會看到類似輸出(版本可能會隨時間發(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)在可以開始了!

構建簡單的Operator

接下來做個小練習,構建一個簡單的foo operator,除了演示Operator的功能之外,沒有實際用處。

運行以下命令初始化新項目,該命令將下載controller-runtime二進制文件,并為我們準備好項目。


	
		$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 ...下面是項目結構(注意這是一個Go項目):

	

$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

我們來看看這個Operator最重要的組成部分:
  • main.go是項目入口,負責設置并運行管理器。

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

  • Dockerfile是用于構建管理器鏡像的容器文件。

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

這涉及到部分理論知識,我們稍后再說!

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

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

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

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

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

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

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

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

在Kubernetes的文檔中舉了一個控制器的例子:恒溫器。當我們設置溫度時,告訴恒溫器所需的狀態(tài),房間的實際溫度就是當前的實際狀態(tài),恒溫器通過打開或關閉空調,使實際狀態(tài)更接近預期狀態(tài)。

那管理器(manager)呢?該組件的目標是啟動所有控制器,并使控制循環(huán)共存。假設項目中有兩個CRD,同時有兩個控制器,每個CRD對應一個控制器,管理器將啟動這兩個控制器并使它們共存。

現(xiàn)在我們知道了Operator是如何工作的,可以開始使用Kubebuilder框架創(chuàng)建一個Operator,我們從創(chuàng)建新的API(組/版本)和新的Kind(CRD)開始,當提示創(chuàng)建CRD和控制器時,按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="./..."

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

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

自定義CRD和Controller

接下來定制我們可愛的Foo CRD。正如前面所說,這個CRD沒有任何目的,只是簡單展示如何使用Operator在Kubernetes中執(zhí)行簡單的任務。

Foo CRD在其定義中有name字段,該字段指的是Foo正在尋找的朋友的名稱。如果Foo找到了一個朋友(一個和朋友同名的Pod),happy狀態(tài)將被設置為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{}) }

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

注意,控制器也會對Pod事件做出反應。實際上,如果創(chuàng)建了一個新的Pod,我們希望Foo資源能夠相應更新其狀態(tài)。這個方法將在每次發(fā)生Pod事件時被觸發(fā)(創(chuàng)建、更新或刪除)。然后,只有當Pod名稱是集群中部署的某個Foo自定義資源的“朋友”時,才觸發(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 }

我們已經完成了對API定義和控制器的編輯,可以運行以下命令來更新Operator manifest。


	

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

運行Controller

我們使用Kind設置本地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已經創(chuàng)建好了。

	

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

然后終端中運行控制器。請記住,也可以將其部署為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}

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

測試控制器

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

首先,在config/samples中創(chuàng)建Foo自定義資源清單,運行以下命令在本地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

可以看到控制器為每個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:

接下來我們部署一個叫jack的Pod來觀察系統(tǒng)的反應。

	

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

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

	

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"}

我們更新第二個Foo自定義資源規(guī)范,將其name字段的值從joe更改為jack,控制器應該捕獲更新事件并觸發(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,成功了!我們已經做了足夠多的實驗,你應該明白這是怎么回事了!如果刪除名為jack的pod,自定義資源的happy狀態(tài)將被設置為false。

我們可以確認Operator是正常工作的!最好再編寫一些單元測試和端到端測試,但本文不會覆蓋相關內容。

為自己感到驕傲吧,你已經設計、部署并測試了第一個Operator!恭喜??!

如果需要瀏覽完整代碼,請訪問:

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

3更多工作

我們已經看到如何創(chuàng)建非?;镜腒ubernetes operator,但遠非完美,還有很多地方需要改善,下面是可以探索的主題列表:

  • 優(yōu)化事件過濾(有時,事件會被提交兩次……)。

  • 完善RBAC權限。

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

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

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

  • 編寫單元測試和端到端測試。

通過這個列表,可以深入挖掘這一主題。

審核編輯 :李倩


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

    關注

    29

    文章

    5722

    瀏覽量

    81129
  • kubernetes
    +關注

    關注

    0

    文章

    236

    瀏覽量

    8903

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

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦

    Kubernetes負載均衡器MetalLB介紹

    Kubernetes中一個應用服務會有一個或多個實例,每個實例(Pod)的IP地址由網(wǎng)絡插件動態(tài)隨機分配(Pod重啟后IP地址會改變)。為屏蔽這些后端實例的動態(tài)變化和對多實例的負載均衡,引入了 Service這個資源對象。
    的頭像 發(fā)表于 03-18 16:24 ?232次閱讀
    <b class='flag-5'>Kubernetes</b>負載均衡器MetalLB介紹

    Kubernetes中部署MySQL集群

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

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

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

    知開源平臺重磅升級!嵌入式開發(fā)進入“渦輪增壓”時代

    本帖最后由 PCB56242069 于 2025-3-11 13:44 編輯 ?親愛的開發(fā)者們,我們帶來革命性的開發(fā)工具升級!知開源平臺全新編譯引擎正式發(fā)布,讓代碼編譯效率實現(xiàn)300%的飛躍
    發(fā)表于 03-11 11:22

    Kubernetes Pod常用管理命令詳解

    Kubernetes Pod常用管理命令詳解
    的頭像 發(fā)表于 02-17 14:06 ?314次閱讀
    <b class='flag-5'>Kubernetes</b> Pod常用管理命令詳解

    Kubernetes:構建高效的容器化應用平臺

    init初始化集群,按照提示配置kubeconfig文件,它包含集群連接信息。節(jié)點通過kubeadm join命令加入集群。 Pod 是 Kubernetes 中最小的可部署單元,一個 Pod 可以包含一
    的頭像 發(fā)表于 01-23 15:22 ?236次閱讀

    使用 Flexus 云服務器 X 實例部署 Kubernetes 圖形化管理平臺

    Kubernetes 作為當今最流行的容器編排平臺,隨著云計算、微服務架構和 DevOps 文化的普及,Kubernetes 在自動化部署、擴展和管理容器化應用程序方面扮演著越來越重要的角色。未來
    的頭像 發(fā)表于 01-21 16:14 ?240次閱讀
    使用 Flexus 云服務器 X 實例部署 <b class='flag-5'>Kubernetes</b> 圖形化管理平臺

    Kubernetes的CNI網(wǎng)絡插件之flannel

    Kubernetes設計了網(wǎng)絡模型,但卻將它的實現(xiàn)講給了網(wǎng)絡插件,CNI網(wǎng)絡插件最重要的功能就是實現(xiàn)Pod資源能夠跨主機通信。
    的頭像 發(fā)表于 01-02 09:43 ?629次閱讀

    艾體寶與Kubernetes原生數(shù)據(jù)平臺AppsCode達成合作

    虹科姐妹公司艾體寶宣布與Kubernetes 原生數(shù)據(jù)平臺 AppsCode達成正式合作,致力于將其核心產品KubeDB引入中國市場,為企業(yè)提供專業(yè)、高效的云原生數(shù)據(jù)庫管理解決方案。
    的頭像 發(fā)表于 12-16 15:07 ?498次閱讀

    OpenAI計劃明年1月發(fā)布全新AI助理產品“Operator

    近日,據(jù)可靠知情人士透露,OpenAI正在緊鑼密鼓地籌備一款全新的AI助理產品,代號為“Operator”。這款創(chuàng)新性的AI助理產品被設計為能夠自動執(zhí)行各種復雜操作,旨在為用戶提供更加便捷、高效
    的頭像 發(fā)表于 11-15 13:34 ?658次閱讀

    OpenAI計劃明年1月發(fā)布首款AI助理產品“Operator

    近日,據(jù)內部知情人士透露,OpenAI正緊鑼密鼓地籌備著一款全新的AI助理產品,代號為“Operator”。這款AI助理產品被設計為能夠自動執(zhí)行各種復雜操作,為用戶帶來前所未有的便捷體驗。 據(jù)悉
    的頭像 發(fā)表于 11-14 14:03 ?928次閱讀

    Kubernetes集群搭建容器云需要幾臺服務器?

    Kubernetes集群搭建容器云需要幾臺服務器?至少需要4臺服務器。搭建容器云所需的服務器數(shù)量以及具體的搭建步驟,會根據(jù)所選用的技術棧、業(yè)務規(guī)模、架構設計以及安全需求等因素而有所不同。以下是一個基于Kubernetes集群的容器云搭建的概述:
    的頭像 發(fā)表于 10-21 10:06 ?346次閱讀

    我用了3分鐘,實現(xiàn)了單片機的點燈開發(fā)

    ARM Cortex M0 + 處理器,264KB 的 SRAM ,運行頻率高達 133MHz USB Type-C 電源及數(shù)據(jù)接口 如何用3分鐘實現(xiàn)點亮LED燈? 對于一切單片機的入門開發(fā),
    發(fā)表于 09-27 15:51

    使用Velero備份Kubernetes集群

    Velero 是 heptio 團隊(被 VMWare 收購)開源的 Kubernetes 集群備份、遷移工具。
    的頭像 發(fā)表于 08-05 15:43 ?494次閱讀
    使用Velero備份<b class='flag-5'>Kubernetes</b>集群

    如何使用Kubeadm命令在PetaExpress Ubuntu系統(tǒng)上安裝Kubernetes集群

    Kubernetes,通常縮寫為K8s,是一個開源的容器編排平臺,旨在自動化容器化應用的部署、擴展和管理。有了Kubernetes,您可以輕松地部署、更新和擴展應用,而無需擔心底層基礎設施。
    的頭像 發(fā)表于 07-15 13:31 ?1001次閱讀
    如何使用Kubeadm命令在PetaExpress Ubuntu系統(tǒng)上安裝<b class='flag-5'>Kubernetes</b>集群

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品