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
版本格式:主版本号.次版本号.修訂号
版本号遞增規則如下:
- 主版本号:當你做了不相容的 API 修改,
- 次版本号:當你做了向下相容的功能性新增,
- 修訂号:當你做了向下相容的問題修正。
先行版本号及版本編譯資訊可以加到“主版本号.次版本号.修訂号”的後面,作為延伸。
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