用 Helm 來簡化 K8S 應用管理
參考文檔 :
https://helm.sh/docs/
https://github.com/helm/helm
一、什麼是 Helm
-
Helm 是 Kubernetes 的包管理器,類似於 Python 的 pip centos 的 yum, 主要用來管理 Charts。
-
Helm Chart 是用來封裝 Kubernetes 原生應用程序的一系列 YAML 文件。可以在你部署應用的時候自定義應用程序的一些 Metadata,以便於應用程序的分發。對於應用發佈者而言,可以通過 Helm 打包應用、管理應用依賴關係、管理應用版本併發布應用到軟件倉庫。
二、Helm 帶來的便捷
-
我們日常在 K8S 中部署可用應用時,需要涉及到很多的 K8S 資源的共同協作 (Controller、Service、Configmap、Secret、RBAC、PV、PVC、Ingress 等一系列資源),這些資源過於分散,不方便管理以及定義方式的侷限性,直接提供 kubectl 來管理和生效 YAML 配置創建可用應用,讓人頭疼,不便於維護。
-
在部署一個應用,會遇到哪些問題:
-
如何統一管理、配置和更新這些分散的 k8s 的應用資源文件;
-
如何分發和複用應用模板;
-
如何將應用的一系列資源當做一個軟件包管理;
-
對於使用者而言,使用 Helm 後不用需要編寫複雜的應用部署文件,可以以簡單的方式在 K8S 上查找、安裝、升級、回滾、卸載應用程序;
三、 Helm 工作原理及架構演變
3.1、工作原理
Chart Install 過程
-
Helm 從指定的目錄或者 TAR 文件中解析出 Chart 結構信息。
-
Heml 將指定的 Chart 結構和 Values 信息通過 gRPC 傳遞給 Tiller。
-
Tiller 根據 Chart 和 Values 生成一個 Release。
-
Tiller 根據 Release 發送給 Kubernetes 用於生成 Release。
Chart Update 過程
-
Helm 從指定的目錄或者 TAR 文件中解析出 Chart 結構信息。
-
Helm 將需要更新的 Release 的名稱、Chart 結構和 Values 信息傳遞給 Tiller。
-
Tiller 生成 Release 並更新指定名稱的 Release 和 History。
-
Tiller 將 Release 發送給 Kubernetes 用於更新 Release。
Chart Rollback 過程
-
Helm 將要回滾的 Release 的名稱傳遞給 Tiller。
-
Tiller 根據 Release 的名稱查找 History。
-
Tiller 從 History 中獲取上一個 Release。
-
Tiller 將上一個 Release 發送給 Kubernetes 用於替換當前 Release。
3.2、架構演變
-
在 2019 年 11 月 4 日,Helm 社區 repo 中提供 安全審計報告 , Helm v3 中的訪問控制與 Helm v2 中的訪問控制發生變更;
-
移除 Tiller
-
支持將 Chart 推送至 Docker 鏡像倉庫中
-
使用 JSONSchema 驗證 chart values
-
給 helm charts 添加 test 了,通過 helm test 命令 針對部署的應用跑 tests
-
部署時 release name 必須指定,helm2 時可自動隨機生成
-
刪除時無須再使用 –purge
-
爲了更好地協調其他包管理者的措辭 Helm CLI 個別更名;helm delete 更名爲 helm uninstall,helm inspect 更名爲 helm show,helm fetch 更名爲 helm pull
-
不再需要 requirements.yaml, 依賴關係是直接在 chart.yaml 中定義
-
移除了用於本地臨時搭建 Chart Repository 的 helm serve 命令
五、Helm 組件及相關術語
-
Helm : 命令行下的客戶端工具, 主要用於 K8S 應用程序 Chart 的創建、打包、發佈以及創建和管理本地和遠程的 Chart 倉庫。
-
Chart:Helm 包,採用 TAR 格式。其中包含了運行一個應用所需要的鏡像、依賴和資源定義等,還可能包含 Kubernetes 集羣中的服務定義,類似 Homebrew 中的 formula、APT 的 dpkg 或者 Yum 的 rpm 文件。
-
Release:在 Kubernetes 集羣上運行的 Chart 的一個實例。在同一個集羣上,一個 Chart 可以安裝很多次。每次安裝都會創建一個新的 release。每次安裝都會生成自己的 Release,會有自己的 Release 名稱。
-
Repository:用於發佈和存儲 Chart 的存儲庫。
-
Tiller : (v2 版本)Helm 的服務端。Tiller 負責接收 Helm 的請求,與 k8s 的 apiserver 交互,根據 chart 來生成一個 release 並管理 release。
六、Helm 常用命令
七、推薦倉庫
-
難免需要安裝一些三方的基礎服務,常用倉庫如下 :
-
bitnami 官方地址:https://bitnami.com/
-
微軟倉庫 :http://mirror.azure.cn/kubernetes/charts/
-
阿里雲倉庫 :https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
-
官方倉庫 :https://hub.kubeapps.com/charts/incubator
-
elasticsearch :https://helm.elastic.co
添加微軟倉庫爲 stable
$ helm repo add stable http://mirror.azure.cn/kubernetes/charts
"stable" has been added to your repositories
添加阿里雲倉庫爲 aliyun
$ helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"aliyun" has been added to your repositories
查看本地已添加的倉庫
$ helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
查看倉庫所有的包
$ helm search repo stable
移除倉庫
$ helm repo remove stable
列出倉庫中相關的包
$ helm search repo mysql
八、Charts
8.1、目錄結構
demochart/
├── charts # 目錄用於存放所依賴的子chart
├── Chart.yaml # 描述這個 Chart 的相關信息、包括名字、描述信息、版本等
├── templates # 模板目錄,通常會使用values.yaml配置內容進行填充,板引擎渲染此目錄的文件後Tiller將渲染得到的結果 提交給Kubernetes創建響應的對象
│ ├── deployment.yaml # deployment 控制器的 Go 模板文件
│ ├── _helpers.tpl # 模板助手文件,定義的值可在模板中使用
│ ├── ingress.yaml # ingress 的模板文件
│ ├── NOTES.txt # Chart 部署到集羣后的一些信息,例如:如何使用、列出缺省值,可以理解爲幫助文檔
│ ├── serviceaccount.yaml
│ ├── service.yaml # service 的 Go 模板文件
└── values.yaml # 模板的值文件,這些值會在安裝時應用到 GO 模板生成部署文件
8.2、構建一個無狀態應用模版 charts
部分常用語法說明 :http://masterminds.github.io/sprig/strings.html
- 目錄結構
$ tree demochart/
demochart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
└── values.yaml
- Chart.yaml
apiVersion: v2
name: demochart
description: A Helm chart for Kubernetes, The author is Daizhe
type: application
version: 0.1.0
appVersion: 1.16.0
- templates/deployment.yaml
$ vim templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deployment
name: {{ .Values.Name }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: deployment
template:
metadata:
labels:
app: deployment
spec:
containers:
- image: {{ .Values.image }}
name: nginx
- values.yaml
Name: demo-deploy-nginx
replicas: 1
image: nginx:latest
- install 安裝
$ helm install nginx-dep demochart/ --dry-run
$ helm install nginx-dep demochart/
$ helm list
- upgrade 升級
$ helm upgrade -f values.yaml nginx-dep demochart
- rollback 回滾
$ helm history nginx-dep
$ helm rollback nginx-dep 1
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/2bYH-pDoLxmnYktRnGt4gg