Go语言在云计算、大数据、微服务、高并发领域应用应用非常广泛.BAT大厂正在把Go作为新项目开发的首选语言.
Go语言应用范围:
①.、服务端开发:以前你使用C或者C◆◆做的那些事情,用Go来做很合适,例如日志处理、文件系统、监控系统等;
scheduler: 调度器 根据调度算法,将请求资源调度到某一个node节点.
etcd: 分布式存储组件,用于存储资源对象.
docker: 运行容器的基础环境,容器引擎.
kubelet: 每个node节点都存在一份,在node节点上的资源操作指令均由kubelet执行,从etcd扫描相关请求,在节点上执行请求.
kube-proxy: 代理服务,负载均衡
fluentd: 日志收集服务
特点:
pod是一个虚拟化的分组(有自己的ip地址、主机名),pod相当于独立主机,可以封装一个或多个容器.通常情况下,一个pod中要么部署一个服务,要么部署多个相关的服务
①.、pod底层网络和数据存储:
pod底层网络和存储主要依赖pause容器,该容器作用如下:
在 Kubernetes 的监控方案中我们经常会使用到一个Promethues Operator的项目,该项目可以让我们更加方便的去使用 Prometheus,而不需要直接去使用最原始的一些资源对象,比如 Pod、Deployment,随着 Prometheus Operator 项目的成功,CoreOS 公司开源了一个比较厉害的工具:Operator Framework,该工具可以让开发人员更加容易的开发 Operator 应用.
在本篇文章中我们会为大家介绍一个简单示例来演示如何使用 Operator Framework 框架来开发一个 Operator 应用.
Kubernetes Operator
Operator 是由 CoreOS 开发的,用来扩展 Kubernetes API,特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统.Operator 基于 Kubernetes 的资源和控制器概念之上构建,但同时又包含了应用程序特定的领域知识.创建Operator 的关键是CRD(自定义资源)的设计.
Operator Framework
Operator Framework 同样也是 CoreOS 开源的一个用于快速开发 Operator 的工具包,该框架包含两个主要的部分:
Workflow
Operator SDK 提供以下工作流来开发一个新的 Operator:
Demo
我们平时在部署一个简单的 Webserver 到 Kubernetes 集群中的时候,都需要先编写一个 Deployment 的控制器,然后创建一个 Service 对象,通过 Pod 的 label 标签进行关联,最后通过 Ingress 或者 type=NodePort 类型的 Service 来暴露服务,每次都需要这样操作,是不是略显麻烦,我们就可以创建一个自定义的资源对象,通过我们的 CRD 来描述我们要部署的应用信息,比如镜像、服务端口、环境变量等等,然后创建我们的自定义类型的资源对象的时候,通过控制器去创建对应的 Deployment 和 Service,是不是就方便很多了,相当于我们用一个资源清单去描述了 Deployment 和 Service 要做的两件事情.
这里我们将创建一个名为 AppService 的 CRD 资源对象,然后定义如下的资源清单进行应用部署:
开发环境
环境需求
要开发 Operator 自然 Kubernetes 集群是少不了的,还需要 Golang 的环境,这里的安装就不多说了,然后还需要一个 Go 语言的依赖管理工具包:dep,由于 Operator SDK 是使用的 dep 该工具包,所以需要我们提前安装好,可以查看资料:,另外一个需要说明的是,由于 dep 去安装的时候需要去谷歌的网站拉取很多代码,所以正常情况下的话是会失败的,需要做什么工作大家应该清楚吧?要科学.
安装 operator-sdk
演示
创建新项目
环境准备好了,此时此刻呢就可以使用 operator-sdk 直接创建一个新的项目了,命令格式为: operator-sdk new
按照上面我们预先定义的 CRD 资源清单,我们这里可以这样创建:
到这里一个全新的 Operator 项目就新建完成了.
项目结构
使用operator-sdk new命令创建新的 Operator 项目后,项目目录就包含了很多生成的文件夹和文件.
我们主要需要编写的是 pkg 目录下面的 api 定义以及对应的 controller 实现.
添加 API
此时此刻呢为我们的自定义资源添加一个新的 API,按照上面我们预定义的资源清单文件,在 Operator 相关根目录下面执行如下命令:
添加完成后,我们可以看到类似于下面的这样项目结构:
添加控制器
上面我们添加自定义的 API,此时此刻呢可以添加对应的自定义 API 的具体实现 Controller,同样在项目根目录下面执行如下命令:
这样整个 Operator 项目的脚手架就已经搭建完成了,此时此刻呢就是具体的实现了.
自定义 API
打开源文件pkg/apis/app/v1/appservice_types.go,需要我们根据我们的需求去自定义结构体 AppServiceSpec,我们最上面预定义的资源清单中就有 size、image、ports 这些属性,所有我们需要用到的属性都需要在这个结构体中进行定义:
代码中会涉及到一些包名的导入,由于包名较多,所以我们会使用一些别名进行区分,主要的包含下面几个:
然后一个比较重要的结构体AppServiceStatus用来描述资源的状态,当然我们可以根据需要去自定义状态的描述,我这里就偷懒直接使用 Deployment 的状态了:
定义完成后,在项目根目录下面执行如下命令:
改命令是用来根据我们自定义的 API 描述来自动生成一些代码,目录pkg/apis/app/v1/下面以zz_generated开头的文件就是自动生成的代码,里面的内容并不需要我们去手动编写.
实现业务逻辑
NewDeploy 方法实现如下:
newService 对应的方法实现如下:
这样我们就实现了 AppService 这种资源对象的业务逻辑.
调试
如果我们本地有一个可以访问的 Kubernetes 集群,我们也可以直接进行调试,在本地用户~/.kube/config文件中配置集群访问信息,下面的信息表明可以访问 Kubernetes 集群:
首先,在集群中安装 CRD 对象:
上面的命令会在本地运行 Operator 应用,通过~/.kube/config去关联集群信息,现在我们去添加一个 AppService 类型的资源然后观察本地 Operator 的变化情况,资源清单文件就是我们上面预定义的(deploy/crds/app_v1_appservice_cr.yaml)
直接创建这个资源对象:
我们可以看到我们的应用创建成功了,这个时候查看 Operator 的调试窗口会有如下的信息出现:
然后我们可以去查看集群中是否有符合我们预期的资源出现:
如果应用在安装过程中出现了任何问题,我们都可以通过本地的 Operator 调试窗口找到有用的信息,然后调试修改即可.
清理:
部署
自定义的资源对象现在测试通过了,但是如果我们将本地的operator-sdk up local命令终止掉,我们可以猜想到就没办法处理 AppService 资源对象的一些操作了,所以我们需要将我们的业务逻辑实现部署到集群中去.
执行下面的命令构建 Operator 应用打包成 Docker 镜像:
镜像构建成功后,推送到 docker hub:
镜像推送成功后,使用上面的镜像地址更新 Operator 的资源清单:
现在 Operator 的资源清单文件准备好了,然后创建对应的 RBAC 的对象:
到这里我们的 CRD 和 Operator 实现都已经安装成功了.
清理
有资源清单文件,直接删除即可:
开发
Operator SDK 为我们创建了一个快速启动的代码和相关配置,如果我们要开始处理相关的逻辑,我们可以在项目中搜索TODO(user)这个注释来实现我们自己的逻辑,比如在我的 VSCode 环境中,看上去是这样的:
本篇文章示例代码地址:
参考资料
使用Kubernetes可以:
自动化容器的部署和复制
随时扩展或收缩容器规模
将容器组织成组,并且提供容器间的负载均衡
很容易地升级应用程序容器的新版本
提供容器弹性,如果容器失效就替换它,等等...
可以看看这个视频教程,还是非常认真仔细的!
还可以通过B站上这个视频教程了解更多:
节点?(Master node and Worker node)
工作节点(Worker Node):主要负责运行容器.
命名空间?(Namespace)
Object
POD
Pod是 Kubernetes 部署应用或服务的最小的基本单位.一个Pod 封装多个应用容器(也可以只有一个容器)、存储资源、一个独立的网络 IP 以及管理控制容器运行方式的策略选项.
副本集?(Replica Set,RS)
是一种控制器,负责监控和维护集群中pod的副本(replicas)数,确保pod的副本数是我们期望的样子.
部署?(Deployment)
服务?(service)
Ingress
无状态应用 有状态应用
无状态应用指的是应用在容器中运行时候不会在容器中持久化存储数据,应用容器可以随意创建、销毁;如果一个应用有多个容器实例,对于无状态应用,请求转发给任何一个容器实例都可以正确运行.例如:web应用
有状态应用指的是应用在容器中运行时候需要稳定的持久化存储、稳定的网络标识、固定的pod启动和停止次序.例如:mysql数据库
以上就是土嘎嘎小编大虾米为大家整理的相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!