kubernetes包管理工具Helm详解
本文介绍了Kubernetes包管理工具Helm,它解决了复杂应用部署管理的三大核心问题:整体管理、YAML复用和版本控制。文章详细说明了Helm v3的重要概念(helm客户端、chart应用描述、release部署实体)和安装配置步骤,包括添加微软和阿里云chart仓库。通过实战演示了如何使用chart快速部署应用(如weave-scope监控工具)和创建自定义chart,重点讲解了通过val
kubernetes上的应用对象,都是由特定的资源描述组成,包括Deployment、Service等,都保存在各自文件中或者集中写在一个配置文件,然后通过kubectl apply -f 部署。如果应用只由一个或几个这样的服务组成,上面的部署方式就足够了。但是对于一个复杂的应用,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达几十、上百个,如果有更新或回滚应用的需求,可能要修改和维护所涉及到大量的资源文件,而这种组织和管理应用的方式就显得力不从心了。并且由于缺少对发布过的应用进行版本管理和控制,使得kubernetes上的应用维护和更新面临诸多的挑战,主要面临以下的问题:
-
如何将这些服务作为一个整体管理?
-
这些资源文件如何高效复用?
-
应用级别的版本如何管理?
一、Helm概述
Helm是一个kubernetes的包管理工具,就像Linux下的包管理器,如yum、apt等,可以很方便的将之前打包好的yaml文件部署到kubernetes上。
Helm有3个重要概念:
-
helm:一个命令行客户端工具,主要用于kubernetes应用chart的创建、打包、发布和管理。
-
chart:应用描述,一系列用于描述kubernetes资源相关文件的集合。
-
release:基于chart的部署实体,一个chart被Helm运行后将会生成对应的一个release,将在kubernetes中创建出真实运行的资源对象。
1.1 Heml v3
2019年11月13日,Helm团队发布Helm v3的第一个稳定版本。
该版本主要变化如下:
-
最明显的变化是Tiller删除
-
release名称可以在不同的命名空间重用。
-
支持将chart推动到Docker镜像仓库中。
-
使用JSONSchema验证chart values
使用helm可以解决哪些问题
-
使用helm可以把这些yaml作为一个整体管理
-
实现yaml高效复用
-
使用helm应用级别的版本管理
二、Helm部署
2.1 helm安装
1)下载helm安装压缩文件,上传到linux系统中
wget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz
2)解压helm文件,把解压之后的helm目录复制到/usr/bin目录下
[root@master ~]# wget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz
...
100%[===================================>] 12,927,632 2.84MB/s in 5.2s
# 解压下载的文件helm-v3.2.1-linux-amd64.tar.gz
[root@master ~]# ls
helm-v3.2.1-linux-amd64.tar.gz
[root@master ~]# tar -zxvf helm-v3.2.1-linux-amd64.tar.gz
linux-amd64/
linux-amd64/README.md
linux-amd64/helm
linux-amd64/LICENSE
# 进入到解压出来的目录 linux-adm64
[root@master ~]# ls
linux-amd64 helm-v3.2.1-linux-amd64.tar.gz
[root@master ~]# cd linux-amd64/
[root@master linux-amd64]# ls
helm LICENSE README.md
# 将 helm目录移动到 /usr/bin目录下
[root@master linux-amd64]# mv helm /usr/bin/
[root@master linux-amd64]# ls
LICENSE README.md
2.2 配置chart仓库
2.2.1 仓库概述
-
微软仓库:Index of /kubernetes/charts/ 推荐,基本上官网上的chart这里都有
-
官方仓库:https://hub.kubeapps.com/charts/incubator 官方charts仓库,国内有点不好使
2.2.2 添加仓库
# helm repo add 仓库名 仓库地址
# 添加微软仓库
[root@master ~]# helm repo add stable http://mirror.azure.cn/kubernetes/charts
"stable" has been added to your repositories
# 添加阿里云仓库
[root@master ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"aliyun" has been added to your repositories
# 查看配置的存储库
[root@master ~]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@master ~]#
# 更新仓库
[root@master ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "aliyun" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈
# 删除存储库
[root@master ~]# helm repo remove aliyun
"aliyun" has been removed from your repositories
# 验证
[root@master ~]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
三、 Helm的使用
3.1 使用chart快速部署应用
# 根据关键字搜索应用 语法: helm search repo | hub chart名称
[root@master ~]# helm search repo weave
NAME CHART VERSION APP VERSION DESCRIPTION
stable/weave-cloud 0.3.9 1.4.0 DEPRECATED - Weave Cloud is a add-on to Kuberne...
stable/weave-scope 1.1.12 1.12.0 DEPRECATED - A Helm chart for the Weave Scope c...
# 根据搜索内容选择安装 语法: helm install 安装之后的名称 搜索之后的应用名称
[root@master ~]# helm install ui stable/weave-scope # 这是一个可视化k8s监控工具
WARNING: This chart is deprecated
NAME: ui
LAST DEPLOYED: Tue Sep 13 16:18:55 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
...
# 查看安装之后的状态 语法:helm list , helm status 安装之后的名称
[root@master ~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ui default 1 2022-09-13 16:18:55.42387171 +0800 CST deployed weave-scope-1.1.12 1.12.0
[root@master ~]# helm status ui
NAME: ui
LAST DEPLOYED: Tue Sep 13 16:18:55 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
...
查看由chart创建的Pod和Service
# 查看由chart创建的Pod和Service
[root@master ~]# kubectl get Pods
NAME READY STATUS RESTARTS AGE
weave-scope-agent-ui-8jvm9 1/1 Running 0 4m18s
weave-scope-agent-ui-tjx8b 1/1 Running 0 4m18s
weave-scope-agent-ui-wjmpl 1/1 Running 0 4m18s
weave-scope-cluster-agent-ui-6cd95f9f76-n5j82 1/1 Running 0 4m18s
weave-scope-frontend-ui-66dff7b5c6-r88fj 1/1 Running 0 4m18s
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d4h
ui-weave-scope ClusterIP 10.104.164.107 <none> 80/TCP 4m30s
# 这里可以发现没有对外暴露的端口
# 修改service的yaml文件。type改为NodePort
[root@master ~]# kubectl edit svc ui-weave-scope
spec:
clusterIP: 10.104.164.107
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
selector:
app: weave-scope
component: frontend
release: ui
sessionAffinity: None
type: NodePort # 修改处
# 查看修改后svc暴露的端口号 30913
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d4h
ui-weave-scope NodePort 10.104.164.107 <none> 80:30913/TCP 8m
暴露成功后访问
3.2 创建自己的chart
3.2.1 使用命令创建chart
# 使用命令创建chart 语法:helm create chart名称
[root@master ~]# helm create mychart
Creating mychart
[root@master ~]# cd mychart/
[root@master mychart]# ls
charts Chart.yaml templates values.yaml
# 解析
charts # 默认为空,普通文件夹
Chart.yaml # 用于描述chart的基本信息,包括名字、描述信息以及版本等
templates # 存放所有的yaml模板文件
values.yaml # 用于存储templates目录中的模板文件用到的变量值(全局变量)
3.2.2 编写yaml文件
# 编写yaml文件
# --dry-run 通过设置dryRun查询参数来触发空运行
# Helm也提供了--dry-run和--debug调试参数
# 帮助你验证模板的正确性。在执行helm install的时候带上这两个参数就可以把对应的values值和渲染的资源清单打印出来
# 而不是真正的做部署一个release。
# 导入一个deployment和svc的yaml文件 (也可以自己写)
[root@master templates]# kubectl create deployment web1 --image=nginx:1.17.1 --dry-run -o yaml > deployment.yaml
[root@master templates]# kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > svc.yaml
[root@master templates]# ls
deployment.yaml svc.yaml # 里面的yaml文件就是创建信息
3.2.3 安装mychart
# 安装 mychart # 语法 helm install 安装之后名称(release) 安装之前名称
[root@master ~]# helm install web1 mychart/
NAME: web1
LAST DEPLOYED: Tue Sep 13 17:16:12 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# 查看由chart安装的Pod和svc
[root@master ~]# kubectl get Pods,svc
NAME READY STATUS RESTARTS AGE
...
pod/web1-846fd5fb64-8hlnq 1/1 Running 0 10s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
...
service/web1 NodePort 10.107.44.78 <none> 80:30664/TCP 10s
# 4)应用升级 语法: helm upgrade chart名称
[root@master ~]# helm upgrade web1 mychart/
Release "web1" has been upgraded. Happy Helming!
NAME: web1
LAST DEPLOYED: Tue Sep 13 17:21:31 2022
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
3.3 实现yaml高效复用
高效复用:如果若干 yaml 文件的格式和结果基本相同,只是属性值有所变化时。在使用 Helm 后,针对格式和结构基本相同的 yaml 文件就不需要一遍一遍的进行重复编写了,直接复用即可。其主要实现原理就是通过动态传递参数、动态渲染模板、动态传入参数生成 yaml 文件内容
3.3.1 在values.yaml定义变量和值
# 在values.yaml定义变量和值
[root@master mychart]# vim values.yaml
replicas: 1
image: nginx
tag: 1.16.1
label: nginx
port: 80
2.5.2 在templates的yaml文件使用values.yaml定义变量
通过表达式形式使用全局变量 {{ .Values.变量名称}}
{{ .Release.Name }}意思是获取Release对象的Name值
[root@master templates]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: {{ .Values.label}}
name: {{ .Release.Name}}
spec:
replicas: {{ .Values.replicas}}
selector:
matchLabels:
app: {{ .Values.label}}
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: {{ .Values.label}}
spec:
containers:
- image: {{ .Values.image}}:{{ .Values.tag}}
name: nginx
resources: {}
status: {}
[root@master templates]# cat svc.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: {{ .Values.label}}
name: {{ .Release.Name}}
spec:
ports:
- port: {{ .Values.port}}
protocol: TCP
targetPort: 80
selector:
app: {{ .Values.label}}
type: NodePort
status:
loadBalancer: {}
# 使用 --dry-run参数调试
[root@master ~]# helm install --dry-run web2 mychart/
2.5.3 创建release
[root@master ~]# helm install web2 mychart/
NAME: web2
LAST DEPLOYED: Tue Sep 13 21:08:53 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# 查看创建信息
[root@master ~]# kubectl get Pods
NAME READY STATUS RESTARTS AGE
...
web1-846fd5fb64-8hlnq 1/1 Running 0 3h52m
web2-684844b7bb-jnhg5 0/1 ContainerCreating 0 4s
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
...
web1 NodePort 10.107.44.78 <none> 80:30664/TCP 3h52m
web2 NodePort 10.105.52.102 <none> 80:31656/TCP 12s
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)