采用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 ...
 
随机推荐
- USACO 6.4 Wisconsin Squares
			
Wisconsin Squares It's spring in Wisconsin and time to move the yearling calves to the yearling past ...
 - 7-1 FireTruck 消防车  uva208
			
题意: 输入一个n <=20 个结点的无向图以及某个结点k 按照字典序从小到大顺序输出从结点1到结点k的所有路径 要求结点不能重复经过 标准回溯法 要实现从小到大字典序 现在数组中排序好即 ...
 - Java控制多线程执行顺序
			
package net.jasonjiang.thread; import java.io.IOException; public class ThreadTestNew { public stati ...
 - yum安装(sentos7)
			
之前我的yum一直出问题,我就重装了yum,这个教程是我亲自测试过,有用的. 链接:http://blog.csdn.net/iamhuanggua/article/details/60140867 ...
 - 使用Generator(小黑鸟)反向生成Java项目(IDEA + Maven)
			
一.生成Maven项目 二.配置pom.xml文件 通用代码 <properties> <!-- 设置项目编码编码 --> <project.build.sourceEn ...
 - ubuntu下安装和破解navicat的方法
			
ubuntu下安装和破解navicat的方法 之前我也在苦苦搜寻ubuntu完美破解navicat的方法,但是大家都说是删除掉~/.Navicat,就可以续用,的确是这样,但是很麻烦. 于是我找到了一 ...
 - JAVAEE——宜立方商城13:订单系统实现、订单生成、Mycat数据库分片
			
1. 学习计划 1.订单系统实现 2.订单生成 3.Mycat数据库分片 2. 订单系统 2.1. 功能分析 1.在购物车页面点击“去结算”按钮,跳转到订单确认页面 a) 必须要求用户登录 b) 使用 ...
 - 【初识】KMP算法入门
			
举个例子 模式串S:a s d a s d a s d f a s d 匹配串T:a s d a s d f 如果使用朴素匹配算法—— 1 2 3 4 5 6 8 9 a s d a s d a s ...
 - Lua脚本
			
应用场景: 游戏开发 独立应用脚本 Web 应用脚本 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench 安全系统,如入侵检测系统 1. 在很多时候,我们可以将Lua直接嵌 ...
 - 2018-2019-2 20162318《网络对抗技术》Exp3 免杀原理与实践
			
一.实验内容 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion),加壳工具),使用shellcode编程 2.通过组合应用各种技术实现恶意代码免杀(如果成 ...