采用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 ...
随机推荐
- linux下根目录扩容
划分出一个磁盘,并将其格式化 [root@gg ~]# mkfs.ext3 /dev/sdb2 创建一个物理卷 [root@gg ~]# pvcreate /dev/sdb2 [roo ...
- ECshop语言包lang的加载原理
当前使用的ecshop的版本:2.7.3,ecshop 2.7.3版本的网店系统的语言包的位置是ecshop文件下 languages/xxx/ 其中的xxx表示各种语言的文件夹,里面存放指定语言 ...
- DDR3调试记录
FPGA采集视频数据并写到DDR3,然后从DDR3读出并送给显示终端显示.不能稳定显示.但用FPGA内部逻辑产生color bar写到DDR3后读出来显示正常.因此DDR3部分逻辑没有问题 ...
- Windows Installer服务总是自动关闭导致无法安装在win10上安装英伟达显卡驱动的解决方案
你可以依次点击"开始→程序→附件→命令提示符",键入:msiexec /unregister, 然后再键入msiexec /regserver.应该就能解决. 更多的参考:How ...
- Oracle 默认的几个登陆用户名和密码
默认用户有这么几个,system,sys,scott,hr ,一般scott 和hr 作为你的练习用户.system的默认密码是 manager sys的默认密码是 change_on_install ...
- 怎么将maven项目打包成war包
问题:我在eclipse上能运行,然后我想将这个maven项目打包成war然后放到另外一台机子上(其实是手动放在tomcat的webapp目录中),提供外部访问.现在问题是,一直maven项目打包一直 ...
- 【转】高效率编辑器VIM
最近实习的时候需要在服务器上做Debug,不得不用到vim的相关操作.以前对vim这种被码农无数赞扬的神器望而却步,但今天试了之后感觉还是不错的.以后争取少用鼠标,少用insert模式. 这是从网上看 ...
- android studio 汉化 个性化 美化 快速操作项目 目录
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 汉化包 百度云盘 下载地址:https://pan.baidu.com/s/1pLjwy ...
- [CodeChef-QUERY]Observing the Tree
题目大意: 给你一棵树,一开始每个点的权值都是0,要求支持一下三种操作: 1.路径加等差数列. 2.路径求和. 3.回到以前的某次操作. 强制在线. 思路: 树链剖分+主席树. 最坏情况下,n个点的树 ...
- bzoj 4627: [BeiJing2016]回转寿司 -- 权值线段树
4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec Memory Limit: 256 MB Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店. ...