使用helm来管理k8s应用

K8sKubernetes

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吧,配置详情如下:

服务器名称服务器IPCPU内存k8s版本docker版本
minikube10.173.100.618C32Gv1.23.10v26.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

picture.image 如果要查看指定的chart,可以使用以下命令:

helm search repo bitnami/nginx(chart名称关键字)

注意:我们可以把chart理解成一个应用,以上命令就是用来查看仓库里可以安装哪些应用。

4.2 helm chart相关

(1)下载指定chart 我们先看一下nginx相关的chart

helm search repo bitnami/nginx

picture.image 拉取nginx的chart到本地,命令如下:

helm pull bitnami/nginx

下载成功之后可以看到本地有一个nginx-18.3.1.tgz包。

(2)安装chart

helm install bitnami/nginx --generate-name

picture.image 安装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

picture.image 可以看到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 .

注意:不要少了最后的“.”

picture.image 安装完成后会打印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

picture.image 可以看到请求正常。

6.总结

通过以上实验,我们可以看到通过helm来管理k8s资源和配置变量,确实可以方面我们对应用的管理和配置参数的管理,如果熟悉k8s声明式文件的话,helm chart的资源模板文件和变量文件也并不难理解,所以还是比较推荐将helm应用到CI/CD中,方便对部署到k8s中的应用的管理。

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
高性能存储虚拟化方案 NVMe over Fabric 在火山引擎的演进
在云计算中,虚拟化存储扮演着重要角色,其中 iSCSI 协议在业界开放、流行多年。近年来,拥有更优性能的 NVMe over Fabrics 协议也得到了发展。本次分享介绍了 NVMe over Fabrics 在云原生和虚拟化方向的演进工作和成果。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论