Helm 爲Kubernetes的軟件包管理工具,Helm有兩部分組成:Helm客戶端、Tiller服務端,Helm三個主要部件:Chart、倉庫、Release;node
Chart:爲Kubernetes中應用程序所須要的資源的定義。
倉庫:爲存儲Helm chart的倉庫,可從倉庫中下載chart直接使用
Release: Kubernetes中運行的chart實例,每一個chart可屢次安裝,每次安裝都是一個新版本;nginx
Helm 常見指令:mongodb
helm search 在倉庫中查找chart
api
helm inspect stable/mongodb 可查看該chart的介紹信息;
helm install stable/mongodb 可直接下載該chart並安裝該chart;app
版本升級:
helm upgrade releaseName .
工具
helm rollback releaseName 1 回滾到版本1code
從零開始經過helm發佈Kubernetes項目:對象
初始化項目:blog
helm create nginx
執行完後建立名爲nginx的chart,如今查看nginx目錄中的文件:ip
charts:目錄用於存放所依賴的子chart
chart.yaml:爲當前chart的說明文件,也可在模板中訪問該文件;
templates:目錄爲nginx項目的模板目錄,一般會使用values.yaml配置內容進行填充,板引擎渲染此目錄的文件後Tiller將渲染獲得的結果 提交給Kubernetes建立響應的對象;
values.yaml:爲值文件,定義模板中須要使用的值,在templates的模板文件中將訪問改值;
在templates目錄中有能夠看到deployment.yaml、ingress.yaml、service.yaml文件這些爲定義Kubernetes deployment、ingress、service對象的模板文件;
NOTES.txt:爲安裝chart成功後的說明文件
**_helpers.tpl:**模板助手文件,定義的值可在模板中使用;
一、helm 初步使用
如今刪除template目錄中的全部文件、清空values.yaml文件中全部內容
部署nginx須要一個deployment控制器與對外提供服務的service,如今咱們分別手動建立這個兩個文件並編寫相關內容;
deployment.yaml :
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
service.yaml
apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx type: NodePort ports: - port: 80 nodePort: 30078
此時咱們在上級目錄執行:helm install nginx 已經能夠將nginx部署到Kubernetes中;
但若是隻是這樣使用Helm,那它存在的意義也不大,既然說template目錄是模板目錄固然它裏面的模板文件也不能只是這麼使用,要讓模板文件體現出它的模型性質;下面咱們將使用Helm的模板等功能,讓模板文件體現出他的模板性質;
二、helm 模板
目前爲止deployment.yaml與service.yaml雖然是放在模板目錄下可是徹底沒有體現出他的模板性質,如今咱們開始這兩個文件的模板化;
模板語法基礎:
內置對象:helm中有這麼這個經常使用內置對象:Release、Values、Chart、Files、Capabilities、Template;
Release:此對象描述當前release,內置有:Release.Name release名稱、Release.Time 發佈時間等等等對面;
Values:此對象爲從values.yaml文件與用戶提供的文件中傳遞到模板的對值對象;
Chart:此對象爲chart.yaml文件所提供的數據對象;
Files:提供了對chart非特殊文件的訪問;
Capabilities:這提供了Kubernetes集羣信息的訪問;
Template:正在執行的當前模板信息
下面咱們經過helm內置對象Values來實現deployment.yaml、service.yaml文件的模板化,Values對象的取值範圍:
一、當前chart的values.yaml文件;
二、如當前爲子chart,則來自父chart的values.yaml文件;
三、在helm install或helm update執行是經過-f參數傳遞的文件;
四、經過helm install 時經過 –set設置的值;
如values.yaml文件中存在replicaCount: 1對象,則在模板文件中經過{{ .Values.replicaCount }}便可訪問到values.yaml文件定義的對象值1;
經過**_helpers.tpl**可定義命名模板,下面定義模板deploy.name
{{- define "deploy.name" -}} demo-deploy-nginx {{- end }}
其中:{{ - 表示刪除左側的空格 - }} 刪除右側的空格
此時可在模板文件中經過{{ template "deploy.name" . }} 引用該命名模板;
實現模板化:
提取須要模板化的數據,這裏提取出deployment對象的name、labels、replicas、matchLabels、template的labels、template spec的name、image;service對象的name、selector labels、type、port、nodePort等配置;
咱們再從提取出來的配置中挑選出name類與labels類配置定義爲命名模板存放在_helpers.tpl文件中,其餘的配置項定義在Values.yaml文件中;
**_helpers.tpl**文件內容以下:存放了deploy名稱、service名稱、deploy的lables、deploy中pod的lables;
{{- define "deploy.name" -}} demo-deploy-nginx {{- end }} {{- define "service.name" -}} demo-service-nginx {{- end }} {{- define "labels" -}} demo: nginx {{- end}} {{- define "deploy.labels" -}} deploy: nginx {{- end}}
values.yaml 文件,此文件定義了副本數、鏡像名稱與版本、service類型、端口等:
# 定義模板默認值 replicaCount: 1 image: repository: nginx tag: 1.7.9 service: type: NodePort port: 80 nodePort: 30078
值文件定義好了此時須要在模板deployment、service文件中引用上述兩個文件所定義的值,下面開始重構deployment.yaml與service.yaml文件:
service.yaml文件:
apiVersion: v1 kind: Service metadata: name: {{ template "service.name" . }} spec: selector: {{ template "labels" . }} type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} nodePort: {{ .Values.service.nodePort }}
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: {{ template "deploy.name" . }} labels: {{ template "deploy.labels" .}} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: {{ template "labels" . }} template: metadata: labels: {{ template "labels" . }} spec: containers: - name: {{ .Chart.Name}} image: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: 80
模板文件編寫好後能夠再從新使用Helm install部署nginx試試,執行前先執行helm delete running-chipmunk卸載掉以前安裝的;
參考資料: https://docs.helm.sh/