K8s

一文学会kubernetes operator

2022-01-13  本文已影响0人  sknfie

背景

在 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:

operator

operator 是一种 kubernetes 的扩展形式,利用自定义资源对象(Custom Resource)来管理应用和组件,允许用户以 Kubernetes 的声明式 API 风格来管理应用及服务。operator 定义了一组在 Kubernetes 集群中打包和部署复杂业务应用的方法,operator主要是为解决特定应用或服务关于如何运行、部署及出现问题时如何处理提供的一种特定的自定义方式。比如:

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上运行.

上一篇 下一篇

猜你喜欢

热点阅读