Kubernetes 与 Helm:使用同一个 Chart 部署多个应用
k8s 集群搭建好了,准备将 docker swarm 上的应用都迁移到 k8s 上,但需要一个一个应用写 yaml 配置文件,不仅要编写 deployment.yaml 还要编写 service.yaml ,而很多应用的配置是差不多的,这个繁琐工作让人有些望而却步。
k8s 有没有针对这个问题的解救之道呢?发现了救星 Helm —— k8s 应用程序包管理器,实际操作体验一下。
首先在 k8s master 节点上安装 helm ,用下面的1行命令就可以搞定。
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
接下来创建一个 chart (chart 就是 helm 的包包)
helm create cnblogs-chart
注:准备基于这个 chart 部署多个不同的应用。
helm 会创建一个文件夹,我们来看看文件夹中的内容:
cnblogs-chart
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
关于这些文件的用途,详见园子里的博文 kubernetes实战篇之helm示例yaml文件详细介绍 。
下面根据我们的部署场景修改 chart 中的这些配置文件,由于我们想使用同一个 chart 部署很多个应用,需要尽可能减少重复配置,所以在配置时会更多地基于约定。假设我们部署的应用名称是 cache-api ,那 helm 的 release 名称也用 cache-api ,docker 镜像的名称也用 cache-api ,deployment 与 service 的名称也用 cache-api ,ConfigMap 的名称是 cache-api-appsettings 。
修改 templates 中的配置(共享公用配置)
1)修改 deployment.yaml 中的配置
- 将
metadata.name
的值修改为.Release.Name
- 将
containers.name
的值改为.Release.Name
- 将
containers. image
的值改为{{ .Release.Name }}:{{ .Values.image.version }}
- 添加
containers. workingDir
容器工作目录配置 - 添加
containers.command
容器启动命令配置 - 添加
containers.env
环境变量配置 - 将
matchLabels
与labels
的值都改为{{ .Release.Name }}
- 添加将
configMap
安装为volume
的配置用于应用读取 appsettings.Production.json 。
metadata:
name: {{ .Release.Name }}
labels:
name: {{ .Release.Name }}
spec:
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Release.Name }}
image: "{{ .Release.Name }}:{{ .Values.image.version }}"
workingDir: /app
command:
- sh
- run.sh
env:
- name: TZ
value: "Asia/Shanghai"
volumeMounts:
- name: appsettings
mountPath: /app/appsettings.Production.json
subPath: appsettings.Production.json
readOnly: true
volumes:
- name: appsettings
configMap:
name: "{{ .Release.Name }}-appsettings"
2)修改 service.yaml
也是用约定的应用名称 name: {{ .Release.Name }}
kind: Service
metadata:
name: {{ .Release.Name }}
labels:
name: {{ .Release.Name }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
app: {{ .Release.Name }}
修改 values.yaml 中的配置(共享默认配置)
- 将
image.pullPolicy
修改为Always
。 - 添加
image.version
并设置为latest
。 - 在
imagePullSecrets
中添加 secret 名称。 - 将
serviceAccount.create
设置为 false 。 - 在
resources
的limits
与requests
中设置 CPU 与内存限制。
replicaCount: 1
image:
repository: {}
version: latest
pullPolicy: Always
imagePullSecrets:
- name: regcred
nameOverride: ""
fullnameOverride: ""
serviceAccount:
create: false
name:
podSecurityContext: {}
securityContext: {}
service:
type: ClusterIP
port: 80
ingress:
enabled: false
resources:
limits:
cpu: 2
memory: 2G
requests:
cpu: 100m
memory: 64Mi
nodeSelector: {}
tolerations: []
affinity: {}
部署应用
1)验证配置
运行下面的命令验证配置是否正确
helm install cache-api --set image.version=1.0 --dry-run --debug .
2)部署应用
如果配置验证通过,就可以用下面的命令部署应用了。
helm install cache-api --set image.version=1.0 .
查看已部署的应用。
helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
cache-api production 1 2020-01-22 17:17:30.414863452 +0800 CST deployed cnblogs-chart-0.1.0 1
3)部署多个应用
现在可以基于前面创建的 chart 部署多个应用,只需通过 helm install 命令上传参数传递应用的相关配置信息,比如部署 news-web 与 q-web 这2个应用,可以分别使用下面的命令:
helm install news-web --set image.version=1.0.4,resources.limits.cpu=1 --dry-run --debug cnblogs-chart/
helm install ing-web --set image.version=1.3.11,resources.limits.cpu=1.5 --dry-run --debug cnblogs-chart/
Kubernetes 与 Helm:使用同一个 Chart 部署多个应用的更多相关文章
- 用Helm部署Kubernetes应用,支持多环境部署与版本回滚
1 前言 Helm是优秀的基于Kubernetes的包管理器.利用Helm,可以快速安装常用的Kubernetes应用,可以针对同一个应用快速部署多套环境,还可以实现运维人员与开发人员的职责分离.现在 ...
- Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装
首先说一下我的环境, 我是在windows 10 上面建了一个ubuntu18的虚拟机,同时由于某些原因 不受网络限制, 所以安装比较顺利. Install 1.安装并启用 Docker sudo ...
- 使用 chart 部署 skywalking
使用 chart 部署 skywalking 本文主要讲述的是如何使用 Helm Charts 将 SkyWalking 部署到 Kubernetes 集群中,相关文档可以参考skywalking-k ...
- Kubernetes用Helm安装Ingress并踩一下使用的坑
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Ingress是Kubernetes一个非常重要的Controller,它类似一个路由转发的组件,可以让外界访问Kubern ...
- helm搭建本地chart仓库及基本操作
这个步骤,是配合公司的竞赛. 因为公司这次的环境,我们只有namespace权限,而没有整个集群的管理, 而且,公司没有提供统一的helm chart repo, 所以只能自建. 参考URL: htt ...
- 同一个tomcat部署多个项目导致启动失败
内容描述在同一个tomcat部署多个打包成war包的项目导致启动失败,报错如下: 报错信息Error starting ApplicationContext. To display the condi ...
- kubernetes(k8s) helm安装kafka、zookeeper
通过helm在k8s上部署kafka.zookeeper 通过helm方法安装 k8s上安装kafka,可以使用helm,将kafka作为一个应用安装.当然这首先要你的k8s支持使用helm安装.he ...
- 宝塔面板 + Rancher + 阿里云镜像仓库 + Docker + Kubernetes,添加集群、部署 web 应用
目录 一,安装宝塔面板(V 6.8) 二,使用宝塔安装 Docker,配置阿里云容器服务 三,安装 Rancher (Server) 四,管理 Rancher.添加集群 五,添加 Rancher 应用 ...
- 构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境
构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境 整个环境的结构图. 一.准备工作 gitlab和harbor我是安装在kubernetes集群外 ...
随机推荐
- 机器学习作业(三)多类别分类与神经网络——Python(numpy)实现
题目太长了!下载地址[传送门] 第1题 简述:识别图片上的数字. import numpy as np import scipy.io as scio import matplotlib.pyplot ...
- 解决webpack和gulp打包js时ES6转译ES5时Object.assign()方法没转译成功的问题
在webpack或gulp打包的配置文件中package.json 引入"@babel/plugin-transform-object-assign": "^7.2.0& ...
- Python内置方法/函数
abs() 返回数字的绝对值. abs(x) all() 用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False. 元素除了是 0.空. ...
- mui H5+ 调取 相册 拍照 功能 上传图片 + 裁剪功能
H5+ 相册拍照图片上传 点击用户头像后,弹出actionSheet,选择从相册或是拍照:选取照片后调用上传方法: 上传图片后调用PhotoClip.js 插件进行裁剪 具体流程 弹出actionS ...
- python threading2种调用方式实例
1.认识GIL: 说到GIL一直是代码专家们一直以来想要解决的问题,也是被许多程序员诟病的,下面带领大家看下官方threading模块document中如何去描述对于GIL这个全局解释器锁的:http ...
- Vue 嵌套路由使用总结
Vue 嵌套路由使用总结 by:授客 QQ:1033553122 开发环境 Win 10 node-v10.15.3-x64.msi 下载地址: https://nodejs.org/ ...
- maven打包忽略test文件夹
当在项目中的test中写了单元测试后,在mvn install打包时会自动进行所有单元测试,所以这时需要忽略test文件夹 有两种方法: 1.用命令的方式:mvn install -Dmaven.te ...
- Mac 安装IDEA 2018.3 版本
注:本文转自https://blog.csdn.net/qq_41735004/article/details/86670039 写文文的目的是,怕博主删掉然后找不到所以就写一份 1.下载idea和破 ...
- Unable to load authentication plugin 'caching_sha2_password'
Caused by: com.mysql.cj.core.exceptions.WrongArgumentException: Unable to load authentication plugin ...
- day30 NFS服务器概述
02. NFS存储服务概念介绍 NFS是Network File System的缩写,中文意思是网络文件共享系统, 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录 存储服 ...