Kubernetes 集群管理-Helm部署及使用

Helm 介绍#

Helm 是 Deis 开发的一个用于Kubernetes 应用的包管理工具,主要用来管理 Charts。有点类似 CentOS 中的 yum包管理工具。可以很方便的将之前打包的好的yaml 文件部署到Kubernetes上。

为何需要Helm?#

kubernetes上的应用对象,都是由特定的资源描述组成,包括deploymentservice等,都保存各自文件中或集中写到一个配置文件中,然后通过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

  • 其他特性如下

  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中定义。

 

 

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仓库#

常用仓库如下:

✏️ 添加仓库

添加微软仓库为 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的变量信息,这里将变量文件保存到本地,进行修改后再使用,这里我们将persistenceenabled改为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使用对应如下:

posted @   别来无恙-  阅读(2350)  评论(0编辑  收藏  举报
编辑推荐:
· .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技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示
主题色彩