当前位置:网站首页 > 容器化与Kubernetes > 正文

kubectl作用(kubernetes的作用)



为了理解什么是Operator,让我们先复习一下Kubernetes。Kubernetes实际是期望状态管理器。先在Kubernetes中指定应用程序期望状态(实例数,磁盘空间,镜像等),然后它会尝试把应用维持在这种状态。Kubernetes的控制平面运行在Master节点上,它包含数个controller以调和应用达到期望状态:

  • 检查当前的实际状态(Pod、Deployment等)
  • 将实际状态与spec期望状态进行比较
  • 如果实际状态与期望状态不一致,controller将会尝试协调实际状态以达到一致

比如,通过RS定义Pod拥有3个副本。当其中一个Pod down掉时,Kubernetes controller通过wacth API发现期望运行3个副本,而实际只有2个副本在运行。于是它新创建出一个Pod实例。

Kubernetes的功能结构 kubernetes operator介绍_kubernetes

  • 通过Kubectl命令发送对象spec定义(Pod,Deployment等)到Kubernetes Master节点的API服务
  • Master节点调度对象运行
  • 一旦对象运行,controller会持续检查对象并根据spec协调实际情况

举一个有状态应用的例子。假如一个数据库应用运行在多个节点上。如果超过半数的节点出现故障,则需要按照特定步骤从特定快照中加载数据。使用原生Kubernetes对象类型和controller则难以实现。或者为有状态应用程序扩展节点,升级到新版本或灾难恢复。这些类型的操作通常需要非常具体的步骤,并且通常需要手动干预。

使用 CRD 定制资源后,仅仅是让 Kubernetes 能够识别定制资源的身份。创建定制资源实例后,Kubernetes 只会将创建的实例存储到数据库中,并不会触发任何业务逻辑。在 数据库保存定制资源实例是没有意义的,如果需要进行业务逻辑控制,就需要创建控制器。

Kubernetes的功能结构 kubernetes operator介绍_java_02

Operator 其实就是图中除了 API Server 和 etcd 的剩余部分。由于 Client、Informer 和 WorkQueue 是高度相似的,所以有很多项目可以自动化生成 Controller 之外的业务逻辑(如 Client、Informer、Lister),因此用户只需要专注于 Controller 中的业务逻辑即可。

Kubernetes的功能结构 kubernetes operator介绍_API_03

Operator通过Custom Controller协调应用spec。虽然API服务知道Custom Controller,但Operator可以独立运行在集群内部或外部。

为了创建自定义Operator,我们需要如下资源:

  1. Custom Resource(CR)spec,定义我们要观测的应用对象,以及为CR定义的API
  2. Custom Controller,用来观测CR
  3. Custom code,决定Custom Controller如何协调CR
  4. Operator,管理Custom Controller
  5. Deployment,定义Operator和自定义资源

所有上述内容都可以通过手工编写Go代码和spec,或通过kubebuilder等工具生成Kubernetes API。但最简单的方式(也是我们在这里使用的方法)是使用CoreOS operator-sdk为这些组件生成模版。它允许您通过CLI命令生成spec、controller以及Operator框架。一旦生成后,您可以在spec中定义自定义字段并编写协调的自定义代码。我们将在本教程的下一部分中展开介绍。

如果生态系统中没可以实现你目标的 Operator,你可以自己编写代码。

你还可以使用任何支持 Kubernetes API 客户端 的语言或运行时来实现 Operator(即控制器)。

以下是一些库和工具,你可用于编写自己的云原生 Operator。

  • 高级API和抽象,更直观地编写操作逻辑
  • 用于脚手架和代码生成的工具,可以快速引导新项目
  • 扩展以涵盖常见的操作员用例

SDK提供以下工作流程来开发新的Operator:

  • 使用SDK命令行界面(CLI)创建新的Operator项目
  • 通过添加自定义资源定义(CRD)定义新资源API
  • 使用SDK API监控指定的资源
  • 在指定的处理程序中定义Operator协调逻辑(对比期望状态与实际状态),并使用SDK API与资源进行交互
  • 使用SDK CLI构建并生成Operator部署manifests
    Operator使用SDK在用户自定义的处理程序中以高级API处理监视资源的事件,并采取措施来reconcile(对比期望状态与实际状态)应用程序的状态。

先给出我的环境,注意operator-sdk支持通过代码安装,在window上通过idea等工具搭配golang开发,有环境的可直接使用macos。

前置安装

  • 安装gcc和make。
  • 安装golang1.17以上版本。
  • 一个可进入的公共的docker registry服务,并且准备一个域名作为registry服务的域名。
安装gcc和make

window下直接安装cygwin,选择gcc和make等组件即可,我已经提前安装,如果不知道怎么安装可参考:。

golang

安装 golang 17以上版本

我这直接解压在/root下,/etc/profile添加环境变量

让配置生效 并修改golang的私服

检测是否安装成功

安装docker
安装docker registry

这里为了简单,就不设置账号密码权限了。

检测存在的镜像

在开发的window和k8s的worker节点 linux(/etc/docker/daemon.json)设置,改后重启;

在开发的本地机器和k8s的worker节点绑定hosts

测试上传一个镜像

安装kubectl

让开发的机器可以通过kubectl访问集群,一般用window开发的 话,新版的docker desktop都带上内置的k8s,自然自带kubectl命令,可将远程k8s集群的初始化时生成的config文件拷贝到出来

一般就是/etc/kubernetes/admin.conf,放到window的 %USERPROFILE%/.kube/config文件即可

Kubernetes的功能结构 kubernetes operator介绍_kubernetes_04

安装operator-sdk

window下升级go go get golang.org/dl/go && go download 下载完成后,window下直接安装在,%USERPROFILE%sdk 目录下,可直接修改path到 %USERPROFILE%sdkgobin目录下。

安装完成后

operator-sdk实例

  1. 如果不存在即创建一个nginx Deployment
  2. 确保deploy的大小和CR文件制定的大小一致
  3. 更新nginx CR的状态(同步名字相同的PODS状态)
创建项目

初始化一个新的项目包含以下内容 :

  • go.mod 项目依赖。
  • PROJECT 存储项目的配置。
  • Makefile 一些常用的make targets。
  • config目录下许多YAML files 用于项目发布。
  • main.go 用于创建 manager,运行项目controllers。

更加详细的目录结果信息可查看kubebuilder文档:https://book.kubebuilder.io/cronjob-tutorial/basic-project.html

创建api

通过脚手架生成一个crd和controller的api,没有没有指定–resource --controller,将会通过交互通过用户确认是否生成,命令执行时相关的golang依赖将自动下载安装。

通过错误可以知道是在执行make generate时下载sigs.k8s.io/controller-tools/cmd/controller-gen@v0.8.0报错,错误是GOBIN must be an absolute path,说明GOBIN对应的路径是错的导致下载的包无法写入,通过查看Makefile的generate任务会调用一个自定义函数go-get-tool

Kubernetes的功能结构 kubernetes operator介绍_docker_05

执行命令

该命令会执行controller-gen 工具更新 api/v1alpha1/zz_generated.deepcopy.go

执行命令

将执行 controller-gen生成 CRD文件: config/crd/bases/test.jiaozi.com_helloworlds.yaml

生成的crd文件和定义的go代码是一致的

实现controller

开发过程中使用的api接口包参考:

  1. corev1 “k8s.io/api/core/v1” 核心api,提供核心结构和接口,yaml中常用的Spec定义在此。
  2. metav1 “k8s.io/apimachinery/pkg/apis/meta/v1” yaml中常用的metadata定义,ObjectMeta,LabelSelector等基本在此。
  3. appsv1 “k8s.io/api/apps/v1” 常用的创建的crd或者已经存在的rd等都在此,比如Deployments,Pod,Service等等。

实现controller代码

运行operator

运行operator支持以下三种方式。

  1. controller作为一个go应用运行在集群之外方式运行。
  2. 作为一个deployment直接将程序打包成镜像运行在集群内部。
  3. 使用oolm方式部署。

注意这里运行operator实际上是有3步

  1. 将crd的定义安装到集群。
  2. 运行controller监控cr的资源创建/删除/修改等,实际运行的程序就是运行controller,controller可以运行在集群外和集群内均可。
  3. 创建一个cr,触发controller。
修改配置

修改为你自己的registry私服

将基础镜像

替换为:

执行命令,构建镜像,推送到私服

打印日志

HelloWorldReconciler结构体定义添加Log

可在方法中使用

  • r.Log.Info(“crd资源已经被删除”) 打印info日志
  • r.Log.Error(“异常信息”) 打印error日志
安装crd

查看安装

查看定义

运行controller

运行controller watch cr的创建/删除/修改

在项目根目录创建一个cr 使用命令执行

查看deploy和pod的个数

调试controller

首先生成exe文件

Kubernetes的功能结构 kubernetes operator介绍_API_06

打开idea help-edit custom properties,新增dlv参数位置(该步骤省略):

执行dlv命令开放2345端口

Kubernetes的功能结构 kubernetes operator介绍_API_07

Kubernetes的功能结构 kubernetes operator介绍_Kubernetes的功能结构_08

到此这篇kubectl作用(kubernetes的作用)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 特征工程的重要性(特征工程重要性评分及可视化代码)2026-04-28 11:09:10
  • cruise软件汉化(cruise安装包百度云)2026-04-28 11:09:10
  • kubelete 资源限制(kubernetes有哪些资源对象)2026-04-28 11:09:10
  • 单片机程序破解工程化(单片机破解工具)2026-04-28 11:09:10
  • 字体转图案生成器(字体转化生成器)2026-04-28 11:09:10
  • docker启动镜像容器命令(docker 使用镜像)2026-04-28 11:09:10
  • vb法和mo法解释h2(化学中vb法的解释)2026-04-28 11:09:10
  • 一级WPS Word首行缩进技巧:快速美化文档排版二级WPS Word首行缩进技巧:快速美化文档排版怎么设置缩进(一级WPS Word首行缩进技巧:快速美化文档排版二级WPS Word首行缩进技巧:快速美化文档排版怎么设置缩进2个字符)2026-04-28 11:09:10
  • kubernetes英文发音(kubesphere怎么读)2026-04-28 11:09:10
  • kubernetes发音(kubectl发音)2026-04-28 11:09:10
  • 全屏图片