制作Operator过程
- 下载安装operator-sdk
- 创建github仓库
- operator-sdk创建应用
$ operator-sdk new memcached-go-operator --repo=github.com/example-inc/memcached-operator
$ # or
$ operator-sdk new memcached-ansible-operator --api-version=fcloudy.com/v1alpha1 --kind=Memcached --type=ansible
$ # or
$ operator-sdk new memcached-helm-operator --api-version=fcloudy.com/v1alpha1 --kind=Memcached --type=helm
operator-sdk new默认使用的type为go,必须在$GOPATH目录下创建项目。type为go时项目的目录结构如下:项目的目录结构
type的可选值还可以为:ansible与helm,如果是这两个,则还可以带参数--kind来定义CRD
示例:
GO
Ansible
Helm
更多实例:etcd,memcached,vault,bitcoin-sv
- 创建ansible role
- 创建应用时使用变量{{ meta.name }}指的是CR中metadata的变量,而{{ size }}指的是CR中spec的变量。
- 如果只有一个role的话,在watches.yaml中指定role即可,例如
role: /opt/ansible/roles/memcached
- 如果有多个role的话,可以添加playbook.yaml,并指定它为启动脚本,例如
playbook: /opt/ansible/playbook.yaml
- 构建operator镜像
$ operator-sdk build docker.io/xhuaustc/memcached-operator:v0.0.1
$ docker push docker.io/xhuaustc/memcached-operator:v0.0.1
- 使用operator创建应用
$ # 1. 导入crd文件
$ create -f deploy/crds/cache_v1alpha1_memcached_crd.yaml
$ # 2. 替换deploy/operator.yaml文件中的变量REPLACE_IMAGE,pull_policy
$ sed -i "" 's|{{ REPLACE_IMAGE }}|docker.io/xhuaustc/memcached-operator:v0.0.1|g' deploy/operator.yaml
$ sed -i "" 's|{{ pull_policy\|default('\''Always'\'') }}|Always|g' deploy/operator.yaml
$ # 3. 创建相关资源
$ oc create -f deploy
- 创建CR资源
$ oc create -f deploy/crds/cache_v1alpha1_memcached_cr.yaml
监控全局Namespace
默认情况下,Operator只能监听当前project下创建的应用。如果要监听所有的namespace,需将WATCH_NAMESPACE值设置为"",同时将role更换为clusterrole,rolebinding更新为clusterrolebinding。以下为具体实例。
- 将deploy/operator.yaml中的WATCH_NAMESPACE值设置为""
apiVersion: apps/v1
kind: Deployment
...
spec:
...
template:
...
spec:
...
serviceAccountName: memcached-operator
containers:
- name: memcached-operator
...
env:
- name: WATCH_NAMESPACE
value: ""
- 将deploy/role.yaml更改为ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: memcached-operator
...
- 将deploy/role_binding.yaml更改为ClusterRoleBinding
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: memcached-operator
subjects:
- kind: ServiceAccount
name: memcached-operator
namespace: <operator-namespace>
roleRef:
kind: ClusterRole
name: memcached-operator
apiGroup: rbac.authorization.k8s.io
总结
operator会不断监听创建的CRD资源配置的变化,更新资源的状态,保证资源处于需要的状态下。目前Operator只支持openshift 3.11及以上版本
。
通过使用operator-sdk可以非常方便地创建自己的operator。它不仅可以轻易将通用参数提取出来,同时支持编码的方式,让资源的定义更加灵活,而且可以通过operator的设置资源的调用顺序及依赖。