美文网首页Openshift:可靠的Kubernetes发行版
Openshift上使用shell operator创建自己的o

Openshift上使用shell operator创建自己的o

作者: 潘晓华Michael | 来源:发表于2019-07-12 12:23 被阅读1次
    Openshift Shell Operator

    Flant公司是一家致力于提供解决所有基础设施问题的解决方案的公司。他们自称是提供DevOps-as-a-Service的服务。

    需求

    • 一个简单的任务:监听项目创建与删除事件,并发出告警。
    • 一种简单的解决方法:定时脚本cron,每隔一段时间(如1min)获取对Openshift集群的所有项目,并将它与上次获取的结果值进行比较,得到新创建的项目及删除的项目
      该方法的缺点:
      • 不及时
      • 性能差,很多时候并没有操作项目,但仍然需要不断执行脚本
      • 如果1min内即创建了新项目,又把这个项目删除了,则无法监测到
    • 另一种解决方法:事件驱动,即订阅来自Kubernetes对象的事件,如果有对Project操作就触发告警。
      很明显这种方法解决了定时任务的所有问题。
    • 该很么做呢?会不会非常复杂。不会。使用shell-operator项目就可以非常简单地实现。shell-operator项目地址:https://github.com/flant/shell-operator
    Shell Operator

    实现部骤

    1. 创建shell-operator项目
    $ oc new-project shell-operator
    
    1. 为该项目创建serviceAccount monitor-namespaces-acc,将给它授予获取全局namespace的权限
    $ cat << EOF | oc create -f -
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: monitor-namespaces-acc
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: monitor-namespaces
    rules:
    - apiGroups: [""]
      resources: ["namespaces"]
      verbs: ["get", "watch", "list"]
    
    EOF
    $ oc adm policy add-cluster-role-to-user monitor-namespaces -z monitor-namespaces-acc
    
    1. 创建一个configmap,其中data中的内容为hook脚本
    $ cat << EOF | oc create -f -
    apiVersion: v1
    data:
      shell-hook.sh: |-
        #!/usr/bin/env bash
    
        if [[ $1 == "--config" ]] ; then
          cat <<EOF
          {"onKubernetesEvent":[
            {
              "name":"OnCreateDeleteNamespace",
              "kind": "namespace",
              "event":["add", "delete"]
            },
            {
              "name":"OnModifiedNamespace",
              "kind": "namespace",
              "event":["update"],
              "jqFilter": ".metadata.labels"
            }
            ]
          }
        EOF
        else
          bindingName=$(jq -r '.[0].binding' $BINDING_CONTEXT_PATH)
          resourceEvent=$(jq -r '.[0].resourceEvent' $BINDING_CONTEXT_PATH)
          resourceName=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
          if [[ $bindingName == "OnModifiedNamespace" ]] ; then
            echo "Namespace $resourceName labels were modified"
          else
            if [[ $resourceEvent == "add" ]] ; then
              echo "Namespace $resourceName was created"
            else
              echo "Namespace $resourceName was deleted"
            fi
          fi
        fi
    kind: ConfigMap
    metadata:
      name: hooks
    EOF
    
    1. 运行shell-operator应用
    $ cat << EOF | oc create -f -
    apiVersion: apps.openshift.io/v1
    kind: DeploymentConfig
    metadata:
      labels:
        run: shell-operator
      name: shell-operator
    spec:
      replicas: 1
      selector:
        run: shell-operator
      template:
        metadata:
          labels:
            run: shell-operator
        spec:
          serviceAccount: monitor-namespaces-acc
          containers:
            - image: 'flant/shell-operator:latest-alpine3.9'
              imagePullPolicy: IfNotPresent
              name: shell-operator
              volumeMounts:
                - mountPath: /hooks
                  name: hooks-no934
          volumes:
            - configMap:
                defaultMode: 511
                name: hooks
              name: hooks-no934
      triggers:
        - type: ConfigChange
    EOF
    

    说明

    • 应用启动使用monitor-namespaces-accserviceAccount
    • 将configmap内容挂载到deployment应用的/hooks目录中
    • 挂载文件需要给可执行权限defaultMode: 511
    Shell Operator

    验证

    1. 创建一个project/删除该project
    $ oc new-project  operator-test
    $ oc delete project operator-test
    
    1. 查看shell-operator的日志
    operator日志

    总结

    • 以上是使用configmap的方式向operator-shell注入自定义的钩子代码,非常灵活,最原始的operator-shell就能够满足各种不种的需求,十分方便。
    • shell-operator项目为我们自定义operator提供了一种非常便利的方式。同时它不仅仅支持bash,也可以支持python,需要在镜像中安装python包。
    $ cat Dockerfile
    FROM flant/shell-operator:latest
    RUN apk --no-cache add python
    

    钩子代码的环境使用python

    #!/usr/bin/env python
    
    • 有了这个监控后,就可以非常方便地对Openshift/Kubernetes的资源进行控制,想像空间可以很大。比如说有些项目的应用创建有先后关系,就可以方便地使用shell operator进行编排
    • 与CRD结合,真正构建自己的operator,想像空间就变得更大了
    • shell-operator项目地址:https://github.com/flant/shell-operator

    参考文章

    Shell-operator:用于简化Kubernetes operator的创建

    相关文章

      网友评论

        本文标题:Openshift上使用shell operator创建自己的o

        本文链接:https://www.haomeiwen.com/subject/ctoskctx.html