一、前言
在k8s中,我們很多時候需要部署很多個應用,特別是微服務的項目,如果每個服務部署都需要使用kubectl apply依次執行,這將是一件很痛苦的事。
這個時候,如果一鍵部署所有應用,使用Helm(https://helm.sh)是一個很不錯的選擇,它具備如下的能力:
簡化部署:Helm允許使用單個命令輕松部署和管理應用程序,從而簡化了整個部署過程;
高度可配置:Helm Charts提供了高度可配置的選項,可以輕松自定義和修改應用程序的部署配置;
版本控制:Helm允許管理應用程序的多個版本,從而輕松實現版本控制和回滾;
模板化:Helm Charts使用YAML模板來定義Kubernetes對象的配置,從而簡化了配置過程,并提高了可重復性和可擴展性;
應用程序庫:Helm具有應用程序庫的概念,可以輕松地共享和重用Helm Charts,從而簡化了多個應用程序的部署和管理;
插件系統:Helm擁有一個強大的插件系統,允許您擴展和定制Helm的功能,以滿足特定的需求和要求。
Helm本質就是一個k8s的包管理器。
二、Helm工作流程
以下是Helm的工作流程(注意:這里使用的是Helm的v3版本,該版本沒有了tiller而是用更加簡單和靈活的架構,直接通過kubeconfig連接apiserver,簡化安全模塊,降低了用戶的使用壁壘):
如上圖所示,Helm的工作流程總結如下:
開發者首先創建并編輯chart的配置;
接著打包并發布至Helm的倉庫(Repository);
當管理員使用helm命令安裝時,相關的依賴會從倉庫下載;
接著helm會根據下載的配置部署資源至k8s。
三、Helm概念
在使用Helm的過程中,需要理解如下的幾個核心的概念:
概念 | 描述 |
Chart | 一個Helm包,其中包含了運行一個應用所需要的鏡像、依賴和資源定義等,還可能包含Kubernetes集群中的服務定義,類似Homebrew中的formula、APT的dpkg或者Yum的rpm文件 |
Repository | 存儲Helm Charts的地方 |
Release | Chart在k8s上運行的Chart的一個實例,例如,如果一個MySQL Chart想在服務器上運行兩個數據庫,可以將這個Chart安裝兩次,并在每次安裝中生成自己的Release以及Release名稱 |
Value | Helm Chart的參數,用于配置Kubernetes對象 |
Template | 使用Go模板語言生成Kubernetes對象的定義文件 |
Namespace | Kubernetes中用于隔離資源的邏輯分區 |
四、Helm的使用
下面簡單講下Helm的使用。
4.1 安裝Helm
首先需要在本地機器或Kubernetes集群上安裝Helm。可以從Helm官方網站下載適合自己平臺的二進制文件,或使用包管理器安裝Helm,安裝教程參考https://helm.sh。
4.2 創建Chart
使用helm create命令創建一個新的Chart,Chart目錄包含描述應用程序的文件和目錄,包括Chart.yaml、values.yaml、templates目錄等;
例如:在本地機器上使用helm create命令創建一個名為wordpress的Chart:
在當前文件夾,可以看到創建了一個wordpress的目錄,且里面的內容如下:
4.3配置Chart
使用編輯器編輯Chart配置文件,包括Chart.yaml和values.yaml。
Chart.yaml:
Chart.yaml包含Chart的元數據和依賴項
Chart.yaml的模板及注釋如下:
apiVersion: chart API 版本 (必需) #必須有 name: chart名稱 (必需) # 必須有 version: 語義化2 版本(必需) # 必須有 kubeVersion: 兼容Kubernetes版本的語義化版本(可選) description: 一句話對這個項目的描述(可選) type: chart類型 (可選) keywords: - 關于項目的一組關鍵字(可選) home: 項目home頁面的URL (可選) sources: - 項目源碼的URL列表(可選) dependencies: # chart 必要條件列表 (可選) - name: chart名稱 (nginx) version: chart版本 ("1.2.3") repository: (可選)倉庫URL ("https://example.com/charts") 或別名 ("@repo-name") condition: (可選) 解析為布爾值的yaml路徑,用于啟用/禁用chart (e.g. subchart1.enabled ) tags: # (可選) - 用于一次啟用/禁用 一組chart的tag import-values: # (可選) - ImportValue 保存源值到導入父鍵的映射。每項可以是字符串或者一對子/父列表項 alias: (可選) chart中使用的別名。當你要多次添加相同的chart時會很有用 maintainers: # (可選) # 可能用到 - name: 維護者名字 (每個維護者都需要) email: 維護者郵箱 (每個維護者可選) url: 維護者URL (每個維護者可選) icon: 用做icon的SVG或PNG圖片URL (可選) appVersion: 包含的應用版本(可選)。不需要是語義化,建議使用引號 deprecated: 不被推薦的chart (可選,布爾值) annotations: example: 按名稱輸入的批注列表 (可選).
舉例:
name: nginx-helm apiVersion: v1 version: 1.0.0
Values.yaml:
values.yaml包含應用程序的默認配置值,舉例:
image: repository: nginx tag: '1.19.8'
templates:
在模板中引入values.yaml里的配置,在模板文件中可以通過.VAlues對象訪問到,例如:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-helm-{{ .Values.image.repository }} spec: replicas: 1 selector: matchLabels: app: nginx-helm template: metadata: labels: app: nginx-helm spec: containers: - name: nginx-helm image: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: 80 protocol: TCP
4.4打包Chart
使用helm package命令將Chart打包為一個tarball文件,例如在wordpress目錄中使用helm package命令將Chart打包為一個tarball文件,這將生成一個名為wordpress-0.1.0.tgz的tarball文件:
helm package wordpress/
4.5發布Chart
將打包好的Chart發布到一個Helm Repository中。可以使用helm repo add命令添加一個Repository,然后使用helm push命令將Chart推送到Repository中,例如:
helm repo add myrepo https://example.com/charts helm push wordpress-0.1.0.tgz myrepo
4.6安裝Release
使用helm install命令安裝Chart的Release,可以通過命令行選項或指定values.yaml文件來配置Release,例如:
helm install mywordpress myrepo/wordpress
這將在Kubernetes集群中創建一個名為mywordpress的Release,包含WordPress應用程序和MySQL數據庫。
4.7管理Release
使用helm ls命令查看當前運行的Release列表,例如:
helm upgrade mywordpress myrepo/wordpress --set image.tag=5.7.3-php8.0-fpm-alpine
這將升級mywordpress的WordPress應用程序鏡像版本為5.7.3-php8.0-fpm-alpine。
可以使用helm rollback命令回滾到先前版本,例如:
helm rollback mywordpress 1
這將回滾mywordpress的版本到1。
4.8更新Chart
在應用程序更新時,可以更新Chart配置文件和模板,并使用helm package命令重新打包Chart。然后可以使用helm upgrade命令升級已安裝的Release,可以按照以下步驟更新Chart:
在本地編輯Chart配置或添加新的依賴項;
使用helm package命令打包新的Chart版本;
使用helm push命令將新的Chart版本推送到Repository中;
使用helm repo update命令更新本地或遠程的Helm Repository;
使用helm upgrade命令升級現有Release到新的Chart版本。
例如,可以使用以下命令更新WordPress的Chart版本:
helm upgrade mywordpress myrepo/wordpress --version 0.2.0
這將升級mywordpress的Chart版本到0.2.0,其中包括新的配置和依賴項。
如果需要刪除一個Release,可以使用helm uninstall命令。例如:
helm uninstall mywordpress
這將刪除名為mywordpress的Release,同時刪除WordPress應用程序和MySQL數據庫。
如果需要刪除與Release相關的PersistentVolumeClaim,可以使用helm uninstall命令的--delete-data選項,例如:
helmuninstallmywordpress--delete-data
這將刪除名為mywordpress的Release,并刪除與之相關的所有PersistentVolumeClaim。
五、Helm的執行安裝順序
Helm按照以下順序安裝資源:
Namespace
NetworkPolicy
ResourceQuota
LimitRange
PodSecurityPolicy
PodDisruptionBudget
ServiceAccount
Secret
SecretList
ConfigMap
StorageClass
PersistentVolume
PersistentVolumeClaim
CustomResourceDefinition
ClusterRole
ClusterRoleList
ClusterRoleBinding
ClusterRoleBindingList
Role
RoleList
RoleBinding
RoleBindingList
Service
DaemonSet
Pod
ReplicationController
ReplicaSet
Deployment
HorizontalPodAutoscaler
StatefulSet
Job
CronJob
Ingress
APIService
Helm 客戶端不會等到所有資源都運行才退出,可以使用 helm status 來追蹤 release 的狀態,或是重新讀取配置信息:
#$helmstatusmynginx NAME: mynginx LAST DEPLOYED: Fri Oct 29 1432 2021 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None
六、Helm命令匯總
在最后,附上所有helm的命令,直接控制臺使用helm --help即可查看:
The Kubernetes package manager Common actions for Helm: - helm search: search for charts - helm pull: download a chart to your local directory to view - helm install: upload the chart to Kubernetes - helm list: list releases of charts Environment variables: | Name | Description | |------------------------------------|---------------------------------------------------------------------------------------------------| | $HELM_CACHE_HOME | set an alternative location for storing cached files. | | $HELM_CONFIG_HOME | set an alternative location for storing Helm configuration. | | $HELM_DATA_HOME | set an alternative location for storing Helm data. | | $HELM_DEBUG | indicate whether or not Helm is running in Debug mode | | $HELM_DRIVER | set the backend storage driver. Values are: configmap, secret, memory, sql. | | $HELM_DRIVER_SQL_CONNECTION_STRING | set the connection string the SQL storage driver should use. | | $HELM_MAX_HISTORY | set the maximum number of helm release history. | | $HELM_NAMESPACE | set the namespace used for the helm operations. | | $HELM_NO_PLUGINS | disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. | | $HELM_PLUGINS | set the path to the plugins directory | | $HELM_REGISTRY_CONFIG | set the path to the registry config file. | | $HELM_REPOSITORY_CACHE | set the path to the repository cache directory | | $HELM_REPOSITORY_CONFIG | set the path to the repositories file. | | $KUBECONFIG | set an alternative Kubernetes configuration file (default "~/.kube/config") | | $HELM_KUBEAPISERVER | set the Kubernetes API Server Endpoint for authentication | | $HELM_KUBECAFILE | set the Kubernetes certificate authority file. | | $HELM_KUBEASGROUPS | set the Groups to use for impersonation using a comma-separated list. | | $HELM_KUBEASUSER | set the Username to impersonate for the operation. | | $HELM_KUBECONTEXT | set the name of the kubeconfig context. | | $HELM_KUBETOKEN | set the Bearer KubeToken used for authentication. | | $HELM_KUBEINSECURE_SKIP_TLS_VERIFY | indicate if the Kubernetes API server's certificate validation should be skipped (insecure) | | $HELM_KUBETLS_SERVER_NAME | set the server name used to validate the Kubernetes API server certificate | | $HELM_BURST_LIMIT | set the default burst limit in the case the server contains many CRDs (default 100, -1 to disable)| Helm stores cache, configuration, and data based on the following configuration order: - If a HELM_*_HOME environment variable is set, it will be used - Otherwise, on systems supporting the XDG base directory specification, the XDG variables will be used - When no other location is set a default location will be used based on the operating system By default, the default directories depend on the Operating System. The defaults are listed below: | Operating System | Cache Path | Configuration Path | Data Path | |------------------|---------------------------|--------------------------------|-------------------------| | Linux | $HOME/.cache/helm | $HOME/.config/helm | $HOME/.local/share/helm | | macOS | $HOME/Library/Caches/helm | $HOME/Library/Preferences/helm | $HOME/Library/helm | | Windows | %TEMP%helm | %APPDATA%helm | %APPDATA%helm | Usage: helm [command] Available Commands: completion generate autocompletion scripts for the specified shell create create a new chart with the given name dependency manage a chart's dependencies env helm client environment information get download extended information of a named release help Help about any command history fetch release history install install a chart lint examine a chart for possible issues list list releases package package a chart directory into a chart archive plugin install, list, or uninstall Helm plugins pull download a chart from a repository and (optionally) unpack it in local directory push push a chart to remote registry login to or logout from a registry repo add, list, remove, update, and index chart repositories rollback roll back a release to a previous revision search search for a keyword in charts show show information of a chart status display the status of the named release template locally render templates test run tests for a release uninstall uninstall a release upgrade upgrade a release verify verify that a chart at the given path has been signed and is valid version print the client version information Flags: --burst-limit int client-side default throttling limit (default 100) --debug enable verbose output -h, --help help for helm --kube-apiserver string the address and the port for the Kubernetes API server --kube-as-group stringArray group to impersonate for the operation, this flag can be repeated to specify multiple groups. --kube-as-user string username to impersonate for the operation --kube-ca-file string the certificate authority file for the Kubernetes API server connection --kube-context string name of the kubeconfig context to use --kube-insecure-skip-tls-verify if true, the Kubernetes API server's certificate will not be checked for validity. This will make your HTTPS connections insecure --kube-tls-server-name string server name to use for Kubernetes API server certificate validation. If it is not provided, the hostname used to contact the server is used --kube-token string bearer token used for authentication --kubeconfig string path to the kubeconfig file -n, --namespace string namespace scope for this request --registry-config string path to the registry config file (default "/Users/yanglinwei/Library/Preferences/helm/registry/config.json") --repository-cache string path to the file containing cached repository indexes (default "/Users/yanglinwei/Library/Caches/helm/repository") --repository-config string path to the file containing repository names and URLs (default "/Users/yanglinwei/Library/Preferences/helm/repositories.yaml") Use "helm [command] --help" for more information about a command.
七、文末
本文主要講解了Helm的一些概念及用法,希望能幫助到大家,謝謝大家的閱讀,本文完!
-
應用程序
+關注
關注
37文章
3244瀏覽量
57610 -
配置
+關注
關注
1文章
187瀏覽量
18361
原文標題:Helm入門(一篇就夠了)
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論