第十一章 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