制作Operator过程
下载安装operator-sdk
创建github仓库
operator-sdk创建应用
1 2 3 4 5 $ operator-sdk new memcached-go-operator --repo=github.com/example-inc/memcached-operator $ $ operator-sdk new memcached-ansible-operator --api-version=fcloudy.com/v1alpha1 --kind=Memcached --type =ansible $ $ 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 4. 创建ansible role
创建应用时使用变量指的是CR中metadata的变量,而指的是CR中spec的变量。
如果只有一个role的话,在watches.yaml中指定role即可,例如role: /opt/ansible/roles/memcached
如果有多个role的话,可以添加playbook.yaml,并指定它为启动脚本,例如playbook: /opt/ansible/playbook.yaml
构建operator镜像
1 2 $ operator-sdk build docker.io/xhuaustc/memcached-operator:v0.0.1 $ docker push docker.io/xhuaustc/memcached-operator:v0.0.1
使用operator创建应用
1 2 3 4 5 6 7 $ $ create -f deploy/crds/cache_v1alpha1_memcached_crd.yaml $ $ 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 $ $ oc create -f deploy
创建CR资源
1 $ 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值设置为””
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: ... serviceAccountName: memcached-operator containers: - name: memcached-operator ... env: - name: WATCH_NAMESPACE value: ""
将deploy/role.yaml更改为ClusterRole
1 2 3 4 5 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: memcached-operator ...
将deploy/role_binding.yaml更改为ClusterRoleBinding
1 2 3 4 5 6 7 8 9 10 11 12 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的设置资源的调用顺序及依赖。