Kubernetes 集群管理-Helm部署及使用
Helm 介绍#
Helm 是 Deis 开发的一个用于Kubernetes
应用的包管理工具,主要用来管理 Charts
。有点类似 CentOS 中的 yum包管理工具。可以很方便的将之前打包的好的yaml
文件部署到Kubernetes
上。
为何需要Helm?#
kubernetes上的应用对象,都是由特定的资源描述组成,包括deployment
、service
等,都保存各自文件中或集中写到一个配置文件中,然后通过kubectl apply -f ...
进行部署。
如果应用只是一个或几个这样的服务组成,上面的部署方式足够了。而对于一个复杂的应用,会有很多类似上面的资源文件,例如为服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,而这种组织和管理应用的方式就显得力不从心。且由于缺少对发布过的应用版本管理和空置,使Kubernetes
上的应用和更新等面临诸多的挑战。主要面临以下几个问题:
- 如何管理、编辑和更新这些分散的
kubernetes
应用配置文件。 - 如何把一套相关的配置文件作为一个应用进行管理。
- 如何分发和重用
kubernetes
的应用配置。
Helm 组件#
✏️ helm
Helm是一个命令行下的客户端工具,主要用于kubernetes
应用程序Chart
的创建、打包、发布和管理
✏️ Tiller
Tiller 是 Helm 的服务端,部署在Kubernetes
集群中,Tiller 用于接收 Helm 的请求,并根据 Chart 生成 kubernetes 的部署文件(Helm称为Release),然后提交给 Kubernetes 创建应用,Tiller 还提供了 Release 的升级、删除、回滚等一系列功能
✏️ Chart
Helm 的软件包,采用 TAR 格式,类似于 yum 的 rpm包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件
✏️ Release
基于 Chart 部署实体,一个 chart 被 helm 运行后将会生成对应的一个 release;将在 kubernetes 中创建出真实运行的资源对象。
✏️ Repoistory
Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
Helm 工作原理#
下图描述了 Helm 的几个关键组件 Helm(客户端)、Tiller(服务器)、Repository(Chart软件仓库)、Chart(软件包)之间的关系。
Chart Install 过程
- Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
- Heml 将指定的 Chart 结构和 Values 信息通过 gRPC 传递给 Tiller。
- Tiller 根据 Chart 和 Values 生成一个 Release。
- Tiller 根据 Release 发送给 Kubernetes 用于生成 Release。
Chart Update 过程
- Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
- Helm 将需要更新的 Release 的名称、Chart结构和 Values 信息传递给 Tiller。
- Tiller 生成 Release 并更新指定名称的 Release 和 History。
- Tiller 将 Release 发送给 Kubernetes 用于更新 Release。
Chart Rollback 过程
- Helm 将要回滚的 Release 的名称传递给 Tiller。
- Tiller 根据 Release 的名称查找 History。
- Tiller 从 History 中获取上一个 Release。
- Tiller 将上一个 Release 发送给 Kubernetes 用于替换当前 Release。
Chart 处理依赖说明
Tiller 在处理 Chart 时,直接将 Chart 以及其依赖的所有 Charts 合并为一个 Release,同时传递给 Kubernetes。因此 Tiller 并不负责管理依赖之间的启动顺序。Chart 中的应用需要能够自行处理依赖关系。
Helm 版本介绍#
Helm2时期,添加了Tiller组件和GRPC来处理Helm chart的安装和管理,呈现chart并将它们推送到Kubernetes API服务器,2019年11月13日,Helm 团队发布了 Helm v3
的第一个稳定版本
架构变化
很明显从helm v3
移除了 Tiller
Helm 3新特性
-
Release
名称可以在不同命名空间重用 -
支持将 Chart 推送至 Docker 镜像仓库中
-
使用JSONSchema验证chart values
-
其他特性如下
-
为了更好地协调其他包管理者的措辞
Helm CLI
个别更名helm delete` 更名为 `helm uninstall helm inspect` 更名为 `helm show helm fetch` 更名为 `helm pull 但以上旧的命令当前仍能使用
-
移除了用于本地临时搭建
Chart Repository
的helm serve
命令。 -
自动创建名称空间
在不存在的命名空间中创建发行版时,Helm 2创建了命名空间。Helm 3遵循其他Kubernetes对象的行为,如果命名空间不存在则返回错误。
-
不再需要
requirements.yaml
, 依赖关系是直接在chart.yaml
中定义。
Helm 部署#
helm 部署方式有很多,可以参考官方文档
helm v2 部署#
1.下载helm
# wget https://mirrors.huaweicloud.com/helm/v2.16.9/helm-v2.16.9-linux-amd64.tar.gz
2.安装配置
# tar xvzf helm-v2.16.9-linux-amd64.tar.gz
# cp -av linux-amd64/helm /usr/bin/
# cp -av linux-amd64/tiller /usr/bin/
3.指定配置文件(此步骤视情况而定,比如rke部署的k8s集群则需要;kubeadm部署的集群默认在master节点则不需要)
# vim /root/.bashrc
alias helm='helm --kubeconfig /home/rancher/kube_config_cluster.yml'
# source /root/.bashrc
4.在kube-system命名空间中创建serviceaccount
# kubectl create serviceaccount --namespace kube-system tiller
5.创建ClousterRoleBinding以授予tiller账户对集群的访问权限
# kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=kube-system:tiller
6.安装helm server(tiller),注意保持版本号相同
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.9 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --force-upgrade
7.查看tiller服务是否正常运行
# kubectl get pod -n kube-system -l app=helm
NAME READY STATUS RESTARTS AGE
tiller-deploy-79f8998f84-85lwq 1/1 Running 0 45s
8.查看版本(注意:client和server版本必须要保持一致)
# helm version
Client: &version.Version{SemVer:"v2.16.9", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.9", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
补充:如果需要在kubernetes
中卸载已部署的 Tiller, 可使用如下命令进行卸载
# helm reset
helm v3 部署#
helm v3
已经移除了tiller
,所以只需要部署helm客户端即可,即解压软件移动命令即可
# wget https://mirrors.huaweicloud.com/helm/v3.2.1/helm-v3.2.1-linux-amd64.tar.gz
# tar xvzf helm-v3.2.1-linux-amd64.tar.gz
# cp -av linux-adm64/helm /usr/bin/
helm 常用命令#
命令 | 描述 |
---|---|
create | 创建一个chart并指定名字 |
dependency | 管理chart依赖 |
get | 下载一个release。可用子命令:all、hooks、manifest、notes、values |
history | 获取release历史 |
install | 安装一个chart |
list | 列出release |
package | 将chart目录打包到chart存档文件中 |
pull | 从远程仓库中下载chart并解压到本地 # helm pull stable/mysql --untar |
repo | 添加,列出,移除,更新和索引chart仓库。可用子命令:add、index、list、remove、update |
rollback | 从之前版本回滚 |
search | 根据关键字搜索chart。可用子命令:hub、repo |
show | 查看chart详细信息。可用子命令:all、chart、readme、values |
status | 显示已命名版本的状态 |
template | 本地呈现模板 |
uninstall | 卸载一个release |
upgrade | 更新一个release |
version | 查看helm客户端版本 |
添加Chart仓库#
常用仓库如下:
- 微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库强烈推荐,基本上官网有的chart这里都有。
- 阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
- 官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,由于众所周知原因,在国内有点不好使,故不推荐。
- elasticsearch (https://helm.elastic.co) elastic
✏️ 添加仓库
添加微软仓库为 stable
# helm repo add stable http://mirror.azure.cn/kubernetes/charts
"stable" has been added to your repositories
添加阿里云仓库为 aliyun
# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"aliyun" has been added to your repositories
✏️ 查看仓库
# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
✏️ 查看一个仓库中所有的包
# helm search repo stable
NAME CHART VERSION APP VERSION DESCRIPTION
stable/acs-engine-autoscaler 2.2.2 2.1.1 DEPRECATED Scales worker nodes within agent pools
stable/aerospike 0.3.2 v4.5.0.5 A Helm chart for Aerospike in Kubernetes
stable/airflow 7.1.5 1.10.10 Airflow is a platform to programmatically autho...
stable/ambassador 5.3.2 0.86.1 DEPRECATED A Helm chart for Datawire Ambassador
stable/anchore-engine 1.6.9 0.7.2 Anchore container analysis and policy evaluatio...
✏️ 删除仓库
# helm repo remove aliyun
"aliyun" has been removed from your repositories
Helm 基本使用#
部署一个应用#
这里示例通过helm部署一个MySQL进行示例
1.查找 chart
:
# helm search repo mysql
NAME CHART VERSION APP VERSION DESCRIPTION
stable/mysql 1.6.4 5.7.30 Fast, reliable, scalable, and easy to use open-...
......
2.查看下这个chart
的变量信息,这里将变量文件保存到本地,进行修改后再使用,这里我们将persistence
中enabled
改为false
,表示不适用存储卷,查看变量文件可以发现会自动绑定pvc
,但是这里没有提前准备pv
,如果不修改也可以,先创建一个pv即可。
# helm show values stable/mysql > values.yaml
# vim values.yaml
persistence:
enabled: false # 修改为false
## database data Persistent Volume Storage Class
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, standard on
## GKE, AWS & OpenStack)
##
# storageClass: "-"
accessMode: ReadWriteOnce
size: 8Gi
annotations: {}
3.通过helm install
进行安装,这里由于修改了values
,所以通过-f
指定了本地的values.yaml
文件
# helm install my-mysql -f values.yaml stable/mysql
NAME: my-mysql
LAST DEPLOYED: Sun Jun 21 13:35:04 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
my-mysql.default.svc.cluster.local
To get your root password run:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
To connect to your database:
1. Run an Ubuntu pod that you can use as a client:
kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
2. Install the mysql client:
$ apt-get update && apt-get install mysql-client -y
3. Connect using the mysql cli, then provide your password:
$ mysql -h my-mysql -p
To connect to your database directly from outside the K8s cluster:
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Execute the following command to route the connection:
kubectl port-forward svc/my-mysql 3306
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
4.查看状态
# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-mysql default 1 2020-06-21 13:38:32.133419251 +0800 CST deployed mysql-1.6.4 5.7.30
查看发布状态
# helm status my-mysql
查看pod状态
# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-mysql-7557c5798c-lvshx 1/1 Running 0 35s
5.根据上面提示的查看密码,进行连接MySQL进行测试
# kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
i8MgJpwwZe
# kubectl exec -it my-mysql-7557c5798c-lvshx -- mysql -u root -pi8MgJpwwZe
......
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
构建一个 Helm Chart#
上面变示例了通过helm部署一个应用(MySQL)。我们也可以进行自行构建Chart
进行部署。
Chart 目录结构说明
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
- Chart.yaml:用于描述这个 Chart 的基本信息,包括名字、描述信息以及版本等。
- values.yaml:用于存储 templates 目录中模板文件中用到的变量的值。
- templates:目录里面存放所有的 yaml 模板文件。
- charts:目录里存放这个 chart 依赖的所有子 chart。
- NOTES.txt:用于介绍 Chart 帮助信息,helm install 部署后展示给用户;例如:如何使用这个Chart,列出缺省的设置等。
- _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用
📝 示例
构建 Chart#
1.首先通过create生成chart模板样式,进行修改即可,这里采用完全自定义,所以我们将用不到的yaml文件进行删除
# helm create mychart
Creating mychart
# tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
└── values.yaml
2 directories, 2 files
2.修改Chart.yaml文件,定义版本和名字等
# cd mychart/
# vim Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: 1.16.0
3.这里部署通过部署一个web站点nginx进行示例,首先通过kubectl create 生产一个deployment 模板进行修改,下面yaml文件中将 副本数(replicas)、name、image定义为了变量进行传递
# kubectl create deployment deployment --image=nginx:1.12 --dry-run -o yaml > templates/deployment.yaml
# vim templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deployment
name: {{ .Values.Name }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: deployment
template:
metadata:
labels:
app: deployment
spec:
containers:
- image: {{ .Values.image }}
name: nginx
4.编写变量文件
# vim values.yaml
Name: mychart-deploy-demo
replicas: 3
image: nginx:1.18.0
其实上面这两个文件的内容就已经算是一个可以安装的chart包了。
5.进行安装
# helm install web mychart/
NAME: web
LAST DEPLOYED: Sun Jun 21 17:50:53 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-mysql default 1 2020-06-21 17:15:24.316454342 +0800 CST deployed mysql-1.6.4 5.7.30
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mychart-deploy-demo-8475948ddd-565kk 1/1 Running 0 11s 10.244.1.35 k8s-node1 <none> <none>
mychart-deploy-demo-8475948ddd-6d69h 1/1 Running 0 11s 10.244.2.33 k8s-node2 <none> <none>
mychart-deploy-demo-8475948ddd-gvqqv 1/1 Running 0 11s 10.244.2.32 k8s-node2 <none> <none>
升级#
1.首先进行访问测试,可以看到访问结果nginx版本为1.18.0
# curl -I 10.244.1.35
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sun, 21 Jun 2020 10:15:08 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Apr 2020 12:43:12 GMT
Connection: keep-alive
ETag: "5e9eea60-264"
Accept-Ranges: bytes
2.发布新版本的chart时,或者当要更改发布的配置时,可以使用helm upgrade
命令,比如这里升级镜像为1.19.0
# helm upgrade --set image=nginx:1.19.0 web mychart
Release "web" has been upgraded. Happy Helming!
NAME: web
LAST DEPLOYED: Sun Jun 21 18:20:10 2020
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mychart-deploy-demo-59fc9f9c7f-kk5mq 1/1 Running 0 15s 10.244.2.35 k8s-node2 <none> <none>
mychart-deploy-demo-59fc9f9c7f-w94zq 1/1 Running 0 12s 10.244.2.36 k8s-node2 <none> <none>
mychart-deploy-demo-59fc9f9c7f-x2pxg 1/1 Running 0 14s 10.244.1.39 k8s-node1 <none> <none>
访问测试
# curl -I 10.244.1.39
HTTP/1.1 200 OK
Server: nginx/1.19.0
Date: Sun, 21 Jun 2020 10:26:16 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 26 May 2020 15:00:20 GMT
Connection: keep-alive
ETag: "5ecd2f04-264"
Accept-Ranges: bytes
可以看到已经升级镜像版本为1.19.0版本,如果有大量的改动,那么可以修改values文件,然后通过如下命令进行更新
# helm upgrade -f values.yaml web mychart
回滚#
如果在发布后没有达到预期的效果,则可以使用helm rollback
回滚到之前的版本。通过helm history
命令可以查看发布版本记录
# helm history web
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Sun Jun 21 18:24:41 2020 superseded mychart-0.1.0 1.16.0 Install complete
2 Sun Jun 21 18:25:27 2020 deployed mychart-0.1.0 1.16.0 Upgrade complete
比如这里我们要回滚到第一个版本:
# helm rollback web 1
Rollback was a success! Happy Helming!
在通过helm history
命令进行查看,可以看到后面的 DESCRIPTION还有详细版本说明。
# helm history web
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Sun Jun 21 18:24:41 2020 superseded mychart-0.1.0 1.16.0 Install complete
2 Sun Jun 21 18:25:27 2020 superseded mychart-0.1.0 1.16.0 Upgrade complete
3 Sun Jun 21 18:30:52 2020 deployed mychart-0.1.0 1.16.0 Rollback to 1
还可以通过helm get manifest
命令查看模板被渲染过后的资源文件
# helm get manifest web
---
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deployment
name: mychart-deploy-demo
spec:
replicas: 3
selector:
matchLabels:
app: deployment
template:
metadata:
labels:
app: deployment
spec:
containers:
- image: nginx:1.18.0
name: nginx
打包#
如果我们需要将构建的Chart打包保存,并推送到charts仓库共享别人使用,则可以通过helm package
命令进行打包
# helm package mychart/
Successfully packaged chart and saved it to: /root/helm/mychart-0.1.0.tgz
Helm 自定义安装#
有时候我们需要安装应用,但是默认的chart的一些参数并不是我们需要的,这时候则需要我们自定义参数传给已有的 chart 进行安装应用。示例,下面将进行自定义安装MySQL
查看Chart默认value#
# helm show values stable/mysql
......
## Specify password for root user
##
## Default: random 10 character string
# mysqlRootPassword: testing
## Create a database user
##
# mysqlUser:
## Default: random 10 character string
# mysqlPassword:
## Allow unauthenticated access, uncomment to enable
##
# mysqlAllowEmptyPassword: true
## Create a database
##
# mysqlDatabase:
......
persistence:
enabled: true
......
在安装过程中传递配置数据的方式有两种:
- --values(或-f):指定带有替代参数及值的YAML文件,可以多次指定,最后一个文件的优先级最高。
- --set:在命令行上指定替代。
配置文件定义配置项#
通过上面查看默认的变量中,我们进行自定义MySQL root用户密码,并安装完成自动创建一个应用用户及设置密码,并创建一个应用数据库helm;同事设定了不启用persistence
# vim mysql_values.yaml
mysqlRootPassword: te123
mysqlUser: helm
mysqlPassword: helm123
mysqlDatabase: helm
persistence:
enabled: false
命令行定义配置项#
# helm install --set mysqlRootPassword=te123,mysqlUser=helm,mysqlPassword=helm123,mysqlDatabase=helm,persistence.enabled=false mysql-test stable/mysql
更多values yaml与set使用对应如下:
作者:别来无恙-
出处:https://www.cnblogs.com/yanjieli/p/13176133.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类