1. 程式人生 > >利用Helm簡化Kubernetes應用部署(2)

利用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的部署之旅。

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管理介面上看到我們的包了:

 

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

  1. 拉取並執行部署

如果是在雲端的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常用操作命令

除了上面提到的一些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應用部署(