Helm部署k8s應用

misakivv發表於2024-07-23

目錄
  • 一、概述
    • 1、什麼是Helm
    • 2、特點
    • 3、工作流程
    • 4、核心概念
  • 二、安裝Helm
    • 1、二進位制版本安裝
      • 1.1、下載需要的版本
      • 1.2、解壓
      • 1.3、將helm移動到指定路徑
      • 1.4、驗證
  • 三、Helm安裝資源順序
  • 四、--set 的格式和限制
    • 1、最簡單的name/value對
    • 2、多個name/value對
    • 3、更復雜的表示式
    • 4、列表的表達
    • 5、name/key可以設定為null或者空陣列
    • 6、使用陣列下標的語法來訪問列表中的元素
    • 7、多個值得陣列下標語法
    • 8、特殊字元轉義
    • 9、轉義.
  • 五、values檔案
  • 六、例項
    • 1、建立Chart
      • 1.1、在本地建立一個wordpress的Chart
      • 1.2、檢視目錄結構
    • 2、編輯Chart配置
      • 2.1、Chart.yaml
      • 2.2、values.yaml
      • 2.3、templates
    • 3、打包Chart
    • 4、釋出Chart
    • 5、安裝Release
    • 6、檢視當前執行的Release列表
    • 7、升級版本
      • 7.1、格式
      • 7.2、指定'--values'/'-f'引數
      • 7.3、指定'--set'引數
      • 7.4、修改nginx映象版本為1.27.0
    • 8、回滾
      • 8.1、檢視釋出歷史
      • 8.2、回滾到第一個版本
    • 9、刪除Chart
  • 七、查詢Helm命令的幫助資訊

一、概述

1、什麼是Helm

Helm是Kubernetes的一個包管理工具,它為Kubernetes提供了一種管理和標準化的部署方式。在Kubernetes生態系統中,Helm扮演著類似於我們在 Ubuntu 中使用的apt、Centos中使用的 yum 或者Python中的 pip 一樣,它使使用者能夠輕鬆地查詢、共享和重複使用複雜的容器化應用程式部署配置。

Helm的核心概念是圖表(Chart),這是一個封裝了完整Kubernetes應用的軟體包。一個Helm圖表通常包含一組Kubernetes資源模板,比如Deployment、Service、ConfigMap等,以及用於定製這些資源的引數檔案。透過這種方式,Helm圖表可以作為可重用的應用程式模板,允許使用者在不同的環境和需求下靈活地部署和管理複雜的應用程式。

2、特點

  • 簡化部署 :Helm允許使用單個命令輕鬆部署和管理應用程式,從而簡化了整個部署過程;
  • 高度可配置:Helm Charts提供了高度可配置的選項,可以輕鬆自定義和修改應用程式的部署配置;
  • 版本控制 :Helm允許管理應用程式的多個版本,從而輕鬆實現版本控制和回滾;
  • 模板化:Helm Charts使用YAML模板來定義Kubernetes物件的配置,從而簡化了配置過程,並提高了可重複性和可擴充套件性;
  • 應用程式庫:Helm具有應用程式庫的概念,可以輕鬆地共享和重用Helm Charts,從而簡化了多個應用程式的部署和管理;
  • 外掛系統:Helm擁有一個強大的外掛系統,允許您擴充套件和定製Helm的功能,以滿足特定的需求和要求。

3、工作流程

這裡使用的是Helm的v3版本,該版本沒有了tiller並並使用更加簡單和靈活的架構,直接透過kubeconfig連線apiserver,簡化安全模組

851319329

  1. 開發者首先建立並編輯chart的配置;
  2. 接著打包併發布至Helm的倉庫(Repository);
  3. 當管理員使用helm命令安裝時,相關的依賴會從倉庫下載;
  4. 接著helm會根據下載的配置部署資源至k8s;

4、核心概念

概念 描述
Chart Chart是Helm的基本單位,它是一個打包好的Kubernetes應用模板集合,包含了一組Kubernetes資源的描述檔案(如Deployment、Service、ConfigMap等)。Chart還包括一個Chart.yaml檔案,用於描述Chart的後設資料,如版本、描述、維護者等。Chart還包含一個values.yaml檔案,用於儲存預設的可配置引數。
Repository Repository是一個儲存和分發Helm Charts的地方。Charts可以被上傳到倉庫,供使用者搜尋、下載和安裝。Helm支援多種型別的倉庫,包括本地檔案系統、HTTP伺服器或專用的Helm倉庫服務。倉庫通常包含一個索引檔案,列出所有可用的Charts及其版本。
Release Release是指使用Helm安裝Chart到Kubernetes叢集上的一次例項化操作。每次使用helm install命令安裝Chart時,都會建立一個新的Release。Release有自己的名稱,且在同一個名稱空間內必須唯一。透過Release,使用者可以追蹤和管理部署的應用例項。
Values Values是Helm用來引數化Chart的方式。Chart中可能包含多個values.yaml檔案,它們用於儲存可以由使用者修改的變數。在安裝Chart時,使用者可以透過傳遞額外的值或覆蓋預設值來定製部署。Values的合併遵循一定的規則,以確定最終的配置。
Template Templates是Chart中用於生成Kubernetes資源定義的檔案。它們使用Go模板語言編寫,可以包含變數、條件和迴圈等結構。在安裝Chart時,Helm會渲染這些模板,並根據提供的值生成具體的Kubernetes資源定義。
Tiller Tiller是Helm的伺服器端元件,負責接收來自Helm客戶端的請求,並在Kubernetes叢集上執行相應的操作。在早期版本的Helm中,Tiller作為一個守護程序執行在Kubernetes叢集中。但在Helm 3中,Tiller已被移除,Helm 3採用了無守護程序的設計,所有操作都在客戶端執行,與Kubernetes API Server直接通訊。
rollback 回滾,每一次釋出會更新chart或者配置。當生成釋出歷史後,一次釋出也可以被 rolled back 之前的釋出版本號。 回滾使用 helm rollback 命令實現。

二、安裝Helm

本篇只介紹二進位制安裝,其他的安裝教程:

Helm | 安裝Helm

1、二進位制版本安裝

1.1、下載需要的版本

Helm-GitHub

1.2、解壓

tar -zxvf helm-v3.15.2-linux-amd64.tar

1.3、將helm移動到指定路徑

mv linux-amd64/helm /usr/local/bin/helm

1.4、驗證

helm version

image-20240721220924491

三、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

四、--set 的格式和限制

--set 選項使用0或多個 name/value 對

1、最簡單的name/value對

--set name=value
等價於
name: value

2、多個name/value對

--set a=b,c=d
等價於
a: b
c: d

3、更復雜的表示式

--set outer.inner=value
等價於
outer:
  inner: value

4、列表的表達

--set name={a, b, c}
等價於
name:
  - a
  - b
  - c

5、name/key可以設定為null或者空陣列

--set name=[],a=null
由
name:
  - a
  - b
  - c
a: b
變為了
name: []
a: null

6、使用陣列下標的語法來訪問列表中的元素

從 2.5.0 版本開始支援

--set servers[0].port=80
等價於
servers:
  - port: 80

7、多個值得陣列下標語法

--set servers[0].port=80,servers[0].host=example
等價於
servers:
  - port: 80
    host: example

8、特殊字元轉義

--set name=value1\,value2
等價於
name: "value1,value2"

9、轉義.

--set nodeSelector."kubernetes\.io/role"=master
等價於
nodeSelector:
  kubernetes.io/role: master

五、values檔案

優先順序為values.yaml最低,--set引數最高。

對應的官網連結

六、例項

1、建立Chart

1.1、在本地建立一個wordpress的Chart

helm create wordpress

image-20240721224407074

1.2、檢視目錄結構

cd wordpress

tree

image-20240721224535715

2、編輯Chart配置

2.1、Chart.yaml

Chart.yaml包含 Chart的後設資料和依賴項

  • 各欄位解釋
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: 按名稱輸入的批註列表 (可選)

v3.3.2,不再允許額外的欄位。推薦的方法是在 annotations 中新增自定義後設資料。

  • 編寫我們自己的Chart.yaml
name: nginx-helm
apiVersion: v1
version: 1.0.0

2.2、values.yaml

values檔案被定義為YAML格式。chart會包含一個預設的values.yaml檔案。 Helm安裝命令允許使用者使用附加的YAML values覆蓋這個values:

helm install --generate-name --values=myvals.yaml wordpress
  • 各欄位解釋
# Default values for wordpress.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1	#控制部署的Pod副本數量,預設為1。這適用於StatefulSet或Deployment型別的Kubernetes資源。

image:	#用於配置容器映象的相關資訊
  repository: nginx	#映象倉庫地址。
  pullPolicy: IfNotPresent	#拉取映象的策略,可以是Always, IfNotPresent, 或 Never。
  # Overrides the image tag whose default is the chart appVersion.
  tag: ""	#映象的標籤,如果沒有指定,則預設使用Chart的版本。

imagePullSecrets: []	#列出拉取私有映象所需的金鑰名稱。
nameOverride: ""
fullnameOverride: ""	#用於覆蓋生成的資源名稱的部分或全部。

serviceAccount:	#配置服務賬戶的選項。
  # Specifies whether a service account should be created
  create: true	#是否自動建立服務賬戶。
  # Automatically mount a ServiceAccount's API credentials?
  automount: true	#是否自動掛載服務賬戶的API憑證。
  # Annotations to add to the service account
  annotations: {}	#附加到服務賬戶的註解。
  # The name of the service account to use.
  # If not set and create is true, a name is generated using the fullname template
  name: ""	#使用的服務賬戶名稱。

podAnnotations: {}	#附加到Pod的註解。
podLabels: {}	#附加到Pod的標籤。

podSecurityContext: {}	
  # fsGroup: 2000

securityContext: {}	#定義Pod和容器的安全上下文。
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:	#配置Service資源
  type: ClusterIP	#Service的型別,例如ClusterIP, NodePort, LoadBalancer等。
  port: 80	#Service監聽的埠。

ingress:	#Ingress資源的配置。
  enabled: false	#是否啟用Ingress。
  className: ""	#Ingress控制器的類名。
  annotations: {}	#附加到Ingress的註解。
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:	#定義Ingress的主機名和路徑。
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []	# TLS配置。
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: {}	#Pod的資源限制和請求。
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #   cpu: 100m
  #   memory: 128Mi
  # requests:
  #   cpu: 100m
  #   memory: 128Mi

livenessProbe:	
  httpGet:
    path: /
    port: http
readinessProbe:	#定義容器的存活探針和就緒探針,用於健康檢查。
  httpGet:
    path: /
    port: http

autoscaling:	 #水平自動擴縮容的配置。
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

# Additional volumes on the output Deployment definition.
volumes: []
# - name: foo
#   secret:
#     secretName: mysecret
#     optional: false

# Additional volumeMounts on the output Deployment definition.
volumeMounts: []	#Pod的卷和卷掛載配置。
# - name: foo
#   mountPath: "/etc/foo"
#   readOnly: true

nodeSelector: {}	#選擇執行Pod的節點的標籤。
	
tolerations: []	#允許Pod容忍節點的汙點。

affinity: {}	#節點親和性和反親和性配置,用於控制Pod在哪些節點上執行。
  • 編寫我們自己的values.yaml
image:
  repository: nginx
  tag: latest

2.3、templates

在模板中引入values.yaml裡的配置,在模板檔案中可以透過 .VAlues物件訪問到

deployment.yaml
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

3、打包Chart

使用helm package命令將Chart打包為一個tarball檔案

helm package wordpress/

image-20240721232459917

這將生成一個名為nginx-helm-1.0.0.tgztarball檔案。

4、釋出Chart

將打包好的Chart釋出到一個Helm Repository中。可以使用helm repo add命令新增一個Repository,然後使用helm push命令將Chart推送到Repository中

helm repo add myrepo https://example.com/charts
helm push nginx-helm-1.0.0.tgz myrepo

5、安裝Release

使用helm install命令安裝Chart的Release,可以透過命令列選項或指定values.yaml檔案來配置Release

helm install my-nginx ./nginx-helm-1.0.0.tgz 

image-20240721234127853

6、檢視當前執行的Release列表

helm list 與 helm ls 命令執行的效果是一致的

helm list
helm ls

image-20240721234311316

7、升級版本

7.1、格式

helm upgrade [RELEASE] [CHART] [flags]

7.2、指定'--values'/'-f'引數

可以多次指定'--values'/'-f'引數,最後(最右邊)指定的檔案優先順序最高。比如如果myvalues.yaml和override.yaml同時包含了名為 'Test'的key,override.yaml中的設定會優先使用:

helm upgrade -f myvalues.yaml -f override.yaml redis ./redis

7.3、指定'--set'引數

可以多次指定'--set'引數,最後(最右邊)指定的優先順序最高。比如'bar' 和 'newbar'都設定了一個名為'foo'的可以, 'newbar'的值會優先使用:

helm upgrade --set foo=bar --set foo=newbar redis ./redis

7.4、修改nginx映象版本為1.27.0

helm upgrade my-nginx nginx-helm-1.0.0.tgz --set image.tag=1.27.0

10400250315i3hvspg202l0nsa0

kubectl get pods

kubectl get pods nginx-helm-nginx-5b97c9f87d-ggbgw -o yaml | grep image

10400250315i3j3s4g206spva18

8、回滾

8.1、檢視釋出歷史

helm history my-nginx

10400250315i3lh690204d2sd30

8.2、回滾到第一個版本

 helm rollback my-nginx 1

10400250315i3p68dg208t8u7rc

kubectl get pods 

kubectl get pods nginx-helm-nginx-868dbb969-p9k5t -o yaml | grep image

10400250315i3o3iu02073bo8pk

9、刪除Chart

helm uninstall my-nginx

10400250315i3q381g206l7k8is

七、查詢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_QPS                          | set the Queries Per Second in cases where a high number of calls exceed the option for higher burst values |

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
      --qps float32                     queries per second used when communicating with the Kubernetes API, not including bursting
      --registry-config string          path to the registry config file (default "/root/.config/helm/registry/config.json")
      --repository-cache string         path to the file containing cached repository indexes (default "/root/.cache/helm/repository")
      --repository-config string        path to the file containing repository names and URLs (default "/root/.config/helm/repositories.yaml")

Use "helm [command] --help" for more information about a command.

相關文章