天天看點

helm chart編寫入門helm相關概念介紹創作helm chart

helm相關概念介紹

什麼是helm

Helm 是 Kubernetes 的包管理器。包管理器類似于我們在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一樣,能快速查找、下載下傳和安裝軟體包。使用helm能夠将一組k8s資源打包統一管理, 是查找、共享和使用為Kubernetes建構的軟體的最佳方式。

helm 相關元件及概念

  • helm 一個指令行下用戶端工具,主要用于k8s應用chart的建立/打包/釋出已經建立和管理和遠端Chart倉庫。
  • Tiller helm的服務端,部署于k8s内,Tiller接受helm的請求,并根據chart生成k8s部署檔案(helm稱為release),然後送出給 k8s建立應用。Tiller 還提供了 Release 的更新、删除、復原等一系列功能。
  • chart helm的軟體包,其包含運作一個應用所需的所有鏡像/依賴/資源定義等,以及k8s中服務定義
  • release 使用 helm install 指令在 k8s叢集中部署的 Chart 稱為 Release
  • Repoistory Helm chart 的倉庫,Helm 用戶端通過 HTTP 協定來通路存儲庫中 chart 的索引檔案和壓縮包

創作helm chart

Chart目錄結構

本地安裝helm用戶端工具(具體安裝步驟參考官網

https://github.com/helm/helm/releases

)。

運作 helm create demo,會得到一個 helm 自動生成的空 chart。這個 chart 裡的名稱是demo。需要注意的是,Chart 裡面的 demo 名稱需要和生成的 Chart 檔案夾名稱一緻。如果修改 demo,則需要做一緻的修改。

demo                                # Chart 目錄
├── charts                          # 這個 charts 依賴的其他 charts,始終被安裝
├── Chart.yaml                      # 描述這個 Chart 的相關資訊、包括名字、描述資訊、版本等
├── templates                       # 模闆目錄
│   ├── deployment.yaml             # deployment 控制器的 Go 模闆檔案
│   ├── _helpers.tpl                # 以 _ 開頭的檔案不會部署到 k8s 上,可用于定制通用資訊
│   ├── ingress.yaml                # ingress 的模闆檔案
│   ├── NOTES.txt                   # Chart 部署到叢集後的一些資訊,例如:如何使用、列出預設值
│   ├── service.yaml                # service 的 Go 模闆檔案
└── values.yaml                     # 模闆的值檔案,這些值會在安裝時應用到 GO 模闆生成部署檔案      

Chart.yaml

# 對于部分僅支援使用Helm3的chart,應使用v2。對于可以同時支援helm3和helm2版本的chart,可設定為v1
# v2新增了dependencies字段用于定義chart依賴關系,v1中使用requirement.yaml實作該功能
# v2版本新增了type字段,用于區分chart類型,取值為 application(應用類型) / library(庫類型)
apiVersion: v2
name: demo
description: A Helm chart for Kubernetes
type: application
# chart版本
version: 1.0.0
# 應用版本
appVersion: "1.0.0"      

version

每個 chart 都必須有一個版本号。版本必須遵循 Semver 2标準。Helm 使用版本号作為釋出标記。存儲庫中的軟體包由名稱加版本識别。

appVersion

appVersion 字段與 version 字段無關。用于指定應用程式版本。該字段是資訊辨別,對 chart 版本沒有影響。

Semver 2

版本格式:主版本号.次版本号.修訂号

版本号遞增規則如下:

  1. 主版本号:當你做了不相容的 API 修改,
  2. 次版本号:當你做了向下相容的功能性新增,
  3. 修訂号:當你做了向下相容的問題修正。

先行版本号及版本編譯資訊可以加到“主版本号.次版本号.修訂号”的後面,作為延伸。

values.yaml

values.yaml 檔案是 chart 的必要檔案,主要用于變量的定義,此處定義的變量可在templates檔案夾下引用

# Default values
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
  repository: demo
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "1.0"
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
service:
  type: ClusterIP
  port: 80
  targetPort: 8080
ingress:
  enabled: true
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: demo.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local
autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}      

templates

檔案夾記憶體放了各類應用部署所需要使用的 YAML 檔案,比如 Deployment 和 Service。具體參考k8s配置定義。其模闆是用 Go 模闆語言

Go template language

編寫的 ,其中添加了來自 Sprig 庫

from the Sprig library

的 50 個左右的附加模闆函數以及一些其他專用函數

specialized functions

deployment.yaml

apiVersion: apps/v1  # 指定api版本,此值必須在kubectl api-versions中  
kind: Deployment  # 指定建立資源的角色/類型   
metadata:  # 資源的中繼資料/屬性 
  name: demo  # 資源的名字,在同一個namespace中必須唯一
  namespace: default # 部署在哪個namespace中
  labels:  # 設定資源的标簽
    app: demo
    version: stable
spec: # 資源規範字段
  replicas: 1 # 聲明副本數目
  revisionHistoryLimit: 3 # 保留曆史版本
  selector: # 選擇器
    matchLabels: # 比對标簽
      app: demo
      version: stable
  strategy: # 政策
    rollingUpdate: # 滾動更新
      maxSurge: 30% # 最大額外可以存在的副本數,可以為百分比,也可以為整數
      maxUnavailable: 30% # 示在更新過程中能夠進入不可用狀态的 Pod 的最大值,可以為百分比,也可以為整數
    type: RollingUpdate # 滾動更新政策
  template: # 模版
    metadata: # 資源的中繼資料/屬性 
      annotations: # 自定義注解清單
        sidecar.istio.io/inject: "false" # 自定義注解名字
      labels: # 設定資源的标簽
        app: demo
        version: stable
    spec: # 資源規範字段
      containers:
      - name: demo # 容器的名字   
        image: demo:v1 # 容器使用的鏡像位址   
        imagePullPolicy: IfNotPresent # 每次Pod啟動拉取鏡像政策,三個選擇 Always、Never、IfNotPresent
                                      # Always,每次都檢查;Never,每次都不檢查(不管本地是否有);IfNotPresent,如果本地有就不檢查,如果沒有就拉取 
        resources: # 資源管理
          limits: # 最大使用
            cpu: 300m # CPU,1核心 = 1000m
            memory: 500Mi # 記憶體,1G = 1024Mi
          requests:  # 容器運作時,最低資源需求,也就是說最少需要多少資源容器才能正常運作
            cpu: 100m
            memory: 100Mi
        livenessProbe: # pod 内部健康檢查的設定
          httpGet: # 通過httpget檢查健康,傳回200-399之間,則認為容器正常
            path: /healthCheck # URI位址
            port: 8080 # 端口
            scheme: HTTP # 協定
            # host: 127.0.0.1 # 主機位址
          initialDelaySeconds: 30 # 表明第一次檢測在容器啟動後多長時間後開始
          timeoutSeconds: 5 # 檢測的逾時時間
          periodSeconds: 30 # 檢查間隔時間
          successThreshold: 1 # 成功門檻
          failureThreshold: 5 # 失敗門檻,連接配接失敗5次,pod殺掉,重新開機一個新的pod
        readinessProbe: # Pod 準備服務健康檢查設定
          httpGet:
            path: /healthCheck
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
          periodSeconds: 10
          successThreshold: 1
          failureThreshold: 5
        #也可以用這種方法   
        #exec: 執行指令的方法進行監測,如果其退出碼不為0,則認為容器正常   
        #  command:   
        #    - cat   
        #    - /tmp/health   
        #也可以用這種方法   
        #tcpSocket: # 通過tcpSocket檢查健康  
        #  port: number 
        ports:
          - name: http # 名稱
            containerPort: 8080 # 容器開發對外的端口 
            protocol: TCP # 協定
      imagePullSecrets: # 鏡像倉庫拉取密鑰
        - name: harbor-certification
      affinity: # 親和性調試
        nodeAffinity: # 節點親和力
          requiredDuringSchedulingIgnoredDuringExecution: # pod 必須部署到滿足條件的節點上
            nodeSelectorTerms: # 節點滿足任何一個條件就可以
            - matchExpressions: # 有多個選項,則隻有同時滿足這些邏輯選項的節點才能運作 pod
              - key: beta.kubernetes.io/arch
                operator: In
                values:
                - amd64      

service.yaml

apiVersion: v1 # 指定api版本,此值必須在kubectl api-versions中 
kind: Service # 指定建立資源的角色/類型 
metadata: # 資源的中繼資料/屬性
  name: demo # 資源的名字,在同一個namespace中必須唯一
  namespace: default # 部署在哪個namespace中
  labels: # 設定資源的标簽
    app: demo
spec: # 資源規範字段
  type: ClusterIP # ClusterIP 類型
  ports:
    - port: 8080 # service 端口
      targetPort: http # 容器暴露的端口
      protocol: TCP # 協定
      name: http # 端口名稱
  selector: # 選擇器
    app: demo      

ingress.yaml

# test-ingress-myapp.yaml
# ingress規則中,要指定需要綁定暴露的svc名稱
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo
  namespace: default
spec:
  rules:
  - host: demo.local 
    http:
      paths:
      - path: /
        backend:
          serviceName: demo
          servicePort: 80