制作Operator过程

  1. 下载安装operator-sdk
  2. 创建github仓库
  3. operator-sdk创建应用
    1
    2
    3
    4
    5
    $ 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
4. 创建ansible role

  • 创建应用时使用变量指的是CR中metadata的变量,而指的是CR中spec的变量。
  • 如果只有一个role的话,在watches.yaml中指定role即可,例如role: /opt/ansible/roles/memcached
  • 如果有多个role的话,可以添加playbook.yaml,并指定它为启动脚本,例如playbook: /opt/ansible/playbook.yaml
  1. 构建operator镜像
    1
    2
    $ operator-sdk build docker.io/xhuaustc/memcached-operator:v0.0.1
    $ docker push docker.io/xhuaustc/memcached-operator:v0.0.1
  2. 使用operator创建应用
    1
    2
    3
    4
    5
    6
    7
    $ # 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
  3. 创建CR资源
    1
    $ oc create -f deploy/crds/cache_v1alpha1_memcached_cr.yaml

监控全局Namespace

默认情况下,Operator只能监听当前project下创建的应用。如果要监听所有的namespace,需将WATCH_NAMESPACE值设置为””,同时将role更换为clusterrole,rolebinding更新为clusterrolebinding。以下为具体实例。

  1. 将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: ""
  2. 将deploy/role.yaml更改为ClusterRole
    1
    2
    3
    4
    5
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    name: memcached-operator
    ...
  3. 将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的设置资源的调用顺序及依赖。