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

目錄

  • 定義Charts 
  • 使用Helm部署Demo 
  • Helm經常使用操做命令 

 定義Charts

回到以前的「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,則其依賴關係以目錄的形式體現以下所示:

 

 

使用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」參數綁定其餘地址和端口

 

 

往期內容連接

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

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

開源導入導出通用庫Magicodes.ExporterAndImporter發佈

使用Kubectl部署應用

經過Service訪問應用 (1)

經過Service訪問應用 (2)

使用Ingress來負載分發微服務

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

相關文章
相關標籤/搜索