背景
在 Kubernetes 中使用的 Deployment, DaemonSet,StatefulSet, Service,Ingress, ConfigMap, Secret 这些都是资源对象,而对这些资源对象的创建、更新、删除的动作都会被称为为事件(Event),Kubernetes 的 Controller Manager 负责事件监听,并触发相应的动作来满足期望(Spec),这种方式也就是声明式,即用户只需要关心应用程序的最终状态。
引言
当这些资源不能满足我们的需求的时候,Kubernetes 提供了自定义资源(Custom Resource Definition)和 opertor 为应用程序提供基于 kuberntes 扩展。
CRD
CRD 则是对自定义资源的描述(Custom Resource Definition):
- 这个资源有什么属性
- 这些属性的类型是什么
- 结构是怎样的
自定义资源详解
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: postgresqls.xxx.com
labels:
app.kubernetes.io/name: postgres-operator
annotations:
"helm.sh/hook": crd-install
spec:
group: xxx.com
names:
kind: postgresql
listKind: postgresqlList
plural: postgresqls
singular: postgresql
shortNames:
- pg additionalPrinterColumns:
- name: Team
type: string
description: Team responsible for Postgres CLuster
JSONPath: .spec.teamId
- name: Version
type: string
description: PostgreSQL version
JSONPath: .spec.postgresql.version
- name: Pods
type: integer
description: Number of Pods per Postgres cluster
JSONPath: .spec.numberOfInstances
- name: Volume
type: string
description: Size of the bound volume
JSONPath: .spec.volume.size
从上面的 CRD 文件可以看到 CRD 主要包括apiVersion、kind、metadata和spec四个部分。
其中最关键的是apiVersion和kind:
- apiVersion表示资源所属组织和版本,apiVersion一般由APIGourp和Version组成,这里的 APIGourp 是apiextensions.k8s.io,Version 是v1beta1,相关信息可以通过kubectl api-resoures查看。
- kind 表示资源类型,这里是CustomResourceDefinition,表示是一个自定义的资源描述。
operator
operator 是一种 kubernetes 的扩展形式,利用自定义资源对象(Custom Resource)来管理应用和组件,允许用户以 Kubernetes 的声明式 API 风格来管理应用及服务。operator 定义了一组在 Kubernetes 集群中打包和部署复杂业务应用的方法,operator主要是为解决特定应用或服务关于如何运行、部署及出现问题时如何处理提供的一种特定的自定义方式。比如:
- 按需部署应用服务
- 实现应用状态的备份和还原,完成版本升级
- 数据库 schema 或额外的配置设置的改动
- 为分布式应用进行master选举,例如etcd,或者master-slave架构的mysql集群。
operator SDK
operator SDK —— operator framework,是 CoreOS 公司开发和维护的用于快速创建 operator 的工具,可以帮助我们快速构建 operator 应用。
operator 安装
安装 operator sdk:
export RELEASE_VERSION=v0.13.0
curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
chmod +x operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu && sudo mkdir -p /usr/local/bin/ && sudo cp operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu /usr/local/bin/operator-sdk && rm operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
基于模板创建项目
用operator sdk 创建项目模板,这里用官方提供的一个sample-controller的模板:
operator-sdk new <controller-name> --repo github.com/kubernetes/sample-controller
$ operator-sdk new test-controller --repo github.com/kubernetes/sample-controller
创建CRD
operator-sdk add api --api-version=<api的版本> --kind=<类型名称>
创建CRD后,多出来了文件夹:
$ operator-sdk add api --api-version=test.k8s.realibox.com/v1 --kind=Realibox
编写controller
创建好 CRD 后,我们可以编写 controller 了,先创建一个 controller 监听和核对新创建的realibox资源类型:
命令行说明:
operator-sdk add controller --api-version=<api的版本> --kind=<类型名称>
运行结果:
$ operator-sdk add controller --api-version=test.k8s.realibox.com/v1 --kind=Realibox
在pkg/controller目录下生成了controller代码,在pkg/controller/realibox/realibox_controller.go编写代码逻辑即可。
下面就可以运行 controller 了。
运行 controller
运行controller有两种方法,可以在本地直接运行controller,也可以打包到k8s运行。
在本地运行controller直接go run就可以了:
export WATCH_NAMESPACE=default
go run cmd/manager/main.go
注意:不管是在本地运行还是远程运行都需要先在集群中创建CRD
运行好后我们可以编写一个CR资源,提交到k8s集群中:
apiVersion: test.k8s.realibox.com/v1
kind: Realibox
metadata:
name: example-realibox
spec:
domain: "realibox.com"
oss: "xxx.com"
size: "3Gb"
打包提交到k8s运行
如果我们controller完成,我们可以将其打包放到k8s上运行.
网友评论