k8s Helm3部署和使用

一、Helm 介绍

没有使用Helm之前,在Kubernetes部署应用,我们要依次部署deployment、service等,步骤比较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂。

helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。

Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文件(deployment.yaml、service.yaml)。然后kubectl自动调用K8S资源部署。

Helm是官方提供类似于YUM的包管理,是部署环境的流程封装,Helm有三个重要的概念:chart、release和Repository

  • chart是创建一个应用的信息集合,包括各种Kubernetes对象的配置模板、参数定义、依赖关系、文档说明等。可以将chart想象成apt、yum中的软件安装包。
  • release是chart的运行实例,代表一个正在运行的应用。当chart被安装到Kubernetes集群,就生成一个release。chart能多次安装到同一个集群,每次安装都是一个release【根据chart赋值不同,完全可以部署出多个release出来】。
  • Repository用于发布和存储 Chart 的存储库。

Helm包含两个组件:Helm客户端和Tiller服务端,如下图所示:

图片1

Helm 客户端 负责 chart 和 release 的创建和管理以及和 Tiller 的交互。
Tiller 服务端 运行在 Kubernetes 集群中,它会处理Helm客户端的请求,与 Kubernetes API Server 交互(在heml3中已弃用 Tiller)。
KubeAPI 将数据、资源得生成写入到 etcd ,被 kubelet 接受并创建。

二、Helm 部署

Helm由客户端命令helm工具和服务端tiller组成。

部署前可以前往help官网查看 Helm支持的 Kubernetes 版本 (不推荐将Helm用于比编译它所依赖的版本更高的Kubernetes版本,因为Helm并没有做出任何向前兼容的保证)。

2.1 安装 helm

1
2
3
[root@czz ~]# wget https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz
[root@czz ~]# tar xf helm-v3.8.1-linux-amd64.tar.gz
[root@czz ~]# mv linux-amd64/helm /usr/local/bin/helm

或使用脚本安装

1
2
3
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

2.2 验证 helm

1
2
[root@czz ~]# helm version
version.BuildInfo{Version:"v3.8.1", GitCommit:"5cb9af4b1b271d11d7a97a71df3ac337dd94ad37", GitTreeState:"clean", GoVersion:"go1.17.5"}

三、使用 helm 部署应用

3.1 使用 helm 源部署

3.1 添加 chart 源

准备好 helm 后,需要添加 helm 源数据仓库。有以下几个常见的源库

https://kubernetes-charts.storage.googleapis.com/ helm官网 chart 库,稳定
https://apphub.aliyuncs.com 阿里云chart 库,速度最快

1
2
[root@czz ~]# helm repo add aliyun https://apphub.aliyuncs.com
"aliyun" has been added to your repositories

3.2 安装一个 Helm 应用

查看想要安装的服务

1
2
3
4
5
6
7
[root@czz ~]# helm search repo nginx
NAME CHART VERSION APP VERSION DESCRIPTION
aliyun/nginx 5.1.5 1.16.1 Chart for the nginx server
aliyun/nginx-ingress 1.30.3 0.28.0 An nginx Ingress controller that uses ConfigMap...
aliyun/nginx-ingress-controller 5.3.4 0.29.0 Chart for the nginx Ingress controller
aliyun/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego
aliyun/nginx-php 1.0.0 nginx-1.10.3_php-7.0 Chart for the nginx php server

使用helm安装服务

1
2
3
4
5
6
7
8
9
[root@czz ~]# helm install nginx aliyun/nginx

[root@czz ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-99fcdd97b-g5xxz 1/1 Running 0 15m

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.10.0.1 <none> 443/TCP 3d16h
service/nginx LoadBalancer 10.10.18.28 <pending> 80:30418/TCP,443:32580/TCP 15m

使用 helm status 跟踪发布状态或重新读取配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@czz ~]# helm status nginx
NAME: nginx
LAST DEPLOYED: Tue Mar 22 10:47:59 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Get the NGINX URL:

NOTE: It may take a few minutes for the LoadBalancer IP to be available.
Watch the status with: 'kubectl get svc --namespace default -w nginx'

export SERVICE_IP=$(kubectl get svc --namespace default nginx --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{end }}")
echo "NGINX URL: http://$SERVICE_IP/"

3.3 升级一个 helm 应用

1
2
3
4
[root@czz ~]# helm upgrade nginx aliyun/nginx

也可以指定命名空间和它的taz包
[root@czz ~]# helm upgrade --install --force hello-world ./hello.tgz --namespace default

3.4 回滚一个 Helm 应用

1
2
向上归滚一个版本
[root@czz ~]# helm rollback nginx 1

3.5 卸载一个 Helm 应用

1
[root@czz ~]# helm uninstall nginx -ndefault

3.2 使用 helm 构建应用

3.2.1 建立一个 helm charts

1
2
3
4
[root@czz ~]# helm create hello-world

[root@czz ~]# ls hello-world/
charts Chart.yaml templates values.yaml
  • Chart.yaml 用于描述这个Chart的相关信息,包括名字、描述信息以及版本等。
    仅仅是一些简单的文本描述
  • values.yaml 用于存储 templates 目录中模板文件中用到变量的值。
  • NOTES.txt 用于介绍 Chart 部署后的一些信息,例如:如何使用这个 Chart、列出缺省的设置等。
  • Templates 目录下是 YAML 文件的模板,该模板文件遵循 Go template 语法。

Templates 目录下 YAML 文件模板的值默认都是在 values.yaml 里定义的,比如在 deployment.yaml 中定义的容器镜像。

1
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"

其中的 .Values.image.repository 的值就是在 values.yaml 里定义的 nginx,.Values.image.tag 的值就是 stable。
以上两个变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。实际上都是静态文本,只在是执行的时候才被解析.

3.2.2 构建一个 helm 应用

打开 Chart.yaml,可以看到内容如下,配置名称和版本

1
2
3
4
5
6
7
[root@czz ~]#  cat hello-world/Chart.yaml |grep -Ev "^#|^$"
apiVersion: v2
name: hello-world
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"

编辑 values.yaml,它默认会在 Kubernetes 部署一个 Nginx。下面是 mychart 应用的 values.yaml 文件的内容:

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
[root@czz ~]# cat hello-world/values.yaml
# Default values for hello-world.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
repository: nginx
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
# Specifies whether a service account should be created
create: true
# 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: {}

podSecurityContext: {}
# fsGroup: 2000

securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000

service:
type: ClusterIP
port: 80

ingress:
enabled: false
className: ""
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local

resources: {}
# 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

autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}

3.2.3 检查模块配置

1
[root@czz ~]# helm lint hello-world/

3.2.4 部署 helm 本地应用

1
[root@czz ~]# helm install hello ./hello-world
-------------本文结束感谢您的阅读-------------