kubectl作用(kubernetes的作用)

kubectl作用(kubernetes的作用)Operator 是 Kubernetes 的扩展软件 它利用 定制资源 管理应用及其组件 Operator 遵循 Kubernetes 的理念 特别是在控制器 方面 Operator 操作那些有状态的基础设施服务 包括 组件升级 节点恢复 调整集群规模 一个理想化的运维平台必须是 Operator 自己维护有状态应用 并将人工干预降低到最低限度 为了理解什么是 Operator

大家好,我是讯享网,很高兴认识大家。



为了理解什么是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目录下。

安装完成后

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

小讯
上一篇 2025-05-01 11:00
下一篇 2025-06-07 08:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/198543.html