天天看點

利用Helm簡化Kubernetes應用部署(2)

目錄

  • 定義Charts 
  • 使用Helm部署Demo 
  • Helm常用操作指令 

 定義Charts

回到之前的“charts”目錄,我們依次進行解讀并進行簡單的修改。

  • Chart.yaml

配置示例:

apiVersion: v1
appVersion: "1.1"
description: A demo Helm chart for Kubernetes
name: k8sapp
version: 0.1.1      

如上述定義所示,Chart.yaml用于提供Charts相關的中繼資料定義,比如名稱、版本,屬于必備檔案。主要字段如下所示:

字段 是否必填 說明
name 目前Chart名稱
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,則其依賴關系以目錄的形式展現如下所示:

使用Helm部署Demo

好了,唠嗑了這麼多,也該來點實際的了。接下來我們基于以上的認知和Demo配置來進行部署,部署流程如下所示:

利用Helm簡化Kubernetes應用部署(2)

 如上圖所示,我們來開始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”列出本地倉庫清單:

利用Helm簡化Kubernetes應用部署(2)

 接下來,我們需要将我們的Chart包推送到Tencent Hub的Helm倉庫,在推送之前,我們還需要安裝平台的推送插件:

yum install git #如果本地已經安裝git,可以忽略此步驟

helm plugin install https://github.com/imroc/helm-push #安裝Tencent Hub推送插件      

插件安裝完畢之後,我們就可以開始我們的操作了。首先,確定Chart檔案在Helm用戶端所在的機器上已經準備就緒,如下圖中的“k8sapp”目錄:

利用Helm簡化Kubernetes應用部署(2)

 然後就可以執行推送指令了:

helm push ./k8sapp xinlai      

如上所示,“helm push”用于推送Chart,“./k8sapp”是目錄位置,“xinlai”是存儲庫的名稱。執行以上腳本會自動将目标目錄打包并推送:

利用Helm簡化Kubernetes應用部署(2)

 接下來,我們可以在Tencent Hub管理界面上看到我們的包了:

利用Helm簡化Kubernetes應用部署(2)

 不僅如此,我們還能檢視詳情:

利用Helm簡化Kubernetes應用部署(2)
  1. 拉取并執行部署

如果是在雲端的k8s叢集進行Helm應用部署,操作非常簡單,雲供應基本上都提供了封裝:

利用Helm簡化Kubernetes應用部署(2)

 建立完成後如下所示:

利用Helm簡化Kubernetes應用部署(2)

 如上圖所示,此Helm應用建立了Deployment資源和Service資源,其中Service的類型為NodePort,端口為“32160”,接下來我們可以通過節點端口通路:

利用Helm簡化Kubernetes應用部署(2)

 如果是本地叢集呢?我們可以通過以下腳本拉取Chart并執行部署:

helm repo update && helm fetch xinlai/k8sapp
helm install xinlai/k8sapp      

部署完成後如圖所示:

利用Helm簡化Kubernetes應用部署(2)

 注意:我們可以通過“--version”參數來部署指定版本的Helm應用:

利用Helm簡化Kubernetes應用部署(2)

 如圖所示,我們得到了Service的端口為“32705”,同樣的通過本地節點端口通路如下所示:

利用Helm簡化Kubernetes應用部署(2)

 至此,通過Helm我們部署了一個簡單的“k8sapp”Demo應用。部署完成後,我們可以通過指令“helm list”來檢視已部署的Release:

利用Helm簡化Kubernetes應用部署(2)

Helm常用操作指令

除了上面提到的一些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”參數綁定其他位址和端口

往期内容連結

Docker+ Kubernetes已成為雲計算的主流(二十五)

容器化之後如何節省雲端成本?(二十六)

了解Kubernetes主體架構(二十七)

使用Minikube部署本地Kubernetes叢集(二十八)

使用kubectl管理k8s叢集(二十九)

使用Kubeadm建立k8s叢集之部署規劃(三十)

使用Kubeadm建立k8s叢集之節點部署(三十一)

叢集故障處理之處理思路以及健康狀态檢查(三十二)

叢集故障處理之處理思路以及聽診三闆斧(三十三)

開源導入導出通用庫Magicodes.ExporterAndImporter釋出

使用Kubectl部署應用

通過Service通路應用 (1)

通過Service通路應用 (2)

使用Ingress來負載分發微服務

利用Helm簡化Kubernetes應用部署(1)

作者:雪雁

出處:http://www.cnblogs.com/codelove/

溝通管道:程式設計交流群<85318032> 産品交流群<897857351>

如果喜歡作者的文章,請關注【麥扣聊技術】訂閱号以便第一時間獲得最新内容。本文版權歸作者和湖南心萊資訊科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

靜聽鳥語花香,漫賞雲卷雲舒。