OpenShift 通过Operator SDK制作Operator

Operator 与 Openshift

制作Operator过程

  1. 下载安装operator-sdk
  2. 创建github仓库
  3. 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

  1. 创建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
  1. 构建operator镜像
$ operator-sdk build docker.io/xhuaustc/memcached-operator:v0.0.1
$ docker push docker.io/xhuaustc/memcached-operator:v0.0.1
  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
  1. 创建CR资源
$ 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值设置为""
apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
  template:
    ...
    spec:
      ...
      serviceAccountName: memcached-operator
      containers:
      - name: memcached-operator
        ...
        env:
          - name: WATCH_NAMESPACE
          value: ""
  1. 将deploy/role.yaml更改为ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: memcached-operator
...
  1. 将deploy/role_binding.yaml更改为ClusterRoleBinding
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: memcached-operator
subjects:
- kind: ServiceAccount
  name: memcached-operator
  namespace: 
roleRef:
  kind: ClusterRole
  name: memcached-operator
  apiGroup: rbac.authorization.k8s.io

总结

operator会不断监听创建的CRD资源配置的变化,更新资源的状态,保证资源处于需要的状态下。目前Operator只支持openshift 3.11及以上版本
通过使用operator-sdk可以非常方便地创建自己的operator。它不仅可以轻易将通用参数提取出来,同时支持编码的方式,让资源的定义更加灵活,而且可以通过operator的设置资源的调用顺序及依赖。

你可能感兴趣的:(OpenShift 通过Operator SDK制作Operator)