回到以前的「charts」目錄,咱們依次進行解讀並進行簡單的修改。html
Chart.yamlmysql
配置示例:git
apiVersion: v1 appVersion: "1.1" description: A demo Helm chart for Kubernetes name: k8sapp version: 0.1.1
如上述定義所示,Chart.yaml用於提供Charts相關的元數據定義,好比名稱、版本,屬於必備文件。主要字段以下所示:github
字段sql |
是否必填apache |
說明api |
name架構 |
✔app |
當前Chart名稱ide |
version |
✔ |
版本號 |
apiVersion |
✔ |
chart API 版本,一直爲「v1」 |
description |
Chart描述 |
|
keywords |
關鍵字列表 |
|
home |
項目主頁URL |
|
kubeVersion |
依賴的Kubernetes版本 |
|
sources |
源碼地址列表 |
|
maintainers |
維護者列表,由name、email、url組成 |
|
engine |
模板引擎名稱,默認爲gotpl,即go模板 |
|
icon |
圖標地址 |
|
appVersion |
應用程序版本 |
|
deprecated |
是否已廢棄 |
|
tillerVersion |
依賴的Tiller版本,例如">2.0.0" |
values.yaml和模板
values.yaml配置示例:
# 定義k8sapp的默認配置 fullnameOverride: k8sapp replicaCount: 1 #副本數 image: #鏡像配置 repository: ccr.ccs.tencentyun.com/magicodes/k8sapp tag: latest
pullPolicy: Always #鏡像拉取策略,Always表示老是拉取最新鏡像,IfNotPresent表示若是本地存在則不拉取,Never則表示只使用本地鏡像
service: #Service配置 type: NodePort #NodePort服務類型,以便外部訪問 port: 80 secrets: {} ingress: enabled: false #不配置ingress #資源限制 resources: limits: cpu: 1 memory: 228Mi requests: cpu: 100m memory: 128Mi
如以上示例配置所示,咱們在一個values.yaml配置了Deployment和Service的配置,整個配置簡單幹淨,固然咱們還能配置更多,好比ingress和secrets等等。那麼咱們的配置是怎麼起做用的呢?這裏的配置又是如何轉換爲對應的Deployment、Service等配置的呢?咱們來打開「templates」目錄下的deployment.yaml模板文件:
apiVersion: apps/v1beta2 kind: Deployment metadata: name: {{ template "k8sapp.fullname" . }} labels: app: {{ template "k8sapp.name" . }} chart: {{ template "k8sapp.chart" . }} draft: {{ default "draft-app" .Values.draft }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ template "k8sapp.name" . }} release: {{ .Release.Name }} template: metadata: labels: app: {{ template "k8sapp.name" . }} draft: {{ default "draft-app" .Values.draft }} release: {{ .Release.Name }} annotations: buildID: {{ .Values.buildID }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: http containerPort: 80 protocol: TCP env: {{- $root := . }} {{- range $ref, $values := .Values.secrets }} {{- range $key, $value := $values }} - name: {{ $ref }}_{{ $key }} valueFrom: secretKeyRef: name: {{ template "k8sapp.fullname" $root }}-{{ $ref | lower }} key: {{ $key }} {{- end }} {{- end }} resources: {{ toYaml .Values.resources | indent 12 }} {{- with .Values.imagePullSecrets }} imagePullSecrets: {{ toYaml . | indent 8 }} {{- end }}
如上所示,這是一個使用Go模板的Deployment模板文件,它經過讀取「Chart.yaml」和「values.yaml」中的配置進行轉換。一樣的,service.yaml、ingress.yaml也是如此,同時咱們也能夠基於其語法編寫更多的模板。這些模板在執行「helm install」命令時進行轉換。
值得注意的是,「.Values」對象能夠訪問values.yaml中的任何配置,若是使用自定義的值則會覆蓋此值。「. Release」對象則爲預約義的值,可用於任意模板,而且沒法被覆蓋。其中,經常使用的預約義值以下所示:
名稱 |
說明 |
Release.Name |
發佈的資源實例名稱 |
Release.Time |
Chart最後發佈時間 |
Release.Namespace |
命名空間 |
Release.Service |
發佈服務名稱,一般是「Tiller」 |
Release.IsUpgrade |
當前操做是否升級 |
Release.IsInstall |
當前操做是否爲安裝 |
Release.Revision |
修訂號,從1開始遞增 |
Chart |
對應「Chart.yaml」 |
Files |
能夠訪問全部的非模板文件和非特殊文件 |
requirements.yaml
requirements.yaml用於管理依賴關係。例如:
dependencies: - name: apache version: 1.2.3 repository: http://example.com/charts - name: mysql version: 3.2.1 repository: http://another.example.com/charts
如上所示,經常使用的字段以下所示:
name表示Chart名稱;
version表示Chart版本;
repository表示Chart存儲庫地址,注意,咱們還必須使用「helm repo add」命令在本地添加該存儲庫地址;
alias表示別名;
tags用於指定僅裝載匹配的Chart;
condition用於設置條件來裝載匹配的Chart;
import-values則用於導入子Chart的多個值。
若是要對依賴關係進行更好的控制,咱們能夠手工將被依賴的Charts複製到應用的Charts目錄下,以明確的表達這種依賴關係。例如WordPress依賴於Apache和MySQL,則其依賴關係以目錄的形式體現以下所示:
好了,嘮嗑了這麼多,也該來點實際的了。接下來咱們基於以上的認知和Demo配置來進行部署,部署流程以下所示:
如上圖所示,咱們來開始Helm的部署之旅。
1.準備Chart
Chart咱們已經準備好了,具體看上一節的「values.yaml」示例。
2.推送Chart
接下來咱們來推送到倉庫。這裏爲了簡單,咱們直接使用騰訊雲的Tencent Hub提供的免費的Helm倉庫。Tencent Hub的操做比較簡單,咱們這裏略過。接下來,咱們將該倉庫添加到本地:
helm repo add {mycharts} https://hub.tencentyun.com/charts/mycharts --username {myname} --password {mypassword}
「helm repo add」命令用於將倉庫添加到本地倉庫列表,以上命令中的變量說明以下所示:
mycharts 替換爲本身倉庫的命名空間 (用戶名或組織名)
myname 替換爲 Tencent Hub 帳號用戶名
mypassword 替換爲 Tencent Hub 帳號密碼
添加完成後,咱們可使用命令「helm repo list」列出本地倉庫列表:
接下來,咱們須要將咱們的Chart包推送到Tencent Hub的Helm倉庫,在推送以前,咱們還須要安裝平臺的推送插件:
yum install git #若是本地已經安裝git,能夠忽略此步驟
helm plugin install https://github.com/imroc/helm-push #安裝Tencent Hub推送插件
插件安裝完畢以後,咱們就能夠開始咱們的操做了。首先,確保Chart文件在Helm客戶端所在的機器上已經準備就緒,以下圖中的「k8sapp」目錄:
而後就能夠執行推送命令了:
helm push ./k8sapp xinlai
如上所示,「helm push」用於推送Chart,「./k8sapp」是目錄位置,「xinlai」是存儲庫的名稱。執行以上腳本會自動將目標目錄打包並推送:
接下來,咱們能夠在Tencent Hub管理界面上看到咱們的包了:
不只如此,咱們還能查看詳情:
拉取並執行部署
若是是在雲端的k8s集羣進行Helm應用部署,操做很是簡單,雲供應基本上都提供了封裝:
建立完成後以下所示:
如上圖所示,此Helm應用建立了Deployment資源和Service資源,其中Service的類型爲NodePort,端口爲「32160」,接下來咱們能夠經過節點端口訪問:
若是是本地集羣呢?咱們能夠經過如下腳本拉取Chart並執行部署:
helm repo update && helm fetch xinlai/k8sapp
helm install xinlai/k8sapp
部署完成後如圖所示:
注意:咱們能夠經過「--version」參數來部署指定版本的Helm應用:
如圖所示,咱們獲得了Service的端口爲「32705」,一樣的經過本地節點端口訪問以下所示:
至此,經過Helm咱們部署了一個簡單的「k8sapp」Demo應用。部署完成後,咱們能夠經過命令「helm list」來查看已部署的Release:
除了上面提到的一些Helm命令以外,一些經常使用的操做Demo以下所示:
升級和更新
helm upgrade zeroed-rodent xinlai/k8sapp --version 0.1.6
#「zeroed-rodent」爲Release名稱,「xinlai/k8sapp」爲Chart地址。
helm upgrade --set imageTag=20190731075922 zeroed-rodent xinlai/k8sapp
#更新鏡像
查看版本歷史
helm history zeroed-rodent
#查看Release歷史
回滾
helm rollback zeroed-rodent 1
#回滾到版本1
刪除
helm delete zeroed-rodent
#刪除Release
下載Chart
helm fetch xinlai/k8sapp
#下載Chart
基於本地Chart目錄部署
helm install ./k8sapp
#基於目錄「k8sapp」部署
打包
helm package ./k8sapp
#會打包壓縮生成相似於「/k8sapp-0.1.5.tgz」的文件
搜索
helm search k8sapp
#在全部倉庫裏搜索Chart「k8sapp」
啓動本地倉儲服務
helm serve
#默認地址爲「127.0.0.1:8879」,可使用「--address」參數綁定其餘地址和端口