【學(xué)習(xí)筆記11】每天5分鐘芽隆,玩轉(zhuǎn)kubernetes-11(Helm包管理器)

第十一章 Helm-Kubernetes包管理器

每個(gè)成功的軟件平臺(tái)都有一個(gè)優(yōu)秀的打包系統(tǒng)胚吁,比如 Debian腕扶、Ubuntu 的 apt半抱,Redhat窿侈、Centos 的 yum史简。而 Helm 則是 Kubernetes 上的包管理器圆兵。
本章我們將討論為什么需要 Helm殉农,它的架構(gòu)和組件统抬,以及如何使用 Helm。

11.1 Why Helm

Helm 到底解決了什么問(wèn)題金麸?為什么 Kubernetes 需要 Helm挥下?
答案是:Kubernetes 能夠很好地組織和編排容器棚瘟,但它缺少一個(gè)更高層次的應(yīng)用打包工具偎蘸,而 Helm 就是來(lái)干這件事的。
先來(lái)看個(gè)例子章咧。
比如對(duì)于一個(gè) MySQL 服務(wù)赁严, Kubernetes 需要部署下面這些對(duì)象:

1.Service误澳,讓外界能夠訪問(wèn)到 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 申請(qǐng)持久化存儲(chǔ)空間采桃。

4.Deployment普办,部署 MySQL Pod,并使用上面的這些支持對(duì)象舆驶。

我們可以將上面這些配置保存到對(duì)象各自的文件中沙廉,或者集中寫(xiě)進(jìn)一個(gè)配置文件蓝仲,然后通過(guò) kubectl apply -f 部署。如果服務(wù)少垢夹,這樣問(wèn)題也不大果元,但是如果是微服務(wù)架構(gòu)而晒,服務(wù)多達(dá)數(shù)十個(gè)甚至上百個(gè)迅耘,這種組織和管理應(yīng)用的方式就不好使了:
(1)很難管理颤专、編輯和維護(hù)如此多的服務(wù)栖秕。每個(gè)服務(wù)有若干個(gè)配置,缺乏更高層次的工具將這些配置組織起來(lái)垦写。
(2)不容易將這些服務(wù)作為一個(gè)整體統(tǒng)一發(fā)布。
(3)不能高效的共享和重用服務(wù)况毅。比如兩個(gè)應(yīng)用都用到MySQL服務(wù)尔许,但是配置參數(shù)不一樣,這兩個(gè)應(yīng)用只能分別復(fù)制一套標(biāo)準(zhǔn)MySQL配置文件余佛,修改后通過(guò)kubectl apply部署。也就是不支持參數(shù)化配置和多環(huán)境部署郊楣。
(4)不支持應(yīng)用級(jí)別的版本管理净蚤。雖然可以通過(guò)kubectl rollout undo進(jìn)行回滾,但這只針對(duì)單個(gè)deployment今瀑,不支持整個(gè)應(yīng)用的的回滾程梦。
(5)不支持對(duì)部署的應(yīng)用狀態(tài)進(jìn)行驗(yàn)證。比如是否能通過(guò)預(yù)定義賬號(hào)訪問(wèn)MySQL放椰。雖然K8s有健康檢查作烟,但那時(shí)針對(duì)單個(gè)容器,我們需要應(yīng)用(服務(wù))級(jí)別的健康檢查砾医。

11.2 Helm架構(gòu)

Helm 有兩個(gè)重要的概念:chart 和 release。

  • chart 是創(chuàng)建一個(gè)應(yīng)用的信息集合如蚜,包括各種 Kubernetes 對(duì)象的配置模板压恒、參數(shù)定義、依賴關(guān)系错邦、文檔說(shuō)明等探赫。chart 是應(yīng)用部署的自包含邏輯單元∏四兀可以將 chart 想象成 apt伦吠、yum 中的軟件安裝包。
  • release 是 chart 的運(yùn)行實(shí)例魂拦,代表了一個(gè)正在運(yùn)行的應(yīng)用毛仪。當(dāng) chart 被安裝到 Kubernetes 集群,就生成一個(gè) release芯勘。chart 能夠多次安裝到同一個(gè)集群箱靴,每次安裝都是一個(gè) release。

Helm 是包管理工具荷愕,這里的包就是指的 chart衡怀。Helm 能夠:

  • 從零創(chuàng)建新 chart。
  • 與存儲(chǔ) chart 的倉(cāng)庫(kù)交互安疗,拉取抛杨、保存和更新 chart。
  • 在 Kubernetes 集群中安裝和卸載 release荐类。
  • 更新蝶桶、回滾和測(cè)試 release。

Helm 包含兩個(gè)組件:Helm 客戶端 和 Tiller 服務(wù)器掉冶。


image.png

簡(jiǎn)單的講:Helm 客戶端負(fù)責(zé)管理 chart真竖;Tiller 服務(wù)器負(fù)責(zé)管理 release脐雪。

11.3 Helm的部署

11.3.1Helm 客戶端

在官網(wǎng)下載指定想要版本的helm并傳入服務(wù)器: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

目前只能查看到客戶端的版本,服務(wù)器還沒(méi)有安裝恢共。

設(shè)置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 服務(wù)器

安裝文檔: https://helm.sh/docs/using_helm/#installing-helm

Tiller 服務(wù)器安裝只需要執(zhí)行 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 本身也是作為容器化應(yīng)用運(yùn)行在 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

發(fā)現(xiàn)安裝失敗了战秋,查看日志,發(fā)現(xiàn)是拉鏡像失敗。需要科學(xué)上網(wǎng)

$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   

科學(xué)上網(wǎng)

原來(lái)無(wú)法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
\color{red}{2019.10實(shí)測(cè)可用,建議用此方法透硝。}

$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源
若是無(wú)可靠的源狰闪,也可以如下使用docker hub源。 細(xì)節(jié)見(jiàn)helm安裝tiller踩坑

a)查找源

$docker search tiller                
NAME                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
sapcc/tiller                            Mirror of https://gcr.io/kubernetes-helm/til…   8                                       

b)確認(rèn)tag
登錄 https://hub.docker.com/r/sapcc/tiller/tags

image.png

c)重新init

# google源
helm init --service-account tiller --upgrade -i gcr.io/kubernetes-helm/tiller:v2.14.3

#國(guó)內(nèi)源
$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 

#參數(shù)--stable-repo-url用于拉取charts所在源的位置濒生,如果不設(shè)置則默認(rèn)訪問(wèn)官方charts

發(fā)現(xiàn)還是有問(wèn)題!埋泵,編輯下配置文件,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 #列出所有部署應(yīng)用
helm repo list  #列出repo
helm delete --purge <name>  #刪除某個(gè)應(yīng)用
helm reset  #重置helm
helm search #查看當(dāng)前安裝chart

查看倉(cāng)庫(kù):
Helm 可以像 apt 和 yum 管理軟件包一樣管理 chart。apt 和 yum 的軟件包存放在倉(cāng)庫(kù)中罪治,類似Helm 也有倉(cāng)庫(kù)丽声。
Helm 安裝時(shí)已經(jīng)默認(rèn)配置好了兩個(gè)倉(cāng)庫(kù):stable 和 local。stable 是官方倉(cāng)庫(kù)觉义,local 是用戶存放自己開(kāi)發(fā)的 chart 的本地倉(cāng)庫(kù)雁社。
倉(cāng)庫(kù)的管理和維護(hù)方法請(qǐng)參考官網(wǎng)文檔 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 # 查看當(dāng)前可以安裝的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 也很簡(jiǎn)單,執(zhí)行如下命令可以安裝 MySQL晒骇。

$helm install stable/mysql
NAME:   nasal-angelfish
RESOURCES:                                         # 當(dāng)前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 的名字徒坡,因?yàn)槲覀儧](méi)用 -n 參數(shù)指定,Helm 隨機(jī)生成了一個(gè)箍鼓,這里是 piquant-parrot。
NAMESPACE 是 release 部署的 namespace呵曹,默認(rèn)是 default款咖,也可以通過(guò) --namespace 指定。
STATUS 為 DEPLOYED奄喂,表示已經(jīng)將 chart 部署到集群铐殃。
② 當(dāng)前 release 包含的資源:Service、Deployment跨新、Secret 和 PersistentVolumeClaim富腊,其名字都是 fun-zorse-mysql,命名的格式為 ReleasName-ChartName域帐。
③ NOTES 部分顯示的是 release 的使用方法赘被。比如如何訪問(wèn) Service是整,如何獲取數(shù)據(jù)庫(kù)密碼,以及如何連接數(shù)據(jù)庫(kù)等仲翎。

通過(guò) kubectl get 可以查看組成 release 的各個(gè)對(duì)象

$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顯示已經(jīng)部署的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 目錄結(jié)構(gòu)

以前面 MySQL chart 為例算色。一旦安裝了某個(gè) 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 是必填項(xiàng)野舶,其他都是可選易迹。

$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 會(huì)將 values.yaml 中的參數(shù)值注入到模板中生成標(biāo)準(zhǔn)的 YAML 配置文件平道。
README.md 簡(jiǎn)易使用文檔睹欲。

11.5.2 chart模板

Helm 通過(guò)模板創(chuàng)建 Kubernetes 能夠理解的 YAML 格式的資源配置文件,我們將通過(guò)例子來(lái)學(xué)習(xí)如何使用模板巢掺。
以 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}}句伶。 這些實(shí)際上是模板語(yǔ)法。 Helm采用GO語(yǔ)言的模板編寫(xiě)chart陆淀。Go模板非常強(qiáng)大考余,支持變量、對(duì)象轧苫、函數(shù)楚堤、流控制等功能。

  1. {{ template "mysql.fullname" . }} 定義 Secret 的 name含懊。
    關(guān)鍵字 template 的作用是引用一個(gè)子模板 mysql.fullname身冬。這個(gè)子模板是在 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 -}}

學(xué)習(xí)的重點(diǎn)是:如果存在一些信息多個(gè)模板都會(huì)用到岔乔,則可在 templates/_helpers.tpl 中將其定義為子模板酥筝,然后通過(guò) templates 函數(shù)引用。
這里 mysql.fullname 是由 release 與 chart 二者名字拼接組成雏门。
根據(jù) chart 的最佳實(shí)踐嘿歌,所有資源的名稱都應(yīng)該保持一致,對(duì)于我們這個(gè) chart茁影,無(wú)論 Secret 還是Deployment宙帝、PersistentVolumeClaim、Service募闲,它們的名字都是子模板 mysql.fullname 的值步脓。

  1. Chart 和 Release 是 Helm 預(yù)定義的對(duì)象,每個(gè)對(duì)象都有自己的屬性,可以在模板中使用靴患。
$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" . }} 計(jì)算結(jié)果為 my-mysql。

  1. 這里指定 mysql-root-password 的值相嵌,不過(guò)使用了 if-else 的流控制腿时,其邏輯為:
    如果 .Values.mysqlRootPassword 有值,則對(duì)其進(jìn)行 base64 編碼饭宾;否則隨機(jī)生成一個(gè) 10 位的字符串并編碼批糟。
    Values 也是預(yù)定義的對(duì)象,代表的是 values.yaml 文件看铆。而 .Values.mysqlRootPassword 則是 values.yaml 中定義的 mysqlRootPassword 參數(shù):
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 的值徽鼎,不過(guò)使用了 if-else 的流控制,其邏輯為:
如果 .Values.mysqlRootPassword 有值弹惦,則對(duì)其進(jìn)行 base64 編碼否淤;否則隨機(jī)生成一個(gè) 10 位的字符串并編碼。
Values 也是預(yù)定義的對(duì)象棠隐,代表的是 values.yaml 文件石抡。而 .Values.mysqlRootPassword 則是 values.yaml 中定義的 mysqlRootPassword 參數(shù):
因?yàn)?mysqlRootPassword 被注釋掉了,沒(méi)有賦值助泽,所以邏輯判斷會(huì)走 else啰扛,即隨機(jī)生成密碼。
randAlphaNum嗡贺、b64enc隐解、quote 都是 Go 模板語(yǔ)言支持的函數(shù),函數(shù)之間可以通過(guò)管道 | 連接诫睬。{{ randAlphaNum 10 | b64enc | quote }} 的作用是首先隨機(jī)產(chǎn)生一個(gè)長(zhǎng)度為 10 的字符串煞茫,然后將其 base64 編碼,最后兩邊加上雙引號(hào)摄凡。
templates/secrets.yaml 這個(gè)例子展示了 chart 模板主要的功能续徽,更多可參考官網(wǎng)文檔 https://docs.helm.sh

11.5.3 MySQL chart實(shí)踐

1. chart 安裝前的準(zhǔn)備

安裝之前需要先清楚 chart 的使用方法。這些信息通常記錄在 values.yaml 和 README.md 中架谎。除了下載源文件查看炸宵,執(zhí)行 helm inspect values 可能是更方便的方法辟躏。

$helm inspect values stable/mysql 

輸出的實(shí)際上是 values.yaml 的內(nèi)容谷扣。閱讀注釋就可以知道 MySQL chart 支持哪些參數(shù),安裝之前需要做哪些準(zhǔn)備。

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 定義了一個(gè) PersistentVolumeClaim会涎,申請(qǐng) 8G 的 PersistentVolume裹匙。
說(shuō)明:
若是沒(méi)有指定existingClaim,由于我們的實(shí)驗(yàn)環(huán)境不支持動(dòng)態(tài)供給,\color{red}{ helm install stable/mysql --name my 生成pvc時(shí)會(huì)失敗末秃,pvc狀態(tài)一直為Pending!}
所以得預(yù)先創(chuàng)建好相應(yīng)的 PV概页,其配置文件 mysql-pv.yml 內(nèi)容為:

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

創(chuàng)建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 #列出所有部署應(yīng)用
 $helm inspect  stable/mysql  |grep storageClass -i
| `persistence.storageClass`           | Type of persistent volume claim           | nil  (uses alpha storage class annotation)           |

helm安裝不會(huì)指定storageclassname,這個(gè)pvc就會(huì)看當(dāng)前的namespace有沒(méi)有default的storageclass,所以配置文件中storageClass不需要指定练慕。

2.定制化安裝 chart

除了接受 values.yaml 的默認(rèn)值惰匙,我們還可以定制化 chart,比如設(shè)置 mysqlRootPassword铃将。
配置說(shuō)明: https://github.com/helm/charts/tree/master/stable/mysql#configuration

Helm 有兩種方式傳遞配置參數(shù):

  • 方法1) 指定自己的 values 文件项鬼。
    通常的做法是首先通過(guò) helm inspect values mysql > myvalues.yaml生成 values 文件,然后設(shè)置 mysqlRootPassword劲阎,之后執(zhí)行 helm install --values=myvalues.yaml mysql绘盟。
  • 方法2) 通過(guò) --set 直接傳入?yún)?shù)值。例如helm install stable/mysql --set mysqlRootPassword=axxx -n my

方法1:
helm install --name my -f my-values.yaml stable/mysql ;

#一旦安裝了某個(gè) chart悯仙,我們就可以在 ~/.helm/cache/archive 中找到 chart 的 tar 包龄毡。
$tar -zxvf mysql-0.3.5.tgz --warning=no-timestamp
$cp mysql/values.yaml my-values.yaml
#或當(dāng)前有helm mysql
$helm inspect values mysql > myvalues.yaml
$vim my-values.yaml
persistence:
  enabled: true
  accessMode: ReadWriteOnce
  size: 8Gi
  storageClass: nfs             #
  existingClaim: mysql-pvc  #使用當(dāng)前可以使用的pvc

#布署release
$helm install --name my -f my-values.yaml stable/mysql  ;

記得增加existingClaim:配置,如下锡垄。
image.png

方法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 


狀態(tài)查看
通過(guò)helm list 和 helm status XXX 可以查看chart的最新?tīng)顟B(tài)沦零。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 

訪問(wèn)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 升級(jí)和回滾release

release 發(fā)布后可以執(zhí)行 helm upgrade 對(duì)其升級(jí)偎捎,通過(guò) --values 或 --set應(yīng)用新的配置蠢终。比如將當(dāng)前的 MySQL 版本升級(jí)到 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   
#確認(rèn)版本是否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 開(kāi)發(fā)自已的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

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茴她,一起剝皮案震驚了整個(gè)濱河市寻拂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丈牢,老刑警劉巖祭钉,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異己沛,居然都是意外死亡慌核,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)申尼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)垮卓,“玉大人,你說(shuō)我怎么就攤上這事师幕∷诎矗” “怎么了诬滩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)灭将。 經(jīng)常有香客問(wèn)我疼鸟,道長(zhǎng),這世上最難降的妖魔是什么庙曙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任空镜,我火速辦了婚禮,結(jié)果婚禮上捌朴,老公的妹妹穿的比我還像新娘吴攒。我一直安慰自己,他們只是感情好砂蔽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布舶斧。 她就那樣靜靜地躺著,像睡著了一般察皇。 火紅的嫁衣襯著肌膚如雪茴厉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天什荣,我揣著相機(jī)與錄音矾缓,去河邊找鬼。 笑死稻爬,一個(gè)胖子當(dāng)著我的面吹牛嗜闻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桅锄,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼琉雳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了友瘤?” 一聲冷哼從身側(cè)響起翠肘,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辫秧,沒(méi)想到半個(gè)月后束倍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盟戏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年绪妹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柿究。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邮旷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝇摸,到底是詐尸還是另有隱情婶肩,我是刑警寧澤糕簿,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站狡孔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蜂嗽。R本人自食惡果不足惜苗膝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望植旧。 院中可真熱鬧辱揭,春花似錦、人聲如沸病附。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)完沪。三九已至域庇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間覆积,已是汗流浹背听皿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宽档,地道東北人尉姨。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吗冤,于是被迫代替她去往敵國(guó)和親又厉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容