0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何从零开发Kubernetes Operator?

马哥Linux运维 来源:分布式实验室 2023-01-05 11:27 次阅读

你也许能够将应用熟练的部署到Kubernetes上,但你知道什么是Operator吗?Operator是如何工作的?如何构建Operator?这是一个复杂的课题,但幸运的是,自2016年发明以来,已经开发了许多相关工具,可以简化工程师的生活。

这些工具允许我们将自定义逻辑加入Kubernetes,从而自动化大量任务,而这已经超出了软件本身功能的范围。

闲话少说,让我们深入了解更多关于Operator的知识吧!

1什么是Operator?

等一下,你知道Kubernetes(或k8s)吗?简单介绍一下,这是由谷歌云开发的“可以在任何地方部署、扩展和管理容器应用程序的开源系统”。

大多数人使用Kubernetes的方式是使用原生资源(如Pod、Deployment、Service等)部署应用程序。但是,也可以扩展Kubernetes的功能,从而添加满足特定需求的新业务逻辑,这就是Operator的作用。

Operator的主要目标是将工程师的逻辑转换为代码,以便实现原生Kubernetes无法完成的某些任务的自动化。

负责开发应用程序或服务的工程师对系统应该如何运行、如何部署以及如何在出现问题时做出反应有很深的了解。将这些技术知识封装在代码中并自动化操作的能力意味着在可以花费更少的时间处理重复任务,而在重要问题上可以投入更多时间。

例如,可以想象Operator在Kubernetes中部署和维护MySQL、Elasticsearch或Gitlab runner等工具,Operator可以配置这些工具,根据事件调整系统状态,并对故障做出反应。

听起来很有趣不是吗?让我们动手干吧。

2构建Operator

可以使用Kubernetes开发的controller-runtime项目从头构建Operator,也可以使用最流行的框架之一加速开发周期并降低复杂性(Kubebuilder或OperatorSDK)。因为Kubebuilder框架非常容易使用,文档也很容易阅读,而且久经考验,因此我选择基于Kubebuilder构建。

不管怎样,这两个项目目前正在合并为单独的项目。

设置开发环境

开发Operator需要以下必备工具:

  • Gov1.17.9+

  • Docker17.03+

  • kubectlv1.11.3+

  • 访问Kubernetes v1.11.3+集群(强烈建议使用kind设置自己的本地集群,它非常容易使用!)

然后安装kubebuilder:


	

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

如果一切正常,应该会看到类似输出(版本可能会随时间发生变化):


	

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

太棒了,现在可以开始了!

构建简单的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自定义类型”或资源蓝图,用于描述其规范和状态。我们可以定义CRD的实例,称为自定义资源(CR,Custom Resource)。

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

图1. 自定义资源定义(CRD)和自定义资源(CR)

控制器(也称为控制循环)持续监视集群状态,并根据事件做出变更,目标是将资源的当前状态变为用户在自定义资源规范中定义的期望状态。

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

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

一般来说,控制器是特定于某种类型的资源的,但也可以对一组不同的资源执行CRUD(创建、读取、更新和删除)操作。

在Kubernetes的文档中举了一个控制器的例子:恒温器。当我们设置温度时,告诉恒温器所需的状态,房间的实际温度就是当前的实际状态,恒温器通过打开或关闭空调,使实际状态更接近预期状态。

那管理器(manager)呢?该组件的目标是启动所有控制器,并使控制循环共存。假设项目中有两个CRD,同时有两个控制器,每个CRD对应一个控制器,管理器将启动这两个控制器并使它们共存。

现在我们知道了Operator是如何工作的,可以开始使用Kubebuilder框架创建一个Operator,我们从创建新的API(组/版本)和新的Kind(CRD)开始,当提示创建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和控制器来满足需求,注意看已经创建了两个新文件夹:
  • api/v1包含Foo CRD

  • controllers包含Foo控制器

自定义CRD和Controller

接下来定制我们可爱的Foo CRD。正如前面所说,这个CRD没有任何目的,只是简单展示如何使用Operator在Kubernetes中执行简单的任务。

Foo CRD在其定义中有name字段,该字段指的是Foo正在寻找的朋友的名称。如果Foo找到了一个朋友(一个和朋友同名的Pod),happy状态将被设置为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{}) }

接下来实现控制器逻辑。没什么复杂的,通过触发reconciliation请求获取Foo资源,从而得到Foo的朋友的名称。然后,列出所有和Foo的朋友同名的Pod。如果找到一个或多个,将Foo的happy状态更新为true,否则设置为false。

注意,控制器也会对Pod事件做出反应。实际上,如果创建了一个新的Pod,我们希望Foo资源能够相应更新其状态。这个方法将在每次发生Pod事件时被触发(创建、更新或删除)。然后,只有当Pod名称是集群中部署的某个Foo自定义资源的“朋友”时,才触发Foo控制器的reconciliation循环。


	

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已经创建好了。

	

$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控制器也启动了,控制器现在正在运行并监听事件!

测试控制器

为了测试是否一切工作正常,我们创建两个Foo自定义资源以及一些pod,观察控制器的行为。

首先,在config/samples中创建Foo自定义资源清单,运行以下命令在本地Kubernetes集群中创建资源。


	

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自定义资源创建事件触发了reconciliation循环。

	

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自定义资源状态,可以看到状态为空,这正是所期望的,目前为止一切正常!

	

$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来观察系统的反应。

	

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

Pod部署完成后,应该可以看到控制器对Pod创建事件作出响应,然后按照预期更新第一个Foo自定义资源状态,可以通过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自定义资源规范,将其name字段的值从joe更改为jack,控制器应该捕获更新事件并触发reconciliation循环。

	

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状态将被设置为false。

我们可以确认Operator是正常工作的!最好再编写一些单元测试和端到端测试,但本文不会覆盖相关内容。

为自己感到骄傲吧,你已经设计、部署并测试了第一个Operator!恭喜!!

如果需要浏览完整代码,请访问:

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

3更多工作

我们已经看到如何创建非常基本的Kubernetes operator,但远非完美,还有很多地方需要改善,下面是可以探索的主题列表:

  • 优化事件过滤(有时,事件会被提交两次……)。

  • 完善RBAC权限。

  • 改进日志记录系统。

  • 当operator更新资源时,触发Kubernetes事件。

  • 获取Foo自定义资源时添加自定义字段(也许显示happy状态?)

  • 编写单元测试和端到端测试。

通过这个列表,可以深入挖掘这一主题。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 自动化
    +关注

    关注

    28

    文章

    5040

    浏览量

    77733
  • kubernetes
    +关注

    关注

    0

    文章

    219

    浏览量

    8568

原文标题:如何从零开发Kubernetes Operator?

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Kubernetes RBAC:掌握权限管理的精髓

    Kubernetes RBAC(Role-Based Access Control)是 Kubernetes 中一项关键的安全功能,它通过细粒度的权限控制机制,确保集群资源仅被授权的用户或服务账号访问。
    的头像 发表于 12-25 09:43 201次阅读

    Kubernetes开发指南之深入理解CRD

    CRD本身是Kubernetes内置的资源类型,全称是CustomResourceDefinition,可以通过命令查看,kubectl get查看集群内定义的CRD资源。
    的头像 发表于 12-13 18:19 387次阅读
    <b class='flag-5'>Kubernetes</b><b class='flag-5'>开发</b>指南之深入理解CRD

    戴尔科技再次荣获Kubernetes数据存储领导者

    近日,国际权威研究机构GigaOm公布了《2023企业级Kubernetes存储雷达报告》戴尔科技集团连续两年被评为Kubernetes数据存储领导者。
    的头像 发表于 10-26 10:16 408次阅读
    戴尔科技再次荣获<b class='flag-5'>Kubernetes</b>数据存储领导者

    Jenkins pipeline是如何连接Kubernetes的呢?

    Kubernetes 是一个开源的容器编排平台,可以帮助开发团队管理和部署容器化的应用程序。
    的头像 发表于 10-23 11:13 1500次阅读
    Jenkins pipeline是如何连接<b class='flag-5'>Kubernetes</b>的呢?

    什么是OperatorOperator是如何工作的?如何构建Operator

    你也许能够将应用熟练的部署到 Kubernetes 上,但你知道什么是 Operator 吗?Operator 是如何工作的?如何构建 Operator?这是一个复杂的课题,但幸运的是
    的头像 发表于 09-01 15:35 621次阅读

    Kubernetes Pod如何获取IP地址呢?

    Kubernetes 网络模型的核心要求之一是每个 Pod 都拥有自己的 IP 地址并可以使用该 IP 地址进行通信。很多人刚开始使用 Kubernetes 时,还不清楚如何为每个 Pod 分配 IP 地址。
    的头像 发表于 07-21 10:00 540次阅读
    <b class='flag-5'>Kubernetes</b> Pod如何获取IP地址呢?

    Commvault:护航Kubernetes,不止Kubernetes

    Kubernetes已经不再是只存在于路线图中的未来产品。事实上,几乎所有(94%)已经采用容器的企业都在使用Kubernetes,大多数(86%)企业甚至认为它对他们的运营至关重要。这并不令人意外,Kubernetes正在帮助
    的头像 发表于 07-07 14:42 307次阅读

    ChatGPT团队是如何使用Kubernetes

    在本文中,OpenAI 的工程师团队分享了他们在 Kubernetes 集群扩展过程中遇到的各种挑战和解决方案,以及他们取得的性能和效果。
    的头像 发表于 07-06 11:17 330次阅读
    ChatGPT团队是如何使用<b class='flag-5'>Kubernetes</b>的

    Awesome 工具如何更好地管理Kubernetes

    应用程序,那么 Kubernetes 是必备工具之一。有数百种工具可与 Kubernetes 配合使用以添加更多功能。我说的是用于更好地管理,安全性,仪表板和 Kubernetes 集群监控的工具
    的头像 发表于 06-25 16:12 365次阅读
    Awesome 工具如何更好地管理<b class='flag-5'>Kubernetes</b>

    各种网络组件在 Kubernetes 集群中是如何交互的

    Kubernetes 中有多种网络设置方法,以及 container runtime 的各种选项。这篇文章将使用 Flannel 作为 network provider,并使用 Containered 作为 container runtime。
    的头像 发表于 05-23 09:49 565次阅读
    各种网络组件在 <b class='flag-5'>Kubernetes</b> 集群中是如何交互的

    Kubernetes 监控利器功能特性

    Kubeshark 是专为 Kubernetes 设计的 API 流量分析器,它提供实时的 K8s 协议级别的可见性,可以捕获和监控所有在容器、Pod、节点和集群之间进出和流动的流量和负载。可以把它想象成专门针对 Kubernetes 重新发明的 TCPDump 和 Wi
    的头像 发表于 05-17 16:10 404次阅读
    <b class='flag-5'>Kubernetes</b> 监控利器功能特性

    Kubernetes Pod如何独立工作

    在学习 Kubernetes 网络模型的过程中,了解各种网络组件的作用以及如何交互非常重要。本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod 都能获取 IP 地址。
    的头像 发表于 05-16 14:29 435次阅读
    <b class='flag-5'>Kubernetes</b> Pod如何独立工作

    Kubernetes多租户集群的概念和常见的应用模式

    KaaS 多租户方案通常与云服务提供商有关。在这种场景下,业务平台的服务通过 Kubernetes 控制平面直接暴露给不同租户的用户。最终用户可以使用服务提供商提供的 Kubernetes API 或其他扩展 API。
    的头像 发表于 05-15 16:13 881次阅读
    <b class='flag-5'>Kubernetes</b>多租户集群的概念和常见的应用模式

    Kubernetes特性有哪些?

    本文将介绍Kubernetes 的重要特性,这将有助于您更深入地了解 Kubernetes 的功能概念。
    的头像 发表于 05-12 16:16 661次阅读
    <b class='flag-5'>Kubernetes</b>特性有哪些?

    Kubernetes是怎样工作的?

    Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明式配置和自动化,它拥有庞大且快速发展的生态系统,Kubernetes 服务、支持和工具随处可见
    的头像 发表于 05-12 16:13 319次阅读
    <b class='flag-5'>Kubernetes</b>是怎样工作的?