kubernetes實戰篇之helm示例yaml檔案檔案詳細介紹

周國通發表於2019-07-06

系列目錄

前面完整示例裡,我們主要講解helm打包,部署,升級,回退等功能,關於這裡面的檔案只是簡單介紹,這一節我們詳細介紹一下這裡面的檔案,以方便我們參照建立自己的helm chart.

Helm Chart 結構

Chart 目錄結構

mychart/
  Chart.yaml          # Yaml檔案,用於描述Chart的基本資訊,包括名稱版本等
  LICENSE             # [可選] 協議
  README.md           # [可選] 當前Chart的介紹
  values.yaml         # Chart的預設配置檔案
  requirements.yaml   # [可選] 用於存放當前Chart依賴的其它Chart的說明檔案
  charts/             # [可選]: 該目錄中放置當前Chart依賴的其它Chart
  templates/          # [可選]: 部署檔案模版目錄,模版使用的值來自values.yaml和由Tiller提供的值
  templates/NOTES.txt # [可選]: 放置Chart的使用指南

預設生成的chart如果沒有修改是沒有這麼多的.

Chart.yaml 檔案

name: [必須] Chart的名稱
version: [必須] Chart的版本號,版本號必須符合 SemVer 2:http://semver.org/
description: [可選] Chart的簡要描述
keywords:
  -  [可選] 關鍵字列表,便於檢索
home: [可選] 專案地址
sources:
  - [可選] 當前Chart的下載地址列表
maintainers: # [可選]
  - name: [必須] 名字
    email: [可選] 郵箱
engine: gotpl # [可選] 模版引擎,預設值是gotpl
icon: [可選] 一個SVG或PNG格式的圖片地址

requirements.yaml 和 charts目錄

requirements.yaml 檔案內容:

dependencies:
  - name: example
    version: 1.2.3
    repository: http://example.com/charts
  - name: Chart名稱
    version: Chart版本
    repository: 該Chart所在的倉庫地址

Chart支援兩種方式表示依賴關係,可以使用requirements.yaml或者直接將依賴的Chart放置到charts目錄中。

templates 目錄

templates目錄中存放了Kubernetes部署檔案的模版。
例如:

# db.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: deis-database
  namespace: deis
  labels:
    heritage: deis
spec:
  replicas: 1
  selector:
    app: deis-database
  template:
    metadata:
      labels:
        app: deis-database
    spec:
      serviceAccount: deis-database
      containers:
        - name: deis-database
          image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}}
          imagePullPolicy: {{.Values.pullPolicy}}
          ports:
            - containerPort: 5432
          env:
            - name: DATABASE_STORAGE
              value: {{default "minio" .Values.storage}}

模版語法擴充套件了 golang/text/template的語法:

# 這種方式定義的模版,會去除test模版尾部所有的空行
{{- define "test"}}
模版內容
{{- end}}
 
# 去除test模版頭部的第一個空行
{{- template "test" }}

用於yaml檔案前置空格的語法:

# 這種方式定義的模版,會去除test模版頭部和尾部所有的空行
{{- define "test" -}}
模版內容
{{- end -}}
 
# 可以在test模版每一行的頭部增加4個空格,用於yaml檔案的對齊
{{ include "test" | indent 4}}

建立自己的chart

我們建立一個名為mongodb的chart,看一看chart的檔案結構

$ helm create mongodb
$ tree mongodb
mongodb
├── Chart.yaml #Chart本身的版本和配置資訊
├── charts #依賴的chart
├── templates #配置模板目錄
│   ├── NOTES.txt #helm提示資訊
│   ├── _helpers.tpl #用於修改kubernetes objcet配置的模板
│   ├── deployment.yaml #kubernetes Deployment object
│   └── service.yaml #kubernetes Serivce
└── values.yaml #kubernetes object configuration
 
2 directories, 6 files

模板

Templates目錄下是yaml檔案的模板,遵循Go template語法。使用過Hugo的靜態網站生成工具的人應該對此很熟悉。

我們檢視下deployment.yaml檔案的內容。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: {{ template "fullname" . }}
  labels:
    chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ template "fullname" . }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        ports:
        - containerPort: {{ .Values.service.internalPort }}
        livenessProbe:
          httpGet:
            path: /
            port: {{ .Values.service.internalPort }}
        readinessProbe:
          httpGet:
            path: /
            port: {{ .Values.service.internalPort }}
        resources:
{{ toyaml .Values.resources | indent 12 }}

這是該應用的Deployment的yaml配置檔案,其中的雙大括號包擴起來的部分是Go template,其中的Values是在values.yaml檔案中定義的:

# Default values for mychart.
# This is a yaml-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
  repository: nginx
  tag: stable
  pullPolicy: IfNotPresent
service:
  name: nginx
  type: ClusterIP
  externalPort: 80
  internalPort: 80
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

比如在Deployment.yaml中定義的容器映象image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"其中的:

  • .Values.image.repository就是nginx

  • .Values.image.tag就是stable

以上兩個變數值是在create chart的時候自動生成的預設值

相關文章