目前,Go在人们创建Kubernetes Operator时选用的编程语言中成为了事实上的垄断者。他们的偏好源于以下客观原因:
Operator SDK[1]这个强大的框架可用于使用Go来开发Operator
许多基于Go的应用程序,例如Docker和Kubernetes,已成为改变游戏规则的角色。使用Go来编写Operator允许你使用同种语言与这些生态对话。
基于Go的应用程序的高性能以及开箱即用的简单机制。
但是如果你缺少时间或仅是积极性阻碍了你学习Go呢?在此文中,我们将向你展示如何使用几乎所有DevOps工程师熟悉的、最流行的编程语言之一即Python来创建一个可靠的Operator。
欢迎Copyrator!
为了简单实用,我们将创建一个简单的Operator,用于当新的命名空间出现或当ConfigMap或Secret两者之一更改其状态时复制ConfigMap。从实用角度来看,我们新的Operator可用于批量更新应用程序配置(通过更新ConfigMap)或者重设secrets。例如用于Docker Registry的密钥(当Secret添加到命名空间时)。
那么一个优秀的Kubernetes Operator需具备什么功能呢?让我们罗列一下:
与Operator的交互是通过Custom Resource Definitions[2](以下简称CRD)
该Operator是可配置的,我们能使用命令行参数或者是环境变量来配置它。
Docker镜像和Helm图表在创建时考虑了易用性,所以用户可以毫不费力地安装它(基本上只需一个命令)到他们的Kubernetes集群。
CRD
为了让Operator知道哪些资源以及从哪里查找,我们需要配置一些规则。每个规则将被表示为指定的CRD对象。那这个CRD对象中需要有哪些字段呢?
我们所感兴趣的资源的类型(ConfigMap或者是Secret)
存储资源的命名空间列表
Selector用于帮助我们在特定的命名空间中查找资源。
让我们来定义我们的CRD:
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: copyrator.flant.com
spec:
group: flant.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: copyrators
singular: copyrator
kind: CopyratorRule
shortNames:
- copyr
validation:
openAPIV3Schema:
type: object
properties:
ruleType:
type: string
namespaces:
type: array
items:
type: string
selector:
type: string
并立即添加一个简单的规则来选择匹配在default命名空间中带有 copyrator:"true"标签的ConfigMap。