采用Operator-sdk轻松将helm chart转为Operator
去年就接触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的更多相关文章
- 如何选出适合自己的管理Helm Chart的最佳方式?
本文转载自Rancher Labs 无论你喜欢与否,你都不得不承认Helm是管理Kubernetes应用程序独一无二的工具,你甚至可以通过不同的方式使用它. 在Helm的使用过程中,我们注意到有几个问 ...
- k8s Helm安装Prometheus Operator
Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装完成了k8s的集群和helm的安装,今天我们来看看Prometheus的监控怎么搞.Prometheus Operator ...
- helm chart应用使用示例
有两种方法 一是按照正常流程直接用yaml文件的形式发布应用到k8s集群上 二是把生成好的yaml文件发布到kubeapps应用商店,在应用商店中操作发布应用到k8s集群中 这里采用第二种方式的变种方 ...
- 云原生交付加速!容器镜像服务企业版支持 Helm Chart
2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...
- 从入门到实践:创作一个自己的 Helm Chart
前言 我们平时在日常生活中会经常在不同的平台上与各种各样的应用打交道,比如从苹果的 App Store 里下载的淘宝.高德.支付宝等应用,或者是在 PC 端安装的 Word.Photoshop.Ste ...
- 使用 Helm Chart 部署及卸载 istio
部署 istio 1.添加 istio 官方的 helm 仓库 helm repo add istio https://storage.googleapis.com/istio-release/rel ...
- 【K8S】helm chart多环境部署最佳实践-示例
Chart.yaml apiVersion: v1 appVersion: "1.0" description: A Helm chart for Kubernetes name: ...
- 构建helm chart应用
使用helm命令创建基础目录 helm create t2cp [root@node04 ~]# tree t2cp t2cp ├── charts ├── Chart.yaml ├── templa ...
- [转帖]从入门到实践:创作一个自己的 Helm Chart
从入门到实践:创作一个自己的 Helm Chart https://www.cnblogs.com/alisystemsoftware/p/11436469.html 自己已经搭建好了 helm 和t ...
随机推荐
- 【LOJ】#2037. 「SHOI2015」脑洞治疗仪
题解 维护区间内1的个数,左边数0的长度,右边数0的长度,区间内0区间最长个数,覆盖标记 第一种操作区间覆盖0 第二种操作查询\([l_0,r_0]\)中1的个数,区间覆盖0,然后覆盖时找到相对应的区 ...
- Django实战(22):处理登录和注销
我们已经可以在view函数中判断用户是否已经登录以及获取用户信息: if request.user.is_authenticated(): #判断用户是否已登录 user = request.user ...
- mysql 存储过程详解
MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...
- 喜大普奔!Django官方文档终于出中文版了
喜大普奔!Django官方文档终于出中文版了 文章来源:企鹅号 - Crossin的编程教室 昨天经 Sur 同学告知才发现,Django 官方文档居然支持中文了! 之所以让我觉得惊喜与意外,是因为: ...
- 牛客练习赛1 A - 矩阵
链接:https://www.nowcoder.com/acm/contest/2/A来源:牛客网 题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至 ...
- gp数据库运维
最近需要将一份db2导出的历史数据入库gp集群,然后把每天的增量数据导出成txt文件和对应的log日志,再ftp传输给另外一台机器.其中陆续碰到一些坑,在此记录 历史文件数据清洗 列分隔符的选择 碰到 ...
- Rsync服务部署使用
rsync服务搭建过程(daemon模式) 配置服务 在/etc/rsyncd.conf文件中写入相应的配置: uid = root gid = root use chroot = no max co ...
- iOS Sprite Kit教程之编写程序以及Xcode的介绍
iOS Sprite Kit教程之编写程序以及Xcode的介绍 Xcode界面介绍 一个Xcode项目由很多的文件组成,例如代码文件.资源文件等.Xcode会帮助开发者对这些文件进行管理.所以,Xco ...
- django定时任务
1.celery流程图: Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成 2.使用 ...
- BZOJ2111 ZJOI2010排列计数
根据Pi>Pi/2可以看出来这是一个二叉树 所以我们可以用树形DP的思想 f[i]=f[i<<1]*f[i<<1|1]*C(s[i]-1,s[i<<1]),s ...