去年就接触Operator,从Oracle发布的WebLogic Operator到mySQL Operator,构建的源码一大堆,但感觉一直缺少合适的开发框架能够避免复杂性快速生成,

随着技术的日益成熟,目前基于helm Operator轻松解决快速安装的问题,值得尝试一下。

下图是Operator框架的成熟度模型,基于不同的阶段,采用不同的技术满足全生命周期管理的需求

本文主要是以tomcat为例来进行快速的生成一个tomcat Operator.

1.环境准备

  • 安装go

下载安装,参考 https://golang.org/doc/install?download=go1.11.5.linux-amd64.tar.gz,不再详诉。

  • 安装编译环境
yum -y install gcc automake autoconf libtool make
  • 安装Operator CLI
mkdir -p $GOPATH/src/github.com/operator-framework
cd $GOPATH/src/github.com/operator-framework
git clone https://github.com/operator-framework/operator-sdk
cd operator-sdk
git checkout master
make install

2.构建Tomcat Operator

  • 新建项目
cd /usr/local/go/src/github.com/operator-framework/operator-sdk
operator-sdk new tomcat-operator --cluster-scoped --api-version=example.com/v1alpha1 --kind=Tomcat --type=helm

这里建立的是cluster-scope,意思是全集群都可以用,缺省是当前的命名空间,看一下有什么东西

[root@master operator-sdk]# tree tomcat-operator
tomcat-operator
├── build
│   └── Dockerfile
├── deploy
│   ├── crds
│   │   ├── example_v1alpha1_tomcat_crd.yaml
│   │   └── example_v1alpha1_tomcat_cr.yaml
│   ├── operator.yaml
│   ├── role_binding.yaml
│   ├── role.yaml
│   └── service_account.yaml
├── helm-charts
│   └── tomcat
│   ├── charts
│   ├── Chart.yaml
│   ├── templates
│   │   ├── deployment.yaml
│   │   ├── _helpers.tpl
│   │   ├── ingress.yaml
│   │   ├── NOTES.txt
│   │   ├── service.yaml
│   │   └── tests
│   │   └── test-connection.yaml
│   └── values.yaml
└── watches.yaml
  • 客户化Operator的逻辑

主要是针对templates下面的deployment.yaml进行修改,因为缺省是以nginx为模板来做的,所以端口都是80,需要修改成8080

主要的修改就是deployment.yaml和values.yaml, 当然如果需要部署多个服务,同时多个服务由一定的依赖关系可以在helm中进行实现,镜像及版本的修改在values.yaml里面,我贴一段

[root@master tomcat]# cat values.yaml
# Default values for tomcat.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates. replicaCount: image:
repository: registry.example.com/tomcat
tag: -slim
pullPolicy: IfNotPresent nameOverride: ""
fullnameOverride: "" service:
type: ClusterIP
port: ingress:
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
paths: []

我就修改了image和端口部分。

example_v1alpha1_tomcat_cr.yaml这个文件主要用于部署tomcat类型的实例的yaml文件,

可以修改deploy/crds/example_v1alpha1_tomcat_cr.yaml,部署多个实例

[root@master crds]# cat example_v1alpha1_tomcat_cr.yaml
apiVersion: example.com/v1alpha1
kind: Tomcat
metadata:
name: example-tomcat
spec:
# Default values copied from <project_dir>/helm-charts/tomcat/values.yaml # Default values for tomcat.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates. replicaCount: image:
repository: registry.example.com/tomcat
tag: -slim
pullPolicy: IfNotPresent nameOverride: ""
fullnameOverride: ""

打开可以看到,基本就是指定了Kind为Tomcat,下面具体的值都可以从values.yaml中拷贝,并且可以覆盖values.yaml的值。

3.部署Operator到集群

  • 部署CRD
oc create -f deploy/crds/example_v1alpha1_nginx_crd.yaml

Openshift需要知道客户化的资源定义,这个定义就通过这个脚本,指定了watch.

  • 生成Operator的镜像

首先部署的时候是基于build目录下的Dockerfile,因为访问不到,所以做了个跳转,把Dockerfile的quay.io/operator-framework/helm-operator:v0.5.0路径修改掉

[root@master build]# cat Dockerfile
FROM docker.io/ericnie2017/helm-operator:latest COPY helm-charts/ ${HOME}/helm-charts/
COPY watches.yaml ${HOME}/watches.yaml

然后运行

operator-sdk build registry.example.com/example/tomcat-operator:v0.0.1
[root@master tomcat-operator]# operator-sdk build registry.example.com/example/tomcat-operator:v0.0.1
INFO[] Building Docker image registry.example.com/example/tomcat-operator:v0.0.1
Sending build context to Docker daemon 111.1 kB
Step / : FROM docker.io/ericnie2017/helm-operator:latest
---> f0d56774da3e
Step / : COPY helm-charts/ ${HOME}/helm-charts/
---> 9f77f7fba44d
Removing intermediate container efd44d601b0a
Step / : COPY watches.yaml ${HOME}/watches.yaml
---> 7469e31336af
Removing intermediate container 73189235ec15
Successfully built 7469e31336af
INFO[] Operator build complete.

build语句会把我们定制的Operator生成一个镜像,运行完push到镜像仓库让全集群可以访问。

[root@master tomcat-operator]# docker push registry.example.com/example/tomcat-operator:v0.0.1
The push refers to a repository [registry.example.com/example/tomcat-operator]
ae10451a67a5: Pushed
bebcddc5922f: Pushed
e256e39f5897: Pushed
d724046711d4: Pushed
903dc29d7cf3: Pushed
e79522dce35e: Pushed
v0.0.1: digest: sha256:a439041a9de91f0fee04f4cd15c554d8a03ec37a286760415b015cbdce7f4315 size:
  • 建立相关的角色,权限和CRD的信息

执行几个sed操作用于对生成模板的替换操作。

[root@master tomcat-operator]# sed -i 's|REPLACE_IMAGE|registry.example.com/example/tomcat-operator:v0.0.1|g' deploy/operator.yaml
[root@master tomcat-operator]# oc config view --minify -o jsonpath='{.contexts[0].context.namespace}'
default [root@master tomcat-operator]# sed -i "s|REPLACE_NAMESPACE|default|g" deploy/role_binding.yaml

一切就绪,开始创建

oc create -f deploy/service_account.yaml
oc create -f deploy/role.yaml
oc create -f deploy/role_binding.yaml
oc create -f deploy/operator.yaml

因为openshift自己的权限要求比较严格,干脆直接加成集群管理员了。

[root@master tomcat-operator]# oc adm policy add-cluster-role-to-user cluster-admin system:serviceaccount:default:tomcat-operator
cluster role "cluster-admin" added: "system:serviceaccount:default:tomcat-operator"

查看一下,已经创建起来了。这时这个Operator类型就作为一个Pod在容器内运行。

[root@master crds]# oc get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
tomcat-operator 30m

4.创建和删除tomcat Operator实例

建立实例,先查看一下这个创建的yaml文件,Kind就是我们指定的类型Tomcat,而下面的值就是从values.yaml而来,可以覆盖也可以不用覆盖。

[root@master crds]# cat example_v1alpha1_tomcat_cr.yaml
apiVersion: example.com/v1alpha1
kind: Tomcat
metadata:
name: example-tomcat
spec:
# Default values copied from <project_dir>/helm-charts/tomcat/values.yaml # Default values for tomcat.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates. replicaCount: image:
repository: registry.example.com/tomcat
tag: -slim
pullPolicy: IfNotPresent nameOverride: ""
fullnameOverride: "" service:
type: ClusterIP
port: ingress:
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
paths: []
hosts:
- chart-example.local
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi nodeSelector: {}
tolerations: [] affinity: {}
[root@master crds]# oc create  -f example_v1alpha1_tomcat_cr.yaml
tomcat.example.com/example-tomcat created
[root@master crds]# oc get pods
NAME READY STATUS RESTARTS AGE
docker-registry--gl8jh / Running 18d
example-tomcat-1xvukmzvgn1tijep2w61xgm56-69457d7456-fm49d / Running 11s
example-tomcat-1xvukmzvgn1tijep2w61xgm56-69457d7456-twjhk / Running 11s
registry-console--6m4cq / Running 8d
router--7gx4b / Running 9d
tomcat-operator-75dc656956-hhnfd / Running 27m

看到已经运行起来了,但是没有ready,没有ready的原因是readness和liveness的端口在deployment.yaml里面设置错了,没有修改成8080.

进去查看Pod日志,已经正常运行。

查看一下自定义对象,有一个example-tomcat,包含了2个pod

[root@master crds]# oc get Tomcat
NAME AGE
example-tomcat 10s

删除实例

[root@master crds]# oc delete -f example_v1alpha1_tomcat_cr.yaml
tomcat.example.com "example-tomcat" deleted

好把,这是一个简单的Helm Operator上手的实验,随着Operator的成熟,在OpenShift 4.0版本中已经有很多组件化的部署都基于Operator来实现。

采用Operator-sdk轻松将helm chart转为Operator的更多相关文章

  1. 如何选出适合自己的管理Helm Chart的最佳方式?

    本文转载自Rancher Labs 无论你喜欢与否,你都不得不承认Helm是管理Kubernetes应用程序独一无二的工具,你甚至可以通过不同的方式使用它. 在Helm的使用过程中,我们注意到有几个问 ...

  2. k8s Helm安装Prometheus Operator

    Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装完成了k8s的集群和helm的安装,今天我们来看看Prometheus的监控怎么搞.Prometheus Operator ...

  3. helm chart应用使用示例

    有两种方法 一是按照正常流程直接用yaml文件的形式发布应用到k8s集群上 二是把生成好的yaml文件发布到kubeapps应用商店,在应用商店中操作发布应用到k8s集群中 这里采用第二种方式的变种方 ...

  4. 云原生交付加速!容器镜像服务企业版支持 Helm Chart

    2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...

  5. 从入门到实践:创作一个自己的 Helm Chart

    前言 我们平时在日常生活中会经常在不同的平台上与各种各样的应用打交道,比如从苹果的 App Store 里下载的淘宝.高德.支付宝等应用,或者是在 PC 端安装的 Word.Photoshop.Ste ...

  6. 使用 Helm Chart 部署及卸载 istio

    部署 istio 1.添加 istio 官方的 helm 仓库 helm repo add istio https://storage.googleapis.com/istio-release/rel ...

  7. 【K8S】helm chart多环境部署最佳实践-示例

    Chart.yaml apiVersion: v1 appVersion: "1.0" description: A Helm chart for Kubernetes name: ...

  8. 构建helm chart应用

    使用helm命令创建基础目录 helm create t2cp [root@node04 ~]# tree t2cp t2cp ├── charts ├── Chart.yaml ├── templa ...

  9. [转帖]从入门到实践:创作一个自己的 Helm Chart

    从入门到实践:创作一个自己的 Helm Chart https://www.cnblogs.com/alisystemsoftware/p/11436469.html 自己已经搭建好了 helm 和t ...

随机推荐

  1. CentOs 安装 swftools

    一 下载安装包 #wget http://www.swftools.org/swftools-0.9.1.tar.gz 二 安装相关依赖库 #yum install gcc* automake zli ...

  2. ASP.NET MVC之Ajax如影随行

    一.Ajax的前世今生 我一直觉得google是一家牛逼的公司,为什么这样说呢?<舌尖上的中国>大家都看了,那些美食估计你是百看不厌,但是里边我觉得其实也有这样的一个哲学:关于食材,对于种 ...

  3. 【BZOJ】1061: [Noi2008]志愿者招募

    题解 可能是世界上最裸的一个单纯形 (话说全幺模矩阵是啥我到现在都不知道) 假装我们已经看过了算导,或者xxx的论文,知道了单纯形是怎么实现的 扔一个blog走掉..https://www.cnblo ...

  4. codeforces Educational Codeforces Round 9 E - Thief in a Shop

    E - Thief in a Shop 题目大意:给你n ( n <= 1000)个物品每个物品的价值为ai (ai <= 1000),你只能恰好取k个物品,问你能组成哪些价值. 思路:我 ...

  5. GTK, GTK+, Qt, KDE, GNOME, Unity的区别与联系

    GTK,GTK+, Qt是图形界面开发库(GUI Toolkit),用户可以使用这些开发库编写GUI应用,其中GTK+是GTK的升级版. KDE,GNOME,Unity是linux下的桌面环境(Des ...

  6. 【原创】MySQL CPU %sys高的案例分析(二)

    后面又做了补充测试,增加了每秒context switch的监控,以及SQL执行时各步骤消耗时间的监控. [测试现象一] 启用1000个并发线程的压测程序,保持压测程序持续运行,保持innodb_sp ...

  7. python opencv3 人脸识别的例子

    一个人脸识别的例子 程序中用到了公共数据集, 欢迎去我的git上下载源码,源码里带有数据集 git:https://github.com/linyi0604/Computer-Vision 脚本中一个 ...

  8. bzoj 1027 floyd求有向图最小环

    结合得好巧妙.... 化简后的问题是: 给你两个点集A,B,求B的一个子集BB,使得BB的凸包包含A的凸包,求BB的最小大小. 先特判答案为1,2的情况,答案为3的情况,我们先构造一个有向图: 对于B ...

  9. Vue的过渡或动画

    一.过渡的类名 在进入/离开的过渡中,共有6种class进行切换,分别是v-enter,v-enter-active,v-enter-to,v-leave,v-leave-active,v-leave ...

  10. BZOJ2716 KD-Tree

    好久没写博客了 回去赶了好久文化课 颓欲见长 突然翻到fc爷的KD-Tree板子 来切了到裸题 对于一开始的数据我们可以先预处理 具体的排序方式见板子 其实就是我们对每次选定的一块选一个维度来排序啦 ...