雲原生之旅 – 5)Kubernetes時代的包管理工具 Helm
- 2022 年 10 月 30 日
- 筆記
- SRE/DevOps, 雲原生
前言
上一篇文章 [基礎設施即代碼 使用 Terraform 創建 Kubernetes] 教會了你如何在Cloud上面建Kubernetes資源,那麼本篇來講一下如何在Kubernetes上面部署應用。大家都知道 Kubernetes上的應用對象,都是由特定的資源描述組成,然後保存至一個個YAML文件,通過 kubectl apply –f 部署,但是這種手動的方式面臨很多問題,容易出錯,代碼冗餘,缺少版本控制等。所以我們需要一些工具來幫助我們更快的達到部署以及管理應用的目的。目前很流行的工具主要是 Helm 和 Kustomize(下一篇會介紹),本篇主要介紹 Helm。
Helm是一個 Kubernetes 的包管理工具,就像Linux下的包管理器,如 yum/apt 等,可以很方便的將之前打包好的yaml文件部署到 kubernetes 上。Helm有幾個重要概念:
helm
:一個命令行客戶端工具,主要用於Kubernetes應用chart的創建、打包、發佈和管理Chart
:應用描述,一系列用於描述 k8s 資源相關文件的集合Release
:基於Chart的部署實體,一個 Chart 被 Helm 運行後將會生成對應的一個 release;將在k8s中創建出真實運行的資源對象Repository
:主要就是用來存放和共享 Chart 使用,相當於是 GitHub,不過這裡主要是供 Kubernetes 使用。
關鍵詞: Helm入門,Helm實踐,使用Terraform 安裝Helm Charts,自製Helm Charts,自定義Helm Chart,編寫自己的Helm Charts
安裝
參考官方文檔,我這裡是MacOS `brew install helm` 就行了。
使用Helm命令安裝Chart
我們以安裝bitnami 的Nginx為例子
helm repo add bitnami //charts.bitnami.com/bitnami helm repo list helm search repo nginx helm install mywebserver bitnami/nginx
安裝到一個已存在的Namespace
helm install mywebserver bitnami/nginx -n demo
安裝到一個新的Namespace
helm install mywebserver bitnami/nginx -n demo --create-namespace
安裝某特定版本
helm install mywebserver bitnami/nginx --version 13.2.8
查看
helm list helm list -n demo
修改參數安裝,如下是把service type 改為ClusterIP,默認為LB類型
helm install my-nginx bitnami/nginx --set service.type="ClusterIP"
## 更多參數可參考文檔
也可通過values.yaml修改參數
helm inspect values bitnami/nginx > values.yaml vim values.yaml helm install mywebserver bitnami/nginx -f values.yaml NAME: mywebserver LAST DEPLOYED: Tue Oct 4 10:23:16 2022 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: nginx CHART VERSION: 13.2.9 APP VERSION: 1.23.1
如果想把Chart從repository下載到本地安裝
pull到本地並解壓 然後install from local
helm pull bitnami/nginx --untar helm install mywebserver2 ./nginx
Clean up
helm uninstall mywebserver helm repo remove bitnami
### 本文首發於博客園 //www.cnblogs.com/wade-xu/p/16839834.html
使用 Terraform Helm Provider 安裝 Helm Chart
還沒有Terraform入門的,請移步本人前面的文檔。例 雲原生之旅 – 3)基礎設施即代碼 Terraform 快速入門
Terraform 代碼示例如下


terraform { backend "gcs" { bucket = "global-sre-dev-terraform" prefix = "helm/state" } }
backend.tf


terraform { required_version = ">= 1.2.9" required_providers { helm = { source = "hashicorp/helm" version = "2.7.0" } } } data "google_project" "this" { project_id = "global-sre-dev" } data "google_client_config" "this" {} data "google_container_cluster" "this" { name = "sre-mgmt" location = "us-west1" project = data.google_project.this.project_id } provider "helm" { kubernetes { host = "//${data.google_container_cluster.this.private_cluster_config[0].public_endpoint}" token = data.google_client_config.this.access_token cluster_ca_certificate = base64decode(data.google_container_cluster.this.master_auth[0].cluster_ca_certificate) } experiments { manifest = true } }
provider.tf


resource "helm_release" "my-nginx" { name = "my-nginx-release" repository = "//charts.bitnami.com/bitnami" chart = "nginx" set { name = "service.type" value = "ClusterIP" } set { name = "replicaCount" value = "2" } }
nginx.tf
然後執行terraform 命令安裝Nginx helm chart
terraform init terraform plan terraform apply
Reference: Terraform Helm Provider
自己製作 Helm Chart
helm create mychart
list 能看到目錄結構如下
- Chart.yaml
- values.yaml
- templates
- charts
charts 目錄可以放一些依賴的chart包,屬於高階用法,目前置空就行了。values.yaml文件為模版變量默認值。
現在,做一個最簡單的Helm Charts 創建 namespace
templates 目錄下僅需一個文件 namespace.yaml
--- {{ range $i, $ns := .Values.namespaces -}} apiVersion: v1 kind: Namespace metadata: name: {{ $ns.name }} annotations: helm.sh/resource-policy: keep {{- if hasKey $ns "extraAnnotations" }} {{- toYaml $ns.extraAnnotations | nindent 4 }} {{- end }} --- {{- end }}
Chart.yaml
apiVersion: v2 description: Helm chart for maintaining user namespaces name: user-namespaces version: 1.1.0
values.yaml 放一個默認值來測試下
namespaces: - name: wade-test owner: "[email protected]" extraAnnotations: abc: def
測試
helm template user-namespaces
現在就可以local直接安裝了,命令上面已經介紹過。
我們現在選擇打包並且publish 到一個bucket 作為repository來共享給別人使用。也可以通過github作為repository,有類似solution,不再贅述。
我這裡的例子是gcs bucket 作為私有 helm repository
helm package user-namespaces
此命令會生成一個tgz 包: `user-namespaces-1.1.0.tgz`
然後藉助一款工具 helm-gcs
which is a helm plugin that allows you to manage private helm repositories on Google Cloud Storage aka buckets.
helm gcs init gs://package/charts/infra/ helm repo add my-repo gs://package/charts/infra/ helm gcs push user-namespaces-1.1.0.tgz my-repo
你會看到此bucket下面會有兩個文件
% gsutil ls gs://package/charts/infra/ gs://package/charts/infra/index.yaml gs://package/charts/infra/user-namespaces-1.1.0.tgz
使用 Terraform Helm Provider 安裝此Chart 代碼示例:
locals {
namespaces: - name: ${local.my_namespace} owner: wadexu EOT }
resource "helm_release" "my_namespace" {
after terraform init and apply the resource
你的第一個自定義 Helm Chart 通過Terraform 安裝成功了。
Helm list result:
`kubectl gs ns` you will see this new namespace just created
% kubectl get ns
NAME STATUS AGE
wade-demo Active 75s
總結
通過此文章的學習,您將了解到Helm的基本命令,以及Terrraform 安裝 Helm 的方式,以便於後續自動化整個安裝應用來Provisioning Kubernetes Clusters的流程。另外還了解到如何製作自己的第一個Helm Chart。
感謝閱讀,如果您覺得本文的內容對您的學習有所幫助,您可以打賞和推薦,您的鼓勵是我創作的動力。