一、Helm-v3应用包管理器
1.1、 为什么需要Helm?
K8S上的应用对象,都是由特定的资源描述组成,包括deployment、service等。都保存各自文件中或者集中写到一个配置文件。然后kubectl apply –f 部署。
1.2、为什么使用helm?
在k8s中,当我们去部署应用的时候,一般都是使用yaml文件去管理我们的应用的发布,比如像微服务,其中包括deployment,service,configmap,ingress,但是如果我们有上百个微服务的话,每次的修改涉及也都会比较多,感觉就是不太灵活了,再去管理可能就觉得力不从心了,这只是一个问题,其实k8s缺少一个更高级的应用级别的管理,如果我们将这些yaml文件放在一个地方,基于一个应用层面的管理,那可能会更好了。
1.3、使用这些yaml文件面临着一个什么样的问题?
且由于缺少对发布过的应用版本管理和控制,使Kubernetes上的应用维护和更新等面临诸多的挑战,主要面临以下问题:
如何将这些服务作为一个整体管理,其实我们每次部署也针对这些yaml,然后apply 一下,然后也缺乏了怎么统一的管理
这些资源文件如何高效复用,其实我们在部署的时候,模版的很多的类型都是一样的,我们怎么去使用一套模版来发布多个应用呢,发布的时候只需要简单修改一下
不支持应用级别的版本管理,那么这里有很多的yaml,怎么可能可以去管理应用级别的呢,为了解决这个问题,helm也就应运而生了。
1.4、 Helm 介绍
Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的将之前打包好的yaml文件部署到kubernetes上。
比如像yum ,它主要解决一个依赖的问题,安装yum的可能会有很多的yum去执行,这个helm就相当于一个yum的包管理器,它将直接按应用去安装,这个helm也一样。
1.5、Helm有三个重要概念:
helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。
Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
Release:基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在k8s中创建出真实运行的资源对象。
1.6、Helm v3 变化
2019年11月13日, Helm团队发布 Helm v3的第一个稳定版本。
该版本主要变化如下:
1.6.1、 架构变化
最明显的变化是,简单了很多,第一个变化就是,也是最明显的,它把tiller之前作为一个pod集群中部署的它作为一个服务端存在的,它主要接收helm客户端发来的请求,发给API里面,然后api去转发,tiller还得需要单独部署,并且还要授权,它能操作集群的哪些命名空间,拥有哪些权限给删除了。
kubeconfig连接集群的配置文件直接连接apiserver,之前呢是直接连接的API,由它做一个转发,现在呢直接使用kubeconfig,kubectl都是使用kubeconfig来连接集群的,所以helm直接连接kubeconfig,再连接apiserver,然后部署chart的包,那简化了很多,然后v2版本部署一个Helm,还需要tiller还能正常的工作,现在v3版本就不需要了,只需要下载一个helm的客户端工具就可以了,首先这个部署已经简化了很多,是更合理的,之前的权限管理也是很麻烦的,也是需要tiller去做权限管理,所以这个授权也是比较麻烦,感觉加这个tiller也是多余的东西,也是当时设计的原因,附加了这么一个tiller,这个也是一个可有可无的东西,有了kubeconfig,就可以直接通过原生的kubeconfig去完成了,所以也没必要搞一个组件单独去做这件事,比如授权,连接API,有一部分可以再helm的客户端去实现了,那这么一来的话用helm就很简单了,这也就是社区一个认识的转变,真正的让helm作为一个好用的工具存在。
1.6.2、Release名称可以在不同命名空间重用,之前这个都是tiller去维护的,比如部署一个web产生一个发行版,这个发行版这个名称,不能跨命名空间去使用,只能用一个名字,比如default使用了一个web的名称,在kube-system的命名空间下就不能用,主要是全局管理,在一个命名空间下存储这个信息的,所以说是每个命名空间下维护的信息,这个命名空间里面不要重复。
1.6.3、支持将 Chart 推送至 Docker 镜像仓库中 ,也就是chart可以推送到harbor仓库上了,之前是有专门的存储工具,也就是这个支持,可以只用一个仓库来存储多个类型,比如通过harbor放我们的镜像还能存放我们的chart的包管理工具
1.6.4、使用JSONSchema验证chart values ,主要去验证你使用values这个格式的变量的文件
1.6.5、其他
1)为了更好地协调其他包管理者的措辞 Helm CLI个别更名
helm delete更名为helm uninstall
helm inspect更名为helm show
helm fetch更名为helm pull
但以上旧的命令当前仍能使用。
2)移除了用于本地临时搭建 Chart Repository的 helm serve 命令。
3)自动创建名称空间
在不存在的命名空间中创建发行版时,Helm 2创建了命名空间。Helm 3遵循其他Kubernetes对象的行为,如果命名空间不存在则返回错误。
4) 不再需要requirements.yaml, 依赖关系是直接在chart.yaml中定义。
基本上就是v3版本的helm就是代码基本上算是重构了
二、Helm部署
2.1、部署Helm客户端
Helm客户端下载地址:https://github.com/helm/helm/releases
解压移动到/usr/bin/目录即可。
wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz
tar zxvf helm-v3.0.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
2.2、Helm常用命令
2.3、配置国内Chart仓库
准备好客户端工具之后,就要配置一下这个Chart的仓库,chart就是一个应用的包
微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库推荐使用,基本上官网有的chart这里都有。
阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,国内有点不好使。
2.3.1、添加存储库:
helm repo add azure http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update #更新
2.3.2、查看配置的存储库:
这里也可以添加多个仓库,比如阿里云,微软的,都可以通过search会帮你列出来你仓库所有的
[root@k8s-master1 ~]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
2.3.3、删除存储库:
helm repo remove aliyun
三、Helm基本使用
3.1、主要介绍三个命令:
chart install 安装
chart update 升级
chart rollback 回滚
四、构建一个Helm Chart
[root@k8s-master1 helm]# helm create mychart
Creating mychart
[root@k8s-master1 helm]# ls
mychat
[root@k8s-master1 helm]# cd mychart/
[root@k8s-master1 mychart]# ls
charts Chart.yaml templates values.yaml
4.1、修改templates下的deployment.yaml为以下内容
[root@k8s-node1 templates]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ .Values.name }}
name: {{ .Values.name }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: {{ .Values.name }}
template:
metadata:
labels:
app: {{ .Values.name }}
spec:
containers:
- image: {{ .Values.image }}:{{ .Values.Tag }}
name: {{ .Values.name }}
4.2、修改templates下的service.yaml为以下内容
[root@k8s-node1 templates]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: {{ .Values.name }}
name: {{ .Values.name }}
spec:
ports:
- port: {{ .Values.targetPort }}
protocol: TCP
targetPort: {{ .Values.targetPort }}
selector:
app: {{ .Values.name }}
type: NodePort
4.3、修改mychart下的values.yaml为以下内容
[root@k8s-node1 mychart]# cat values.yaml
name: web
image: liujixiao/java-demo
Tag: latest
replicas: 1
targetPort: 8080
4.4、查看渲染之后的效果
[root@k8s-node1 helm]# helm install --dry-run web1 mychart/
NAME: web1
LAST DEPLOYED: Wed Apr 1 16:27:36 2020
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: web1
name: web1
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: web1
type: NodePort
---
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web1
name: web1
spec:
replicas: 1
selector:
matchLabels:
app: web1
template:
metadata:
labels:
app: web1
spec:
containers:
- image: liujixiao/java-demo:latest
name: web1
4.5、应用mychart
[root@k8s-node1 helm]# helm install web mychart/
4.6、升级
进入vim /app/helm/mychart/values.yaml 文件将镜像的tag修改即可
[root@k8s-node1 helm]# helm upgrade web mychart
Release "web" has been upgraded. Happy Helming!
NAME: web
LAST DEPLOYED: Tue Dec 21 12:47:55 2018
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
4.7、回滚
[root@k8s-node1 helm]# helm rollback web
Rollback was a success! Happy Helming!
4.8、查看历史版本
[root@k8s-node1 helm]# helm history web
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Wed Apr 1 15:18:40 2020 superseded mychart-0.1.0 1.16.0 Install complete
2 Wed Apr 1 16:37:55 2020 deployed mychart-0.1.0 1.16.0 Upgrade complete
4.9、删除
[root@k8s-node1 helm]# helm list #查看列表
[root@k8s-node1 helm]# helm uninstall web
release "web" uninstalled
五、使用传参方式部署/更新pod
5.1、部署pod
[root@k8s-node1 helm]# helm install web2 --set image=liujixiao/java-demo mychart/
5.2、更新副本数
[root@k8s-node1 helm]# helm upgrade web2 --set replicas=3 mychart/