0.前言
我们知道通常部署一个应用到k8s集群中是比较麻烦的,一般情况下至少需要一个deployment,一个service以及一堆的配置,那么有没有什么办法可以使用一个工具同时帮我们生成不同类型的资源,并且还能帮我们管理应用的配置呢?答案是肯定的,就是我们今天要讲的helm。
1.helm简介
Helm 是一个源自云原生计算基金会(CNCF)的开源项目(血统纯正),它于 2015 年在首届 KubeCon 上初次亮相,后来与 Kubernetes 一起迁移到 CNCF。Helm 是 Kubernetes 的软件包管理器,您可以完全基于对特定配置最重要的方面,通过变量覆盖将同一配置框架应用于多个实例,目前helm在实际使用中,用的最多的地方是CI/CD方面,用以帮助简化CI/CD流程,实践出真章,接下来我们就来实操一下,看下helm到底怎么用。
2.准备工作
在使用helm之前,我们需要一个k8s集群,这里我准备一个单节点的k8s集群,用来完成本次测试,由于只有一个节点,比较袖珍,我们就叫它minikube吧,配置详情如下:
服务器名称 | 服务器IP | CPU | 内存 | k8s版本 | docker版本 |
---|---|---|---|---|---|
minikube | 10.173.100.61 | 8C | 32G | v1.23.10 | v26.1.3 |
k8s节点信息如下:
kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master,worker 3h41m v1.23.10
可以看到我们的master节点也是worker节点。
3.部署helm
k8s集群准备好之后,就可以开始部署helm了,首先从官网上下载我们需要的版本,这里以helm-v3.16.4-linux-amd64.tar.gz为例,将其放到服务器指定目录下并解压:
cd /root/install/helm
tar xf helm-v3.16.4-linux-amd64.tar.gz
解压之后,会出现一个linux-amd64,检查下里面有哪些文件:
cd /root/install/helm
ll linux-amd64
-rwxr-xr-x 1 1001 docker 57176216 Dec 17 02:40 helm
-rw-r--r-- 1 1001 docker 11373 Dec 17 02:41 LICENSE
-rw-r--r-- 1 1001 docker 3483 Dec 17 02:41 README.md
其中helm是可执行文件,我们将其拷贝到/usr/local/bin/目录下:
cd /root/install/helm/linux-amd64
cp helm /usr/local/bin/
执行以下命令,试下安装是否正常:
helm version
version.BuildInfo{Version:"v3.9.0", GitCommit:"7ceeda6c585217a19a1131663d8cd1f7d641b2a7", GitTreeState:"clean", GoVersion:"go1.17.5"}
打印以上版本信息,说明helm安装完成。
4.helm常见命令
4.1 helm repo相关
(1)添加一个repo
helm repo add bitnami https://charts.bitnami.com/bitnami
这个是官方提供的一个helm repo
(2)查看repo列表
helm repo list
NAME URL
bitnami https://helm-charts.itboon.top/bitnami
(3)查看repo中的chart列表
helm search repo
如果要查看指定的chart,可以使用以下命令:
helm search repo bitnami/nginx(chart名称关键字)
注意:我们可以把chart理解成一个应用,以上命令就是用来查看仓库里可以安装哪些应用。
4.2 helm chart相关
(1)下载指定chart 我们先看一下nginx相关的chart
helm search repo bitnami/nginx
拉取nginx的chart到本地,命令如下:
helm pull bitnami/nginx
下载成功之后可以看到本地有一个nginx-18.3.1.tgz包。
(2)安装chart
helm install bitnami/nginx --generate-name
安装chart成功后,会显示以上chart相关信息。
(3)查看安装的chart列表
helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nginx-1737617281 default 1 2025-01-23 15:28:02.170856264 +0800 CST deployed nginx-18.3.1 1.27.3
可以看到我们之前的nginx chart已经安装完成了,之前说chart主要就是帮忙在k8s集群中部署deploy和service,我们就来验证下是否真的是这样。
kubectl get deploy,svc,pod
可以看到helm基于chart确实帮我们创建了deployment,service和pod等资源,但是我们看到了一个非常刺眼的字眼ImagePullBackOff,那一堵无形的墙让我们无法拉取我们想要的镜像,以至于helm无法正常运行nginx chart,既然不能用我们也只好将其卸载掉了。
(4)卸载安装的chart
helm uninstall nginx-1737617281
注意:这里只能根据realese name卸载chart
5.自行创建chart
上面我们可以看到官方提供的chart自带镜像多半是docker.io上的或者国外的,要在本地使用helm管理chart还得自力更生,下面我们就来创建一个带有nginx应用的chart。
(1)创建chart
创建本地chart命令如下:
mkdir /root/charts
cd /root/charts
helm create nginx-application
执行完之后会发现,本地生成了一个nginx-application,我们来看一下目录结构:
cd /root/charts
tree ./nginx-application
./nginx-application/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
其实根据名称我们大致就可以猜出来各个文件的作用,values.yaml中主要就是包含各种变脸,template目录下就是创建各种k8s资源声明文件的模板文件,会用到values.yaml中的参数。
(2) 修改chart模板文件
本次实验我们只需要创建service和deployment,所以只需要保留以下四个文件即可:
cd /root/charts
tree ./nginx-application/
./nginx-application/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml
2 directories, 4 files
首先我们来修改values.yaml:
cd /root/charts/nginx-application
vim values.yaml
deployment:
replicaCount: 1
name: nginx-deploy
image:
app: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx
version: stable
pullPolicy: IfNotPresent
service:
name: nginx-svc
type: NodePort
port: 80
targetPort: 80
nodePort: 32605
只需以上参数即可。
之后是deployment.yaml:
cd /root/charts/nginx-application/templates
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.deployment.name }}
labels:
app: nginx
spec:
replicas: {{ .Values.deployment.replicaCount }}
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: "{{ .Values.deployment.image.app }}:{{ .Values.deployment.image.version }}"
imagePullPolicy: {{ .Values.deployment.image.pullPolicy }}
将values.yaml中的参数放到模板文件的指定位置即可。
最后是service.yaml:
cd /root/charts/nginx-application/templates
vim service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.service.name }}
labels:
app: nginx
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.targetPort }}
nodePort: {{ .Values.service.nodePort }}
protocol: TCP
name: http
selector:
app: nginx
同样是将values.yaml中的参数放到模板文件的指定位置。
(3)安装chart
helm install nginx-chart .
注意:不要少了最后的“.”
安装完成后会打印chart信息,再来看下在k8s中生成的资源是否都正常。
kubectl get deploy,svc,pod
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 1/1 1 1 3m28s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 5h20m
service/nginx-svc NodePort 10.233.17.42 <none> 80:32605/TCP 3m28s
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-d99ccd75b-w2d9t 1/1 Running 0 3m28s
可以看到deployment和svc以及pod都被创建成功,还都正常运行中,看来想要丰衣足食还得自力更生啊。 (4)验证chart功能 我们来验证下nginx chart功能是否正常:
curl 10.233.17.42
可以看到请求正常。
6.总结
通过以上实验,我们可以看到通过helm来管理k8s资源和配置变量,确实可以方面我们对应用的管理和配置参数的管理,如果熟悉k8s声明式文件的话,helm chart的资源模板文件和变量文件也并不难理解,所以还是比较推荐将helm应用到CI/CD中,方便对部署到k8s中的应用的管理。