第十一章 Helm-Kubernetes包管理器
每个成功的软件平台都有一个优秀的打包系统,比如 Debian、Ubuntu 的 apt,Redhat、Centos 的 yum。而 Helm 则是 Kubernetes 上的包管理器。
本章我们将讨论为什么需要 Helm,它的架构和组件,以及如何使用 Helm。
11.1 Why Helm
Helm 到底解决了什么问题?为什么 Kubernetes 需要 Helm?
答案是:Kubernetes 能够很好地组织和编排容器,但它缺少一个更高层次的应用打包工具,而 Helm 就是来干这件事的。
先来看个例子。
比如对于一个 MySQL 服务, Kubernetes 需要部署下面这些对象:
1.Service,让外界能够访问到 MySQL。
$cat mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-mysql
labels:
app: my-mysql
spec:
selector:
app: my-mysql
ports:
- protocol: "TCP"
port: 3306
targetPort: 3306
2.Secret,定义 MySQL 的密码
$vim helm/mysql-secret.yml
apiVersion: v1
kind: Secret
metadata:
name: my-mysql
labels:
app: my-mysql
data:
mysql-root-password: YWRtaW4=
mysql-password: YWJjZGVm
3.PersistentVolumeClaim,为 MySQL 申请持久化存储空间。
4.Deployment,部署 MySQL Pod,并使用上面的这些支持对象。
我们可以将上面这些配置保存到对象各自的文件中,或者集中写进一个配置文件,然后通过 kubectl apply -f 部署。如果服务少,这样问题也不大,但是如果是微服务架构,服务多达数十个甚至上百个,这种组织和管理应用的方式就不好使了:
(1)很难管理、编辑和维护如此多的服务。每个服务有若干个配置,缺乏更高层次的工具将这些配置组织起来。
(2)不容易将这些服务作为一个整体统一发布。
(3)不能高效的共享和重用服务。比如两个应用都用到MySQL服务,但是配置参数不一样,这两个应用只能分别复制一套标准MySQL配置文件,修改后通过kubectl apply部署。也就是不支持参数化配置和多环境部署。
(4)不支持应用级别的版本管理。虽然可以通过kubectl rollout undo进行回滚,但这只针对单个deployment,不支持整个应用的的回滚。
(5)不支持对部署的应用状态进行验证。比如是否能通过预定义账号访问MySQL。虽然K8s有健康检查,但那时针对单个容器,我们需要应用(服务)级别的健康检查。
11.2 Helm架构
Helm 有两个重要的概念:chart 和 release。
- chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。
- release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。
Helm 是包管理工具,这里的包就是指的 chart。Helm 能够:
- 从零创建新 chart。
- 与存储 chart 的仓库交互,拉取、保存和更新 chart。
- 在 Kubernetes 集群中安装和卸载 release。
- 更新、回滚和测试 release。
Helm 包含两个组件:Helm 客户端 和 Tiller 服务器。
简单的讲:Helm 客户端负责管理 chart;Tiller 服务器负责管理 release。
11.3 Helm的部署
11.3.1Helm 客户端
在官网下载指定想要版本的helm并传入服务器:https://github.com/helm/helm/releases
$wget 'https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz' .
$tar zxvf helm-xxxxx-linux-amd64.tar.gz
$cp linux-amd64/helm /usr/local/bin/
$cp linux-amd64/tiller /usr/local/bin/
#
$helm version #查看helm client版本
$helm help
目前只能查看到客户端的版本,服务器还没有安装。
设置serviceaccount
$vim heml-rbac-config.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
#
$kubectl create -f heml-rbac-config.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
11.3.2 Tiller 服务器
安装文档: https://helm.sh/docs/using_helm/#installing-helm
Tiller 服务器安装只需要执行 helm init:
#$export HELM_HOME=/data1/helm #Set HELM HOME
$helm init
Creating /root/.helm
...
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Tiller 本身也是作为容器化应用运行在 Kubernetes Cluster 中的:
$kubectl get pods -n kube-system |egrep "name|tiller" -i
NAME READY STATUS RESTARTS AGE
tiller-deploy-75f6c87b87-xq4x7 0/1 ImagePullBackOff 0 2m4s
发现安装失败了,查看日志,发现是拉镜像失败。需要科学上网
$kubectl describe pod tiller-deploy-75f6c87b87-xq4x7 --namespace=kube-system
Warning Failed 37s (x4 over 2m56s) kubelet, k8s-node-122132073 Error: ErrImagePull
Warning Failed 26s (x6 over 2m56s) kubelet, k8s-node-122132073 Error: ImagePullBackOff
Normal BackOff 15s (x7 over 2m56s) kubelet, k8s-node-122132073 Back-off pulling image "gcr.io/kubernetes-helm/tiller:v2.14.3"
$kubectl logs tiller-deploy-75f6c87b87-xq4x7 --namespace=kube-system
科学上网
原来无法pull镜像,删除后,重新安装。
#删除
$helm reset -f #删除
$kubectl delete deployment tiller-deploy -n kube-system
$kubectl delete svc tiller-deploy -n kube-system
$kubectl get pods -n kube-system |grep tiller -i
$kubectl delete pod tiller_xxx -n kube-system
#
rm -rf /root/.helm
方法1)使用如下源init
$helm init --upgrade --service-account tiller --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
Creating /root/.helm
Creating /root/.helm/repository
Creating /root/.helm/repository/cache
Creating /root/.helm/repository/local
Creating /root/.helm/plugins
Creating /root/.helm/starters
Creating /root/.helm/cache/archive
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.
检查tiller是否安装成功
$kubectl get -n kube-system svc tiller-deploy
$kubectl get -n kube-system deployment tiller-deploy
$kubectl get pods -n kube-system
方法2)使用docker hub源
若是无可靠的源,也可以如下使用docker hub源。 细节见helm安装tiller踩坑
a)查找源
$docker search tiller
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
sapcc/tiller Mirror of https://gcr.io/kubernetes-helm/til… 8
b)确认tag
登录 https://hub.docker.com/r/sapcc/tiller/tags
c)重新init
# google源
helm init --service-account tiller --upgrade -i gcr.io/kubernetes-helm/tiller:v2.14.3
#国内源
$docker pull sapcc/tiller:v2.14.3
$docker tag sapcc/tiller:v2.14.3 gcr.io/kubernetes-helm/tiller:v2.14.3
#$export HELM_HOME=/data1/helm #Set HELM HOME
$helm init --service-account tiller --skip-refresh --stable-repo-url
#参数--stable-repo-url用于拉取charts所在源的位置,如果不设置则默认访问官方charts
发现还是有问题!,编辑下配置文件,kubectl edit deployment tiller-deploy -n kube-system
#修改配置为imagePullPolicy:Never
$kubectl edit deployment tiller-deploy -n kube-system
imagePullPolicy: Never
11.4 Helm的使用
https://docs.helm.sh/using_helm/#securing-your-helm-installation
常用命令
helm help #帮助
#添加其他charts可使用
helm repo add <name> <url>
helm list --all #列出所有部署应用
helm repo list #列出repo
helm delete --purge <name> #删除某个应用
helm reset #重置helm
helm search #查看当前安装chart
查看仓库:
Helm 可以像 apt 和 yum 管理软件包一样管理 chart。apt 和 yum 的软件包存放在仓库中,类似Helm 也有仓库。
Helm 安装时已经默认配置好了两个仓库:stable 和 local。stable 是官方仓库,local 是用户存放自己开发的 chart 的本地仓库。
仓库的管理和维护方法请参考官网文档 https://docs.helm.sh
$helm repo list
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local http://127.0.0.1:8879/charts
helm search # 查看当前可以安装的chart
helm search mysql
NAME CHART VERSION APP VERSION DESCRIPTION
stable/mysql 0.3.5 Fast, reliable, scalable, and easy to use open-source rel...
stable/percona 0.3.0 free, fully compatible, enhanced, open source drop-in rep...
安装 chart 也很简单,执行如下命令可以安装 MySQL。
$helm install stable/mysql
NAME: nasal-angelfish
RESOURCES: # 当前release包含的资源,POD, secret,configmap, persistentVolumeClaim
To get your root password run:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default nasal-angelfish-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
To connect to your database:
...
输出分为三部分:
① chart 本次部署的描述信息:
NAME 是 release 的名字,因为我们没用 -n 参数指定,Helm 随机生成了一个,这里是 piquant-parrot。
NAMESPACE 是 release 部署的 namespace,默认是 default,也可以通过 --namespace 指定。
STATUS 为 DEPLOYED,表示已经将 chart 部署到集群。
② 当前 release 包含的资源:Service、Deployment、Secret 和 PersistentVolumeClaim,其名字都是 fun-zorse-mysql,命名的格式为 ReleasName-ChartName。
③ NOTES 部分显示的是 release 的使用方法。比如如何访问 Service,如何获取数据库密码,以及如何连接数据库等。
通过 kubectl get 可以查看组成 release 的各个对象
$kubectl get svc |egrep 'NAME|mysql' -i
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nasal-angelfish-mysql ClusterIP 10.10.142.198 <none> 3306/TCP 16m
$kubectl get pvc | egrep 'NAME|mysql' -i
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nasal-angelfish-mysql Pending
helm list显示已经部署的release,helm delete可以删除release
$helm list
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
nasal-angelfish 1 Thu Oct 10 17:31:04 2019 DEPLOYED mysql-0.3.5 default
$helm delete nasal-angelfish
11.5 chart详解
11.5.1 chart 目录结构
以前面 MySQL chart 为例。一旦安装了某个 chart,我们就可以在 ~/.helm/cache/archive 中找到 chart 的 tar 包。
$ls /root/.helm/cache/archive/
mysql-0.3.5.tgz
$tar -zxvf mysql-0.3.5.tgz --warning=no-timestamp
$tree mysql
mysql
├── Chart.yaml
├── README.md
├── templates
│ ├── configmap.yaml
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── NOTES.txt
│ ├── pvc.yaml
│ ├── secrets.yaml
│ └── svc.yaml
└── values.yaml
Chart.yaml
YAML 文件,描述 chart 的概要信息. name 和 version 是必填项,其他都是可选。
$cat mysql/Chart.yaml
description: Fast, reliable, scalable, and easy to use open-source relational database
system.
engine: gotpl
home: https://www.mysql.com/
icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
keywords:
- mysql
- database
- sql
maintainers:
- email: viglesias@google.com
name: Vic Iglesias
name: mysql
sources:
- https://github.com/kubernetes/charts
- https://github.com/docker-library/mysql
version: 0.3.5
templates 目录
各类 Kubernetes 资源的配置模板都放置在这里。Helm 会将 values.yaml 中的参数值注入到模板中生成标准的 YAML 配置文件。
README.md 简易使用文档。
11.5.2 chart模板
Helm 通过模板创建 Kubernetes 能够理解的 YAML 格式的资源配置文件,我们将通过例子来学习如何使用模板。
以 templates/secrets.yaml 为例:
$vim templates/secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: {{ template "mysql.fullname" . }}
labels:
app: {{ template "mysql.fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
heritage: "{{ .Release.Service }}"
type: Opaque
data:
{{ if .Values.mysqlRootPassword }}
mysql-root-password: {{ .Values.mysqlRootPassword | b64enc | quote }}
{{ else }}
mysql-root-password: {{ randAlphaNum 10 | b64enc | quote }}
{{ end }}
{{ if .Values.mysqlPassword }}
mysql-password: {{ .Values.mysqlPassword | b64enc | quote }}
{{ else }}
mysql-password: {{ randAlphaNum 10 | b64enc | quote }}
{{ end }}
大部分属性变成了 {{XXX}}。 这些实际上是模板语法。 Helm采用GO语言的模板编写chart。Go模板非常强大,支持变量、对象、函数、流控制等功能。
- {{ template "mysql.fullname" . }} 定义 Secret 的 name。
关键字 template 的作用是引用一个子模板 mysql.fullname。这个子模板是在 templates/_helpers.tpl 文件中定义的。
vim templates/_helpers.tpl
{{- define "mysql.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
学习的重点是:如果存在一些信息多个模板都会用到,则可在 templates/_helpers.tpl 中将其定义为子模板,然后通过 templates 函数引用。
这里 mysql.fullname 是由 release 与 chart 二者名字拼接组成。
根据 chart 的最佳实践,所有资源的名称都应该保持一致,对于我们这个 chart,无论 Secret 还是Deployment、PersistentVolumeClaim、Service,它们的名字都是子模板 mysql.fullname 的值。
- Chart 和 Release 是 Helm 预定义的对象,每个对象都有自己的属性,可以在模板中使用。
$helm install stable/mysql -n my
哪么templates/secrets.yaml中:
cat templates/secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: {{ template "mysql.fullname" . }}
labels:
app: {{ template "mysql.fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
heritage: "{{ .Release.Service }}"
type: Opaque
data:
{{ if .Values.mysqlRootPassword }}
mysql-root-password: {{ .Values.mysqlRootPassword | b64enc | quote }}
{{ else }}
mysql-root-password: {{ randAlphaNum 10 | b64enc | quote }}
{{ end }}
{{ if .Values.mysqlPassword }}
mysql-password: {{ .Values.mysqlPassword | b64enc | quote }}
{{ else }}
mysql-password: {{ randAlphaNum 10 | b64enc | quote }}
{{ end }}
{{ .Chart.Name }} 的值为 mysql。
{{ .Chart.Version }} 的值为 0.3.5。
{{ .Release.Name }} 的值为 my。
{{ .Release.Service }} 始终取值为 Tiller。
{{ template "mysql.fullname" . }} 计算结果为 my-mysql。
- 这里指定 mysql-root-password 的值,不过使用了 if-else 的流控制,其逻辑为:
如果 .Values.mysqlRootPassword 有值,则对其进行 base64 编码;否则随机生成一个 10 位的字符串并编码。
Values 也是预定义的对象,代表的是 values.yaml 文件。而 .Values.mysqlRootPassword 则是 values.yaml 中定义的 mysqlRootPassword 参数:
cat values.yaml
## mysql image version
## ref: https://hub.docker.com/r/library/mysql/tags/
##
image: "mysql"
imageTag: "5.7.14"
## Specify password for root user
##
## Default: random 10 character string
# mysqlRootPassword: testing
## Create a database user
##
# mysqlUser:
# mysqlPassword:
这里指定 mysql-root-password 的值,不过使用了 if-else 的流控制,其逻辑为:
如果 .Values.mysqlRootPassword 有值,则对其进行 base64 编码;否则随机生成一个 10 位的字符串并编码。
Values 也是预定义的对象,代表的是 values.yaml 文件。而 .Values.mysqlRootPassword 则是 values.yaml 中定义的 mysqlRootPassword 参数:
因为 mysqlRootPassword 被注释掉了,没有赋值,所以逻辑判断会走 else,即随机生成密码。
randAlphaNum、b64enc、quote 都是 Go 模板语言支持的函数,函数之间可以通过管道 | 连接。{{ randAlphaNum 10 | b64enc | quote }} 的作用是首先随机产生一个长度为 10 的字符串,然后将其 base64 编码,最后两边加上双引号。
templates/secrets.yaml 这个例子展示了 chart 模板主要的功能,更多可参考官网文档 https://docs.helm.sh
11.5.3 MySQL chart实践
1. chart 安装前的准备
安装之前需要先清楚 chart 的使用方法。这些信息通常记录在 values.yaml 和 README.md 中。除了下载源文件查看,执行 helm inspect values 可能是更方便的方法。
$helm inspect values stable/mysql
输出的实际上是 values.yaml 的内容。阅读注释就可以知道 MySQL chart 支持哪些参数,安装之前需要做哪些准备。
cat values.yaml
## mysql image version
## ref: https://hub.docker.com/r/library/mysql/tags/
##
image: "mysql"
imageTag: "5.7.14"
## Persist data to a persistent volume
persistence:
enabled: true
# storageClass: "-"
accessMode: ReadWriteOnce
size: 8Gi
# storageClass: nfs
# existingClaim: mysql-pvc
chart 定义了一个 PersistentVolumeClaim,申请 8G 的 PersistentVolume。
说明:
若是没有指定existingClaim,由于我们的实验环境不支持动态供给,
所以得预先创建好相应的 PV,其配置文件 mysql-pv.yml 内容为:
mysql-pvc.yaml
#mysql-pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
namespace: default
spec:
capacity:
storage: 8Gi
accessModes:
- ReadWriteOnce
storageClassName: nfs
persistentVolumeReclaimPolicy: Retain
nfs:
path: "/data1/nfsdata/mysql-pv"
server: 10.xx.xx.71 #nfs_ip
---
#mysql-pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: "nfs"
resources:
requests:
storage: 8Gi
创建PV mysql-pv
$kubectl apply -f mysql-pvc.yaml
#检查
$kubectl get pvc |egrep "name|mysql-pvc" -i
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pvc Bound mysql-pv 8Gi RWO nfs 71m
$helm list --all #列出所有部署应用
$helm inspect stable/mysql |grep storageClass -i
| `persistence.storageClass` | Type of persistent volume claim | nil (uses alpha storage class annotation) |
helm安装不会指定storageclassname,这个pvc就会看当前的namespace有没有default的storageclass,所以配置文件中storageClass不需要指定。
2.定制化安装 chart
除了接受 values.yaml 的默认值,我们还可以定制化 chart,比如设置 mysqlRootPassword。
配置说明: https://github.com/helm/charts/tree/master/stable/mysql#configuration
Helm 有两种方式传递配置参数:
- 方法1) 指定自己的 values 文件。
通常的做法是首先通过 helm inspect values mysql > myvalues.yaml生成 values 文件,然后设置 mysqlRootPassword,之后执行 helm install --values=myvalues.yaml mysql。 - 方法2) 通过 --set 直接传入参数值。例如helm install stable/mysql --set mysqlRootPassword=axxx -n my
方法1:
helm install --name my -f my-values.yaml stable/mysql ;
#一旦安装了某个 chart,我们就可以在 ~/.helm/cache/archive 中找到 chart 的 tar 包。
$tar -zxvf mysql-0.3.5.tgz --warning=no-timestamp
$cp mysql/values.yaml my-values.yaml
#或当前有helm mysql
$helm inspect values mysql > myvalues.yaml
$vim my-values.yaml
persistence:
enabled: true
accessMode: ReadWriteOnce
size: 8Gi
storageClass: nfs #
existingClaim: mysql-pvc #使用当前可以使用的pvc
#布署release
$helm install --name my -f my-values.yaml stable/mysql ;
记得增加existingClaim:配置,如下。方法2:
#Demo1:
$helm install stable/mysql --name my \
--set mysqlRootPassword=root123,mysqlUser=my-user,mysqlPassword=my-passord,persistence.storageClass=nfs,persistence.existingClaim=mysql-pvc
#Demo2:
$helm install stable/mysql --name my \
--set mysqlRootPassword=root123,mysqlUser=myuser,mysqlPassword=password,mysqlDatabase=mydb,livenessProbe.initialDelaySeconds=300,persistence.size=2Gi,persistence.storageClass=nfs,persistence.accessMode=ReadWriteOnce
状态查看
通过helm list 和 helm status XXX 可以查看chart的最新状态。helm delete --purge xx删除。
$helm list --all
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my 1 Fri Oct 11 15:30:25 2019 DEPLOYED mysql-0.3.5 default
$helm status my
$helm delete --purge my
#
$kubectl describe pvc mysql-pvc
访问MySQL
$MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
$echo $MYSQL_ROOT_PASSWORD
#
$kubectl get pods --namespace default -l "app=my-mysql" -o jsonpath="{.items[0].metadata.name}"
$mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
11.5.4 升级和回滚release
release 发布后可以执行 helm upgrade 对其升级,通过 --values 或 --set应用新的配置。比如将当前的 MySQL 版本升级到 5.7.15:
$helm upgrade --set imageTag=5.7.15 my stable/mysql
查看release历史版本
$helm history my
REVISION UPDATED STATUS CHART DESCRIPTION
1 Fri Oct 11 15:30:25 2019 SUPERSEDED mysql-0.3.5 Install complete
2 Fri Oct 11 17:00:53 2019 DEPLOYED mysql-0.3.5 Upgrade complete
回滚
$helm rollback my 1
Rollback was a success.
$helm history my
#确认版本是否rollback
$kubectl get deployment my-mysql -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
my-mysql 1/1 1 1 95m my-mysql mysql:5.7.14 app=my-mysql
11.5.5 开发自已的chart
$helm create -h
$helm create mychart
$tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
参考:
- 【目录】每天5分钟,玩转kubernetes
- https://blog.csdn.net/CloudMan6/article/details/80088432
- https://github.com/helm/helm
- 国内charts镜像
- https://github.com/kubernetes/charts
- https://helm.sh/docs/using_helm/#quickstart-guide
- k8s-helm2.14安装
- Deploy MySQL using Helm in Kubernetes with Persistent Volume
- https://cloud.tencent.com/developer/article/1456384