AWS-EKS-14--Helm

摘要

Helm

  • 官网文档

  • Helm 是 Kubernetes 的包管理器,类似于 Linux 下的包管理工具如 yum、apt 等。可以方便的将之前打包好的 yaml 文件部署到 Kunernetes 上。

为什么要引入 Helm

  • 在以往的应用部署过程当中,我们需要先编写一个 yaml 文件,然后该文件中包含 deployment、Service、Ingress 等等。

  • 如果说需要部署的是单一、少数服务的应用,那么完全可以使用 yaml 文件的方式,这样会很简单。但是在实际的项目当中,微服务的数量基本不可能是一个,可能是几十个,如果说再用 yaml 文件的部署方式,那就意味着需要编写几十个 yaml 文件,这就会导致 数量多、维护难 等诸多问题。

  • 针对上述问题,Helm 的引入使用则可以将所有的 yaml 文件进行一个整体的管理,而且它能够实现 yaml 文件的高效复用。

  • Helm 具备如下的能力:
    简化部署 :Helm允许使用单个命令轻松部署和管理应用程序,从而简化了整个部署过程;
    高度可配置:Helm Charts提供了高度可配置的选项,可以轻松自定义和修改应用程序的部署配置;
    版本控制 :Helm允许管理应用程序的多个版本,从而轻松实现版本控制和回滚;
    模板化:Helm Charts使用YAML模板来定义Kubernetes对象的配置,从而简化了配置过程,并提高了可重复性和可扩展性;
    应用程序库:Helm具有应用程序库的概念,可以轻松地共享和重用Helm Charts,从而简化了多个应用程序的部署和管理;
    插件系统: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之后,您可以添加一个chart 仓库。从 Artifact Hub 中查找有效的Helm chart仓库。

  • 另外常用的仓库有阿里云微软

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# 添加仓库
# 语法 :helm repo add 仓库名称 仓库地址
# 添加 eks-charts 存储库
$ helm repo add eks https://aws.github.io/eks-charts

# 更新指定仓库索引,以确保您拥有最新的图表
$ helm repo update eks

# 更新全部仓库索引
$ helm repo update

# 查看已经添加的仓库
$ helm repo list
NAME URL
eks https://aws.github.io/eks-charts

# 搜索,默认展示最新的版本
$ helm search repo load-balancer
NAME CHART VERSION APP VERSION DESCRIPTION
eks/aws-load-balancer-controller 1.5.4 v2.5.3 AWS Load Balancer Controller Helm chart for Kub...

# 搜索全部版本
$ helm search repo load-balancer -l
NAME CHART VERSION APP VERSION DESCRIPTION
eks/aws-load-balancer-controller 1.5.4 v2.5.3 AWS Load Balancer Controller Helm chart for Kub...
eks/aws-load-balancer-controller 1.5.3 v2.5.2 AWS Load Balancer Controller Helm chart for Kub...
eks/aws-load-balancer-controller 1.5.2 v2.5.1 AWS Load Balancer Controller Helm chart for Kub...
eks/aws-load-balancer-controller 1.5.1 v2.5.1 AWS Load Balancer Controller Helm chart for Kub...

# 在全部版本中搜索大于等于指定版本
$ helm search repo load-balancer --version ^1.5.1 -l
NAME CHART VERSION APP VERSION DESCRIPTION
eks/aws-load-balancer-controller 1.5.4 v2.5.3 AWS Load Balancer Controller Helm chart for Kub...
eks/aws-load-balancer-controller 1.5.3 v2.5.2 AWS Load Balancer Controller Helm chart for Kub...
eks/aws-load-balancer-controller 1.5.2 v2.5.1 AWS Load Balancer Controller Helm chart for Kub...
eks/aws-load-balancer-controller 1.5.1 v2.5.1 AWS Load Balancer Controller Helm chart for Kub...

# 安装 AWS Load Balancer Controller 的最新版本,--set指定Values
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=eks-lexing \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller

# 安装 AWS Load Balancer Controller 的指定版本,--version 1.5.4
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=eks-lexing \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller
--version 1.5.4

# 查看全部命名空间下已经安装的包
$ helm list --all-namespaces
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
aws-load-balancer-controller kube-system 2 2023-07-04 17:31:37.839466 +0800 CST deployed aws-load-balancer-controller-1.5.4 v2.5.3

# 查看指定命名空间下已经安装的包
$ helm list -n kube-system
# 关键字过滤
$ helm list -n kube-system --filter load-balancer

# 获取Values,用户指定的,即安装或升级时通过--set等方式设置的
$ helm get values aws-load-balancer-controller -n kube-system
USER-SUPPLIED VALUES:
clusterName: eks-lexing
serviceAccount:
create: false
name: aws-load-balancer-controller

# 获取Values,全部Values,都可以进行替换
$ helm get values aws-load-balancer-controller -n kube-system --all

# 升级安装,升级时只需要指定要改变的部分
$ helm upgrade aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=eks-lexing \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller

# 查看历史安装记录
$ helm history -n kube-system aws-load-balancer-controller
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Tue Jul 4 17:26:05 2023 superseded aws-load-balancer-controller-1.5.4 v2.5.3 Install complete
2 Tue Jul 4 17:31:37 2023 deployed aws-load-balancer-controller-1.5.4 v2.5.3 Upgrade complete

# 回滚到指定修订号,修订号通过 helm history 查看
$ helm rollback -n kube-system aws-load-balancer-controller 1

# 显示已命名发布的状态
$ helm status -n kube-system aws-load-balancer-controller
NAME: aws-load-balancer-controller
LAST DEPLOYED: Tue Jul 4 17:31:37 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!

# 卸载
$ helm uninstall aws-load-balancer-controller -n kube-system

# 删除仓库
$ helm repo remove eks

# 查看helm客户端环境信息
$ helm env
HELM_BIN="helm"
HELM_BURST_LIMIT="100"
HELM_CACHE_HOME="/Users/hanqf/Library/Caches/helm"
HELM_CONFIG_HOME="/Users/hanqf/Library/Preferences/helm"
HELM_DATA_HOME="/Users/hanqf/Library/helm"
HELM_DEBUG="false"
HELM_KUBEAPISERVER=""
HELM_KUBEASGROUPS=""
HELM_KUBEASUSER=""
HELM_KUBECAFILE=""
HELM_KUBECONTEXT=""
HELM_KUBEINSECURE_SKIP_TLS_VERIFY="false"
HELM_KUBETLS_SERVER_NAME=""
HELM_KUBETOKEN=""
HELM_MAX_HISTORY="10"
HELM_NAMESPACE="test"
HELM_PLUGINS="/Users/hanqf/Library/helm/plugins"
HELM_REGISTRY_CONFIG="/Users/hanqf/Library/Preferences/helm/registry/config.json"
HELM_REPOSITORY_CACHE="/Users/hanqf/Library/Caches/helm/repository"
HELM_REPOSITORY_CONFIG="/Users/hanqf/Library/Preferences/helm/repositories.yaml"

# 展示指定chart的全部信息 (values.yaml, Chart.yaml, README)
$ helm show all eks/aws-load-balancer-controller
# 只展示chart.yaml
$ helm show chart eks/aws-load-balancer-controller
# 只展示values.yaml
$ helm show values eks/aws-load-balancer-controller


#下载指定的包,这里会下载 aws-load-balancer-controller-1.5.4.tgz
$ helm pull eks/aws-load-balancer-controller
# 下载并解压到指定目录
$ helm pull eks/aws-load-balancer-controller --untar --untardir ./

自定义 Chart 部署应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建一个chart
$ helm create mychart
Creating mychart

$ ls
mychart

$ exa -T mychart
mychart
├── Chart.yaml
├── charts
├── templates
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
文件 含义
charts 一个普通的空文件,一般也不会写入内容
Chart.yaml 当前 chart 属性的配置信息
templates 自己定义的 yaml 文件存于此
values.yaml 定义 yaml 文件的全局配置
  • Chart.yaml: 包含Chart的元数据和依赖项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
apiVersion: chart API 版本 (必需)  #必须有
name: chart名称 (必需) # 必须有
version: 指定 chart 版本(必需),打包时的版本号 # 必须有

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: 按名称输入的批注列表 (可选).

示例:

1
2
3
4
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
version: 0.1.0
  • values.yaml: 包含应用程序的默认配置值,如下示例:

1
2
3
image:
repository: nginx
tag: '1.19.8'
  • templates: 模板文件,各种k8s资源yaml,在模板文件中可以通过 .Values对象访问到 values.yaml里的配置
    示例:我们可以依据需要创建各种k8s资源的yaml文件,这里为了演示方便,删除templates下全部文件,然后创建deployment.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 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

  • 安装自定义Chart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ helm install mychart mychart
NAME: mychart
LAST DEPLOYED: Mon Jul 10 16:36:13 2023
NAMESPACE: test
STATUS: deployed
REVISION: 1
TEST SUITE: None

$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mychart test 1 2023-07-10 16:36:13.707877 +0800 CST deployed mychart-0.1.0

$ k get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-helm-nginx 1/1 1 1 94s

$ k describe deploy nginx-helm-nginx | grep Image
Image: nginx:1.19.8
  • 升级Chart
    这里修改 values.yaml 中镜像的版本

1
2
3
image:
repository: nginx
tag: '1.20.2'
1
2
3
4
5
6
7
8
9
10
11
$ upgrade mychart mychart
Release "mychart" has been upgraded. Happy Helming!
NAME: mychart
LAST DEPLOYED: Mon Jul 10 16:46:03 2023
NAMESPACE: test
STATUS: deployed
REVISION: 2
TEST SUITE: None

$ k describe deploy nginx-helm-nginx | grep Image
Image: nginx:1.20.2

发布Chart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装helm-S3插件
$ helm plugin install https://github.com/hypnoglow/helm-s3.git
Downloading and installing helm-s3 v0.14.0 ...
Checksum is valid.
Installed plugin: s3

# 指定操作s3的profile,因为helm不支持指定profile,所以这里可以使用环境变量的方式
$ export AWS_PROFILE=eks-us-west-2
# 初始化 S3 目录(假设名为 lexing-helm-charts 的S3存储桶已经存在)
$ helm s3 init s3://lexing-helm-charts/charts/
Initialized empty repository at s3://lexing-helm-charts/charts/
# 添加仓库到本地
$ helm repo add lexing-helm-charts s3://lexing-helm-charts/charts/
# 查看lexing-helm-charts repo是否已经添加到本地
$ helm repo list
NAME URL
aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
eks https://aws.github.io/eks-charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
lexing-helm-charts s3://lexing-helm-charts/charts/
  • 打包Chart

1
2
$ helm package mychart
Successfully packaged chart and saved it to: /Users/hanqf/Desktop/k8sDir/helm-chart/mychart-0.1.0.tgz
  • chart 上传到 S3

1
2
3
4
5
# 指定操作s3的profile,因为helm不支持指定profile,所以这里可以使用环境变量的方式
$ export AWS_PROFILE=eks-us-west-2
# 推送my-nginx helm chart 到 S3
$ helm s3 push mychart-0.1.0.tgz lexing-helm-charts --force
Successfully uploaded the chart to the repository.
  • 搜索chart并安装

1
2
3
4
5
6
7
8
9
10
# 搜索
$ helm search repo mychart
NAME CHART VERSION APP VERSION DESCRIPTION
lexing-helm-charts/mychart 0.1.0 A Helm chart for Kubernetes

# 从Helm s3 repo 安装my-nginx chart到EKS/ Kubernetes集群
$ helm install mychart lexing-helm-charts/mychart

# 升级安装
$ helm upgrade mychart lexing-helm-charts/mychart --set image.tag=1.20.2

Helm的执行安装顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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