1 Helm
1.1 前言
Helm的官方网站、Helm的github地址 在没有使用Helm之前,向kubernetes部署应用,我们依次需要编写deployment、service、ingress等yaml文件,然后还需要依次进行部署,步骤比较繁琐。随着项目的微服务化,复杂的应用在容器中部署以及管理显得较为复杂。因此Helm通过打包的方式生成Char模板,然后install Char模板生成release,支持发布的版本管理和控制,很大程度上简化了kubernetes应用的部署和管理。
1.2 Helm的简单介绍
Helm的本质就是让k8s的应用管理(Deployment、Service)可配置,能够动态生成。通过动态生成k8s资源清单文件,然后调用kubectl命令自动执行k8s资源部署。
我们可以将Helm看作Kubernetes下的apt-get/yum。Helm是Deis 开发的一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。
对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。对于使用者而言,使用Helm后不用需要了解Kubernetes的yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用,同时进行少量的配置即可。
除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。
Helm还可以结合Jenkins进行CI、CD进行自动化、流水线构建项目,可以将我们大量重复的步骤省略,节约时间。
Helm的作用有以下几点:
- 快速安装常用应用:许多大公司都有helm仓库,为我们提供了许多优质的应用,可以直接拉取安装,如快速部署Redis集群、安装Jenkins等。
- 多环境部署:通常我们需要多套环境,如开发环境、测试环境、生产环境等,helm可以通过模板+变量的形式实现快速部署。
- 运维与开发隔离:运维人员治理k8s资源,写部署模板及默认设置;开发职员只需要提供少量设置即可,把精力主要集中在开发上。
1.3 Helm的下载和安装
1.3.1 Helm的下载
进入到helm的github地址 ,点击tags

点击最新版本进行下载

在Installation and Upgrading下选择Linux amd64版本进行下载 如果谷歌浏览器下载的速度太慢,可以尝试使用迅雷下载。
1.3.2 Helm的安装
下载完成之后将压缩包上传到k8s-master01中,进行解压
[root@k8s-master01 ~]# tar -zxvf helm-v3.3.3-linux-amd64.tar.gz
linux-amd64/
linux-amd64/helm
linux-amd64/LICENSE
linux-amd64/README.md
#将helm命令移动到/usr/bin目录下
[root@k8s-master01 ~]# mv linux-amd64/helm /usr/bin/检测是否安装成功
[root@k8s-master01 ~]# helm version
version.BuildInfo{Version:"v3.3.3", GitCommit:"55e3ca022e40fe200fbc855938995f40b2a68ce0", GitTreeState:"clean", GoVersion:"go1.14.9"}到此Helm的安装结束,Helm的安装还是非常简单的。
1.3 Helm的基本原理
1.3.1 基本概念
Helm中有四大基本概念:helm客户端、Char、Repository、Release
- helm客户端:主要是命令行,负责管理本地的Charts、repositories,发送Chart,实例安装、查询、卸载等操作。
- Chart:是创建一个应用的信息集合,包括各种Kubernetes对象的配置模板、参数定义、依赖关系、文档说明等,形成一个压缩包.tar。Char是应用部署的自包含逻辑单元。可以将Chart想象成apt、yum中的软件安装包,同时Char模板可以发布到专门的repository。
- Repository: Chart仓库。类似于docker的镜像仓库,可以使用Harbor作为Chart的仓库。
- Release:release是Chart运行的实例,使用
helm install命令在Kubernetes集群中部署的Chart就生成了一个Release。一个Chart能够多次安装到同一个集群,每次安装都是一个Release。Release基于名称空间进行隔离。
1.3.2 基本原理
Helm3的架构

Helm Client一般而言是命令行工具,使用helm添加完Char仓库repository之后,然后执行helm install repo_name/char_name release_name命令。helm客户端会去Char仓库查找是否存在Char模板,如果存在就下载下来。然后helm客户端根据Char模板以及参数,动态生成资源清单文件,helm client使用本地的kube config配置文件去连接k8s集群,然后调用k8s集群提供的api,创建或者是删除资源。至此通过操作helm客户端就完成了k8s上资源的创建和销毁。
1.4 Helm的基本使用
1.4.1 设置helm和kubernetes的自动补全
设置helm命令自动补全
为了方便helm命令的使用,helm提供了自动补全功能,如果使用bash请执行:
source <(helm completion bash)若没有下载自动补全命令,请先下载,然后重启系统
yum install bash-completion -y如果仅仅执行上述命令是不能达到我们预期的,当新开一个 bash 终端后是不能自动补全的,这就需要我们再做些配置,具体的就是将上述命令写到 /etc/profile 或者 ~/.bashrc 文件下。
#将source <(helm completion bash)追加到.bashrc文件中。
[root@k8s-master01 ~]# echo "source <(helm completion bash)" >> ~/.bashrc如果你是用的是xshell,将当前shell窗口断开连接

Connection closed.
Disconnected from remote host(k8s-master01) at 19:11:29.重新连接

Type `help' to learn how to use Xshell prompt.
[c:\~]$
Connecting to 192.168.1.180:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Sun Sep 27 19:09:01 2020 from 192.168.1.1
#按下tab,看到helm已经出现了
[root@k8s-master01 ~]# he
head helm help hexdump可以看到helm自动补全生效了。
设置kubectl的自动补全
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
1.4.2 Helm的命令详解
查看helm的命令帮助
[root@k8s-master01 ~]# helm --help
Usage:
helm [command]
Available Commands:
completion generate autocompletions script for the specified shell
create create a new chart with the given name
dependency manage a chart's dependencies
env helm client environment information
get download extended information of a named release
help Help about any command
history fetch release history
......
Flags:
--add-dir-header If true, adds the file directory to the header
--alsologtostderr log to standard error as well as files
--debug enable verbose output
-h, --help help for helm
--kube-apiserver string the address and the port for the Kubernetes API server
--kube-context string name of the kubeconfig context to use
--kube-token string bearer token used for authentication
--kubeconfig string path to the kubeconfig file
......
Use "helm [command] --help" for more information about a command.从上面可以看到Helm的命令有三类,分别对应repo、Chart、release。
repo:
- helm repo list 列举出添加的repository仓库
- helm repo add [RepoName] [RepoUrl] 添加仓库
- helm repo update 更新仓库
Chart:
- helm search 查找可用的Chart模板
- helm pull, fetch [chart URL | repo/chartname] 下载指定的Chart包到本地
- helm install
- helm create 创建自己的Chart模板
- helm lint PATH 检查自定义的Chart模板是否正确
- helm package 打包Chart,一般是一个压缩包文件
- helm show, inspect [command] 查看关于chart的信息,如定义信息、README和values.yaml文件内容 [command]包含all、chart、readme、values等资源
release: release基于namespace进行隔离
- helm list, ls 列出已经部署的Release
- helm delete [RELEASE] 删除一个Release。
- helm status [RELEASE] 查看指定的Release信息。
- helm upgrade 升级某个Release。
- helm rollback [RELEASE] [REVISION] 回滚Release到指定发布版本。
- helm get values [RELEASE] 查看Release的配置文件值。
- helm history [RELEASE] 查看某个release的升级记录
1.4.2 对repo的基本操作
查看helm repo命令的帮助文档
[root@k8s-master01 ~]# helm repo -h
Usage:
helm repo [command]
Available Commands:
add add a chart repository
index generate an index file given a directory containing packaged charts
list list chart repositories
remove remove one or more chart repositories
update update information of available charts locally from chart repositories- 添加一个Char仓库
命令格式:helm repo add [NAME] [URL] [flags]
一般而言建议添加谷歌官方的Char仓库,不建议添加阿里云的Char仓库。因为阿里云的Char仓库非常老,很少更新,很多Char模板都没有。
[root@k8s-master01 ~]# helm repo add stable https://kubernetes-charts.storage.googleapis.com
"stable" has been added to your repositories
[root@k8s-master01 ~]# helm repo add azure http://mirror.azure.cn/kubernetes/charts/
"azure" has been added to your repositories- 查看添加的repo
[root@k8s-master01 ~]# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com/
azure http://mirror.azure.cn/kubernetes/charts/- 删除某个仓库
helm repo remove [REPO1 [REPO2 …]] [flags] 可以批量删除添加的repo
[root@k8s-master01 ~]# helm repo remove azure
"azure" has been removed from your repositories
#查看添加的仓库是否被删除
[root@k8s-master01 ~]# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com- 更新Char仓库
[root@k8s-master01 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈一般而言添加完仓库之后,最好执行一下该命令。等待大概1分钟后更新完成。
1.4.3 对Char模板的操作
- 搜索repo中的Chart模板
命令格式: helm search repo [repo_name/]chart_name
其中repo_name是可选的,如果不写就是在所有仓库中查找对应的Chart模板
写了repo_name就在指定的repo中查找对应的Chart模板
下面查找wordpress这个Chart模板
[root@k8s-master helm]# helm search repo azure/wordpress
NAME CHART VERSION APP VERSION DESCRIPTION
azure/wordpress 9.0.3 5.3.2 DEPRECATED Web publishing platform for building...
[root@k8s-master helm]# helm search repo wordpress
NAME CHART VERSION APP VERSION DESCRIPTION
apphub/wordpress 8.1.3 5.3.2 Web publishing platform for building blogs and ...
azure/wordpress 9.0.3 5.3.2 DEPRECATED Web publishing platform for building...
stable/wordpress 9.0.3 5.3.2 DEPRECATED Web publishing platform for building...- 下载repo中的Chart模板
命令格式: helm pull, fetch [chart URL | repo/chartname]
下面下载azure/wordpress这个Chart模板
[root@k8s-master helm]# helm pull azure/wordpress
[root@k8s-master helm]# ll
总用量 12136
drwxr-xr-x 3 root root 25 1月 7 11:03 chart
-rw-r--r-- 1 root root 12378363 6月 23 2021 helm-v3.5.4-linux-amd64.tar.gz
-rw-r--r-- 1 root root 41859 1月 7 14:52 wordpress-9.0.3.tgz会将对应的Chart模板下载到本地磁盘上
- 查看Chart模板的详细信息,如readme、values等
命令格式: helm show command
[root@k8s-master helm]# helm show all azure/wordpress
apiVersion: v1
appVersion: 5.3.2
dependencies:
- condition: mariadb.enabled
name: mariadb
repository: https://kubernetes-charts.storage.googleapis.com/
tags:
- wordpress-database
version: 7.x.x
deprecated: true
...该命令会查看Chart的所用信息如values、readme、description等内容
- 自定义Chart模板、打包Chart模板
命令格式: helm create chart_name
helm package
接下来创建一个名为nginx-myapp的Chart模板,本质上是创建了一系列的文件和文件夹。
[root@k8s-master01 helm]# helm create nginx-myapp
Creating nginx-myapp
[root@k8s-master01 helm]# ll
总用量 0
drwxr-xr-x 4 root root 88 9月 27 19:35 nginx-myapp
#如果没tree命令,可以先进行下载
[root@k8s-master01 helm]# yum install -y tree
[root@k8s-master01 helm]# tree
.
└── nginx-myapp
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
4 directories, 10 files可以看到在当前路径下创建了一个nginx-myapp的文件夹。同时使用tree命令查看nginx-myapp文件夹中的内容。
下面详细解释和说明这些文件和文件夹
- .helmignore 类似于gitignore文件,忽略部分提交的文件,该文件可以省略。
- charts:目录里存放这个chart依赖的所有子chart。
- Chart.yaml:用于描述这个 Chart的基本信息,包括名字、描述信息以及版本等。
- Templates: 文件夹里面存放所有yaml模板文件。
- deployment.yaml 核心资源订单文件,包括定义工作负载、镜像等。
- _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用。
- hpa.yaml:自动扩容和缩容的文件,一般不使用。
- ingress.yaml:定义ingress资源的文件。
- NOTES.txt :用于介绍Chart帮助信息,
helm install部署后展示给用户。例如:如何使用这个 Chart、列出缺省的设置等。 - serviceaccount.yaml:pod的访问api-server服务的凭证。
- service.yaml:定义pod的访问方式的资源文件。
- values.yaml :用于存储 templates 目录中模板文件中用到变量的值。核心文件
接下来使用helm lint chart_directory_path命令检测Chart模板语法是否正确
[root@k8s-master helm]# helm lint nginx-myapp/
==> Linting nginx-myapp/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed正确无误后,使用helm package chart_directory命令生成压缩包--version参数可以指定生成Chart模板的版本,如果不设置就是Chart.yaml中定义得version版本号
[root@k8s-master helm]# helm package nginx-myapp/ --version 2.0.0
Successfully packaged chart and saved it to: /root/k8s/helm/nginx-myapp-2.0.0.tgz
[root@k8s-master helm]# ll
总用量 12140
drwxr-xr-x 3 root root 25 1月 7 11:03 chart
-rw-r--r-- 1 root root 12378363 6月 23 2021 helm-v3.5.4-linux-amd64.tar.gz
drwxr-xr-x 4 root root 93 1月 7 15:25 nginx-myapp
-rw-r--r-- 1 root root 3604 1月 7 15:36 nginx-myapp-2.0.0.tgz
-rw-r--r-- 1 root root 41859 1月 7 14:52 wordpress-9.0.3.tgz关于Chart模板语法可以参照官方文档Chart模板指南
1.4.4 对release的操作
- 接下来我们基于刚才打包生成的Chart模板生成release
命令格式:helm install [NAME] [CHART] [flags]
flags常见参数有
- -f或者–values 后面跟上配置文件的路径,覆盖Chart模板中的value.yaml文件中的值
- –set 覆盖Chart模板中的value.yaml文件中的值,例如–set k1=v1 --set k2=v2
- -n 将release创建在哪个namespace下
- –dry-run或者–debug 打印输出所有定义的资源清单文件,不创建相应的k8s资源
[root@k8s-master helm]# helm install mynginx nginx-myapp-2.0.0.tgz --set image.repository=wangyanglinux/myapp --set image.tag=v1
NAME: mynginx
LAST DEPLOYED: Fri Jan 7 16:08:52 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
2. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "/name=nginx-myapp,/instance=mynginx" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT解释说明:
- 上面的命令创建了一个名为mynginx的release,同时使用
--set参数覆盖image.repository和image.tag这两个参数的值 - 后面输出的内容是NOTES文件中的内容
关于可以配置哪些value,可以使用helm show values命令查看Chart模板中可配置选项
[root@k8s-master helm]# helm show values nginx-myapp-2.0.0.tgz
# Default values for nginx-myapp.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
......- 查看release的状态
如果后面仍然想看NOTES文件中的内容可以使用helm status命令,同时可以查看release的状态
命令格式:helm status RELEASE_NAME [flags]
[root@k8s-master helm]# helm status mynginx
NAME: mynginx
LAST DEPLOYED: Fri Jan 7 16:21:39 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
5. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "/name=nginx-myapp,/instance=mynginx" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT- 对于release的列举、升级、回滚和删除
- 对于release的列举
命令格式:helm ls, list [flags]
[root@k8s-master helm]# helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mynginx default 1 2022-01-07 16:21:39.351601019 +0800 CST deployed nginx-myapp-2.0.0 1.16.0可以看到刚才创建的myngix这个release,默认是创建在default名称空间下
查看一下helm创建的k8s资源
[root@k8s-master helm]# kubectl get pod,deploy,rs -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/mynginx-nginx-myapp-66cc857687-hx5w2 1/1 Running 0 12m 10.244.1.4 k8s-node01 <none> <none>
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/mynginx-nginx-myapp 1/1 1 1 12m nginx-myapp wangyanglinux/myapp:v1 /instance=mynginx,/name=nginx-myapp
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/mynginx-nginx-myapp-66cc857687 1 1 1 12m nginx-myapp wangyanglinux/myapp:v1 /instance=mynginx,/name=nginx-myapp,pod-template-hash=66cc857687接下来我们访问一下这个pod,上面的命令中的ip为10.244.1.4
[root@k8s-master helm]# curl 10.244.1.4/hostname.html
mynginx-nginx-myapp-66cc857687-hx5w2
[root@k8s-master helm]# curl 10.244.1.4
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>分别访问得到了hostname和镜像的版本是v1
- 升级release
命令格式:helm upgrade [RELEASE] [CHART] [flags]
常见的flags参数
- –install 如果release没有被创建过就创建
- –description 可以添加一些描述信息,为什么进行升级,在
helm history命令中查看description描述信息- –create-namespace 如果
--install参数被设置了,当对应的namespace不存在时,直接创建- –dry-run 进行调试,并不真正执行
- –set 更新values.yaml文件中的值,例如–set k1=v1 --set k2=v2
- -f, --values 使用文件中的值更新values.yaml文件中的值
接下来更新镜像版本
[root@k8s-master helm]# helm upgrade mynginx nginx-myapp-2.0.0.tgz --set image.repository=wangyanglinux/myapp --set image.tag=v2 --description "镜像版本升级到v2"
Release "mynginx" has been upgraded. Happy Helming!
NAME: mynginx
LAST DEPLOYED: Fri Jan 7 16:48:25 2022
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "/name=nginx-myapp,/instance=mynginx" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
[root@k8s-master helm]# helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mynginx default 2 2022-01-07 16:48:25.089320961 +0800 CST deployed nginx-myapp-2.0.0 1.16.0
[root@k8s-master helm]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mynginx-nginx-myapp-66cc857687-qbwn2 1/1 Running 0 49s 10.244.1.4 k8s-node02 <none> <none>
mynginx-nginx-myapp-769787d8db-mjt2b 0/1 Running 0 10s 10.244.1.5 k8s-node01 <none> <none>
[root@k8s-master helm]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mynginx-nginx-myapp-66cc857687-qbwn2 0/1 Terminating 0 54s 10.244.1.4 k8s-node02 <none> <none>
mynginx-nginx-myapp-769787d8db-mjt2b 1/1 Running 0 15s 10.244.1.5 k8s-node01 <none> <none>
[root@k8s-master helm]# curl 10.244.1.5/hostname.html
mynginx-nginx-myapp-769787d8db-mjt2b
[root@k8s-master helm]# curl 10.244.1.5/
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>可以看到镜像的版本变成了v2
使用helm history命令查看release的版本
[root@k8s-master helm]# helm history mynginx
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Fri Jan 7 16:47:46 2022 superseded nginx-myapp-2.0.0 1.16.0 Install complete
2 Fri Jan 7 16:48:25 2022 superseded nginx-myapp-2.0.0 1.16.0 镜像版本升级到v2DESCRIPTION列中就是--description参数中定义的内容
- 回滚release
处于某些业务需求需要回滚release到指定的版本
命令格式:helm rollback [REVISION] [flags]
其中REVISION可以在release升级历史记录中查找,执行helm history命令即可
回滚mynginx这个release到REVISION 1
[root@k8s-master helm]# helm rollback mynginx 1
Rollback was a success! Happy Helming!
[root@k8s-master helm]# helm status mynginx
NAME: mynginx
LAST DEPLOYED: Fri Jan 7 17:18:10 2022
NAMESPACE: default
STATUS: deployed
REVISION: 3
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "/name=nginx-myapp,/instance=mynginx" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
[root@k8s-master helm]# helm history mynginx
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Fri Jan 7 17:14:06 2022 superseded nginx-myapp-2.0.0 1.16.0 Install complete
2 Fri Jan 7 17:14:19 2022 superseded nginx-myapp-2.0.0 1.16.0 镜像版本升级到v2
3 Fri Jan 7 17:18:10 2022 deployed nginx-myapp-2.0.0 1.16.0 Rollback to 1
[root@k8s-master helm]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mynginx-nginx-myapp-66cc857687-sdf4c 1/1 Running 0 32s 10.244.1.4 k8s-node02 <none> <none>
[root@k8s-master helm]# curl 10.244.1.4
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master helm]# helm get values mynginx
USER-SUPPLIED VALUES:
image:
repository: wangyanglinux/myapp
tag: v1解释说明:
-
helm rollback mynginx 1命令,将mynginx这个release回滚到REVISION 1,同时可以看到新的REVISION版本是3,并不是1 -
helm history mynginx命令,看到REVISION 3的DESCRIPTION描述是Rollback to 1 - 重新访问pod,发现镜像版本是v1
-
helm get values mynginx命令是查看配置的值
接下来是删除操作
- 删除release
命令格式:helm uninstall, un, delete, del RELEASE_NAME […] [flags]
下面删除mynginx这个release
[root@k8s-master helm]# helm uninstall mynginx
release "mynginx" uninstalled
[root@k8s-master helm]# helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
[root@k8s-master helm]# helm ls --uninstalled
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
[root@k8s-master helm]# kubectl get pod
No resources found in default namespace.
2 使用Helm部署常见的应用
前面已经介绍了Helm的概念、安装、基本使用,接下来就用Helm安装几个常见的应用,一起来感受下Helm强大的功能。
2.1 部署、测试nfs-client-provisioner
之前创建的PV都是静态PV,是提前创建好的PV,可供PVC进行绑定。如果每次都要手动创建PV,那样太麻烦了。
我们可以创建一个StorageClass,然后在定义PVC时,声明使用自定义的StorageClass,然后根据PVC动态地创建PV。PVC然后去绑定PV,这样就省去了每次需要手工创建PV的麻烦。
2.1.1 安装NFS服务器
在k8s-master01上安装nfs服务器
#在k8s-master01节点安装NFS服务器
[root@k8s-master01 helm]# yum install -y nfs-common nfs-utils rpcbind
[root@k8s-master01 helm]# mkdir /nfs && chmod 777 /nfs
[root@k8s-master01 helm]# chown nfsnobody /nfs
[root@k8s-master01 helm]# cat > /etc/exports << EOF
/nfs *(rw,no_root_squash,no_all_squash,sync)
EOF
#启动nfs
[root@k8s-master01 helm]# systemctl start rpcbind && systemctl start nfs-server
#设置开启自启
[root@k8s-master01 helm]# systemctl enable rpcbind && systemctl enable nfs-server在k8s-node01、k8s-node02安装客户端工具
[root@k8s-node01 helm]# yum install -y nfs-utils
[root@k8s-node01 helm]# systemctl start nfs-utils && systemctl enable nfs-utils
2.1.2 部署nfs-client-provisioner动态创建PV
在日常学习kubernetes时,经常需要使用把一些数据(例如:数据库、日志等)存储起来,不随着容器的删除而丢失,也就是说一些pod需要持久化存储。对于需要持久化的工作负载可以声明一个pvc,然后需要有合适的pv可供绑定。现在可以使用helm部署nfs-client-provisioner,可以根据pvc(在资源清单中需要storeageClass定义为nfs-client-provisioner)动态地创建pv。存储卷的实现有很多种,此处选择比较容易实现的NFS作为存储。
可以访问 nfs-client-provisioner地址里面有关于配置的详细说明。
安装nfs-client-provisioner
[root@k8s-master01 helm]# helm install nfs-client-provisioner stable/nfs-client-provisioner --set nfs.server=x.x.x.x --set nfs.path=/xxxx --set storageClass.defaultClass=true上面的命令创建一个release实例、配置nfs-server地址、挂载的路径、设置为默认的class
查看创建的nfs-client-provisioner
[root@k8s-master01 nfs-client-provisioner]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nfs-client-provisioner default 1 2020-09-23 15:04:48.690645046 +0800 CST deployed nfs-client-provisioner-1.2.9 3.1.0查看storageclass
[root@k8s-master01 nfs]# kubectl get sc
NAME PROVISIONER AGE
nfs-client (default) cluster.local/nfs-client-provisioner 63m这里default的含义是当定义pvc时,不声明storageClassName时,就会使用默认的default。
查看nfs-client-provisioner对应的Pod
[root@k8s-master01 nfs-client-provisioner]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-6999f4847d-ck52d 1/1 Running 0 34m
2.1.3 测试能否根据pvc动态创建pv
创建一个pvc检测能否动态创建pv,并且绑定到pv中
[root@k8s-master01 nfs]# cat > test-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-nfs-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-client
resources:
requests:
storage: 1Gi
EOFstorageClassName: 需要定义为刚刚创建的nfs-client。这里不写也可以,因为已经将default设置为了nfs-client。
创建pvc,查看能否动态创建pv,pvc能够绑定到对应的pv上。
[root@k8s-master01 nfs]# kubectl apply -f test-pvc.yaml
persistentvolumeclaim/test-nfs-pvc created
[root@k8s-master01 nfs]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-f5207723-c172-4076-bedb-f603115230eb 1Gi RWX Delete Bound default/test-nfs-pvc nfs-client 6s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/test-nfs-pvc Bound pvc-f5207723-c172-4076-bedb-f603115230eb 1Gi RWX nfs-client 6s这里动态创建了一个pv,可以看到PVC处于Bound的状态。
查看/nfs文件夹下的内容。这里的/nfs为使用helm创建nfs-client的release实例时设置的nfs.path的值
[root@k8s-master01 nfs]# ls -l /nfs
总用量 0
drwxrwxrwx 2 root root 6 9月 23 16:03 default-test-nfs-pvc-pvc-f5207723-c172-4076-bedb-f603115230eb文件夹的格式为<namespace-name>-<pvc-name>-<pv-name>-<uuid>
2.2 部署kubernetes-dashboard
kubernetes-dashboard可以认为是k8s的web可视化界面。它的功能较为简单,只是将原有命令行的操作,变成按钮的点击,并没有提高多少生产力。有另外更加强大的k8s的发行版,例如kubesphere等。使用kubesphere可以进行生产级别的K8S部署和使用,内含多租户管理、DevOps 系统、丰富的可观察性等。
2.2.1 拉取镜像
由于kubelet拉取镜像经常超时,所以k8s-node01和k8s-node02提前拉取镜像
在k8s-node01机器上进行操作,从阿里云拉取镜像的命令
[root@k8s-node01 ~]# docker pull /google_containers/kubernetes-dashboard-amd64:v1.10.1重新打标签
[root@k8s-node01 ~]# docker tag /google_containers/kubernetes-dashboard-amd64:v1.10.1 /kubernetes-dashboard-amd64:v1.10.1将镜像打成tar包
[root@k8s-node01 ~]# docker save -o dashboard.tar /kubernetes-dashboard-amd64:v1.10.1将tar包复制到k8s-node02。这里需要在/etc/hosts文件中配置ip和host的映射关系
[root@k8s-node01 ~]# scp ./dashboard.tar root@k8s-node02:/root
root@k8s-node02's password:
dashboard.tar登录到k8s-node02,加载镜像
[root@k8s-node01 ~]# ssh root@k8s-node02
root@k8s-node02's password:
Last login: Fri Sep 18 17:20:20 2020 from 192.168.1.1
[root@k8s-node02 ~]# pwd
/root
[root@k8s-node02 ~]# ls
anaconda-ks.cfg dashboard.tar ingress-controller.tar init.log kuadm-image.sh kubeadm-config.yaml kubeadm-init.log kubernetes.conf
## 加载镜像
[root@k8s-node02 ~]# docker load -i dashboard.tar
Loaded image: /kubernetes-dashboard-amd64:v1.10.1
[root@k8s-node02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
......
/kubernetes-dashboard-amd64 v1.10.1 f9aed6605b81 21 months ago 122MB
......
## 退出
[root@k8s-node01 ~]# exit
2.2.2 helm安装dashboard
下载dashboard的Chart模板,并且解压Chart模板
[root@k8s-master01 dashboard]# helm fetch stable/kubernetes-dashboard
[root@k8s-master01 dashboard]# ls
kubernetes-dashboard-0.6.0.tgz
[root@k8s-master01 dashboard]# tar -zxvf kubernetes-dashboard-0.6.0.tgz
kubernetes-dashboard/Chart.yaml进入到kubernetes-dashboard文件夹下
[root@k8s-master01 dashboard]# cd kubernetes-dashboard
[root@k8s-master01 kubernetes-dashboard]# ll
总用量 16
-rwxr-xr-x 1 root root 393 1月 1 1970 Chart.yaml
-rwxr-xr-x 1 root root 6513 1月 1 1970 README.md
drwxr-xr-x 2 root root 189 9月 20 20:00 templates
-rwxr-xr-x 1 root root 2435 1月 1 1970 values.yaml编辑dashboard的配置文件
[root@k8s-master01 kubernetes-dashboard]# cat > k8s-dashboard.yaml << EOF
image:
repository: /kubernetes-dashboard-amd64
tag: v1.10.1
ingress:
enabled: true
hosts:
-
annotations:
/ssl-redirect: "true"
/backend-protocol: "HTTPS"
tls:
- secretName: frognew-com-tls-secret
hosts:
-
rbac:
clusterAdminRole: true
EOF安装dashboard
[root@k8s-master01 kubernetes-dashboard]# helm install kubernetes-dashboard stable/kubernetes-dashboard --namespace kube-system -f ./k8s-dashboard.yaml
NAME: kubernetes-dashboard
LAST DEPLOYED: Sun Sep 20 20:03:37 2020
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
*********************************************************************************
*** PLEASE BE PATIENT: kubernetes-dashboard may take a few minutes to install ***
*********************************************************************************
From outside the cluster, the server URL(s) are:
https://这里建议使用ingress暴露服务的方式,进行访问。查看一下ingress-nginx的service
[root@k8s-master01 kubernetes-dashboard]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.108.159.146 <none> 80:30080/TCP,443:30443/TCP 7d21h这里在window的hosts文件中添加一个记录。node01或者是node02的ip
打开浏览器访问dashboard,输入https://:30443进行访问
提示不安全,继续访问,进入到登录页面,选择token的方式
到k8s-master01中查看token的值
[root@k8s-master01 kubernetes-dashboard]# kubectl describe secret $(kubectl get secret -n kube-system | grep kubernetes-dashboard-token | awk '{print $1}') -n kube-system
Name: kubernetes-dashboard-token-x7tlt
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/: kubernetes-dashboard
kubernetes.io/service-account.uid: 1e4c7bb5-63a6-4f47-b2dd-83350cf3f815
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi14N3RsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFlNGM3YmI1LTYzYTYtNGY0Ny1iMmRkLTgzMzUwY2YzZjgxNSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.DOhRd3jwuTl-2_WVxT5OnNLQ7u7HgYyML1E75EzKTVI12EN6x2jdtIsubCeZpRnFmjNtcd5zDCEHeE4-4tVzZouysuo9bOTCJagdXJHqSoBEYrIX8uzjoU4RAILo9r5sieZmkjFmzcCUwARC2AR9fovcwwjoThqa2jvkO9amlouXaiU6cD-SoCi-d3YkMILcB9CHBhthi-RRg71YNsV4_its7gKsvzJU2ZKmPJu2WXp4GLk5r1aR5mzyG6TamBx32RoYHQj0j3RRu4LnULMYAZO_TTlspQgS_feXFViEO4ziZr3CxX9odUAB_Nlbhmpfe3yiiEz8OaWd5_H1YMn-xQ复制到输入框中

点击登录进入到管理控制台

到此dashboard安装完毕。
2.3 部署metrics-server
Metrics-Server是集群核心监控数据的聚合器。通俗地说,它存储了集群中各节点的监控数据,并且提供了API以供分析和使用。Metrics-Server主要是为了后面的prometheus和HPA服务的。
先将metrics-server的Char模板下载下来
[root@k8s-master01 metrics-server]# helm fetch stable/metrics-server
[root@k8s-master01 metrics-server]# ll
总用量 12
-rw-r--r-- 1 root root 5349 9月 23 19:56 metrics-server-2.11.2.tgz使用helm安装
#这里先编写一个配置文件
[root@k8s-master01 metrics-server]# cat > metrics-server.yaml << EOF
args:
- --logtostderr
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
EOF使用Char模板创建一个release
#使用 --set key1=value1 的方式覆盖values.yaml文件中的内容
#由于谷歌镜像仓库的镜像无法下载,这里使用阿里云的镜像仓库
[root@k8s-master01 metrics-server]# helm install metrics-server metrics-server-2.11.2.tgz -n kube-system --set image.repository=/google_containers/metrics-server-amd64 -f metrics-server.yaml
NAME: metrics-server
LAST DEPLOYED: Wed Sep 23 20:10:56 2020
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
NOTES:
The metric server has been deployed.
In a few minutes you should be able to list metrics using the following
command:
kubectl get --raw "/apis//v1beta1/nodes"查看创建的release,对应的Pod。release是基于名称空间进行隔离的。查看是需要带上对应的namespace
[root@k8s-master01 metrics-server]# helm list -n kube-system
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
kubernetes-dashboard kube-system 1 2020-09-18 17:35:25.467888884 +0800 CST deployed kubernetes-dashboard-1.11.1 1.10.1
metrics-server kube-system 1 2020-09-23 20:10:56.294380547 +0800 CST deployed metrics-server-2.11.2 0.3.6
#查看对应的Pod
[root@k8s-master01 metrics-server]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
......
metrics-server-6b5d9d4c9-nqdbg 0/1 Running 0 24s
......
#运行推荐的命令
[root@k8s-master01 metrics-server]# kubectl get --raw "/apis//v1beta1/nodes"
{"kind":"NodeMetricsList","apiVersion":"/v1beta1","metadata":{"selfLink":"/apis//v1beta1/nodes"},"items":[]}使用metrics-server
#查看node的资源(内存、cpu)的使用情况
[root@k8s-master01 metrics-server]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master01 97m 4% 1350Mi 35%
k8s-node01 41m 1% 641Mi 11%
k8s-node02 51m 1% 634Mi 11%
#查看Pod的cpu、内存的使用情况
[root@k8s-master01 metrics-server]# kubectl top pod --all-namespaces
NAMESPACE NAME CPU(cores) MEMORY(bytes)
......
default nfs-client-provisioner-6999f4847d-ck52d 4m 9Mi
......
2.4 部署Harbor仓库
Harbor的github地址
Harbor仓库的安装方式有两种。
- docker + docker compose。
- helm
既然学习了helm,那么就使用helm安装harbor仓库。
这里有一些前提条件
- Kubernetes cluster 1.16+
- Helm 2.10.0+
如果k8s的版本低于1.16可以查看之前的文章使用kubeadm升级k8s集群 Helm如果是2.X升级到3.X非常简单,下载压缩包,解压即可使用了。
2.4.1添加harbor的repo仓库、更新harbor的repo仓库
[root@k8s-master01 harbor]# helm repo add harbor https://helm.goharbor.io
"goharbor" has been added to your repositories
[root@k8s-master01 harbor]# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
harbor https://helm.goharbor.io
[root@k8s-master01 harbor]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "harbor" chart repository
2.4.2 搜索和下载harbor仓库的Char模板
[root@k8s-master01 harbor]# helm search repo harbor/harbor
NAME CHART VERSION APP VERSION DESCRIPTION
harbor/harbor 1.5.0 2.1.0 An open source trusted cloud native registry th...
[root@k8s-master01 harbor]# helm fetch harbor/harbor
[root@k8s-master01 harbor]# ll
总用量 44
-rw-r--r-- 1 root root 44741 9月 28 10:12 harbor-1.5.0.tgz
2.4.3 安装harbor
可以查看harbor的详细配置。
主要有Service、Persistent Volume、TLS证书相关的配置
[root@k8s-master01 harbor]# helm install harbor harbor-1.5.0.tgz --set expose.type=nodePort --set expose.tls.enabled=false --set externalURL=http://192.168.1.180:30002
NAME: harbor
LAST DEPLOYED: Mon Sep 28 10:34:00 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at http://192.168.1.180:30002
For more details, please visit https:///goharbor/harbor这里解释一下参数的含义
- expose.type=nodePort 这里使用nodePort的方式暴露服务
- expose.tls.enabled=false 不使用https的方式访问
- externalURL=http://192.168.1.180:30002 可供外部访问的地址。ip为k8s中node的ip
- 这里还有一些默认值例如 persistence.enabled 是否开启持久化存储。默认是true。前面安装了nfs-clinet 这个默认的StorageClass。可以根据PVC,动态生成PV。如果没有安装,可以设置为false。
- 另外harbor还有许多功能性的组件例如redis、Database。可以使用外部的,如果使用外部的,需要进行相应的配置。
- harborAdminPassword 可以设置harbor的初始化密码。默认是Harbor12345
查看创建的harbor release
[root@k8s-master01 harbor]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
harbor default 1 2020-09-28 10:34:00.943649278 +0800 CST deployed harbor-1.5.0 2.1.0
kubeadm kubectl kubelet
[root@k8s-master01 harbor]# kubectl get pod
NAME READY STATUS RESTARTS AGE
......
harbor-harbor-chartmuseum-78f6898f58-xt9kw 0/1 ContainerCreating 0 21s
......最好是现将相关的镜像在k8s-node01和k8s-node02节点下载下来,因为kubelet拉取镜像经常失败。如果kubelet拉取镜像失败,需要删除Pod,k8s会自动重启相应的Pod。
等待一段时间后Harbor所有相关的Pod都处于Running状态,且已经就绪,就可以访问harbor仓库了。
2.4.4 使用harbor仓库
打开浏览器,输入刚才设置的externalURL http://192.168.1.180:30002/

用户名是admin,密码是Harbor12345。
新建一个项目test_char 这里的项目可以理解为仓库。

新建一个用户

添加test_char仓库到Helm的repo中
[root@k8s-master01 helm]# helm repo add test_char http://192.168.1.180:30002/chartrepo/test_char
"char_harbor" has been added to your repositories
[root@k8s-master01 helm]# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
harbor https://helm.goharbor.io
char_harbor http://192.168.1.180:30002/chartrepo
[root@k8s-master01 helm]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "test_push_char" chart repository
...Successfully got an update from the "harbor" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈如果想要将本地的chart模板push到harbor的chart仓库中,需要先下载push插件。
下载push的插件
[root@k8s-master01 helm]# helm plugin install https:///chartmuseum/helm-push
Downloading and installing helm-push v0.8.1 ...
https:///chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz这里如果插件的压缩包始终下载不下来,可以使用将url复制到迅雷进行下载
然后上传到k8s-master01中,先进行解压
[root@k8s-master01 plugin]# tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz
LICENSE
plugin.yaml
bin/helmpush
[root@k8s-master01 plugin]# ll
总用量 9520
drwxr-xr-x 2 root root 22 9月 28 23:33 bin
-rw-r--r-- 1 root root 9729851 9月 28 21:48 helm-push_0.8.1_linux_amd64.tar.gz
-rw-r--r-- 1 501 games 11357 12月 17 2019 LICENSE
-rw-r--r-- 1 501 games 395 12月 17 2019 plugin.yaml然后添加插件
[root@k8s-master01 plugin]# helm plugin install .
#提示插件已经存在,先删除插件,重新添加
Error: plugin already exists
[root@k8s-master01 plugin]# helm plugin ls
NAME VERSION DESCRIPTION
push 0.8.1 Push chart package to ChartMuseum
[root@k8s-master01 plugin]# helm plugin uninstall push
Uninstalled plugin: push
[root@k8s-master01 plugin]# helm plugin install .
sh: scripts/install_plugin.sh: 没有那个文件或目录
Error: plugin install hook for "push" exited with error
#这里添加成功
[root@k8s-master01 plugin]# helm plugin ls
NAME VERSION DESCRIPTION
push 0.8.1 Push chart package to ChartMuseum接下来测试push的功能,将之前下载的metrics-server的Char模板推到char仓库中
[root@k8s-master01 metrics-server]# helm push metrics-server-2.11.2.tgz test_char --username admin --password=Harbor12345
Pushing metrics-server-2.11.2.tgz to test_push_char...
Done.去Harbor的仓库中查看Char是否上传成功

这里看到Chart模板已经推送成功。
但是怎么从Char仓库下载指定的Char模板呢?
- 首先更新repo仓库
- 搜索Char模板时指定Char仓库
- 下载Char模板时指定Chart仓库
是不是和拉取docker的镜像很类似啊。
[root@k8s-master01 metrics-server]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "test_char" chart repository
...Successfully got an update from the "harbor" chart repository
[root@k8s-master01 metrics-server]# helm search repo test_push_char/metrics-server
NAME CHART VERSION APP VERSION DESCRIPTION
test_push_char/metrics-server 2.11.2 0.3.6 Metrics Server is a cluster-wide aggregator of ...
[root@k8s-master01 metrics-server]# helm pull test_char/metrics-server
[root@k8s-master01 metrics-server]# ll
总用量 12
-rw-r--r-- 1 root root 5356 9月 28 23:52 metrics-server-2.11.2.tgz到此Harbor安装和简单使用到这里就结束了。
2.5 部署prometheus

















