1. Helm 入门

1.1 什么是Helm

K8S 上的应用对象,比如 deployment、service、pod 等,都是由特定的资源描述组成,都保存在各自文件中或者集中写到一个配置文件,然后通过 kubectl apply -f 部署。如果应用只有 1 个或者几个这样的服务组成,这种部署方式足够了。

但是对于一个复杂的应用,会有很多类似的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个、几十个,如果有更新或回滚应用的需求,可能需要修改和维护所涉及的大量的资源文件,这样效率就很低下,Helm 就是为了解决这样问题而产生的。

Helm 是一个 K8S 的包管理工具,类似于 yum/apt 等,可以很方便的将打包好的 yaml 文件部署到 K8S 上。Helm 有 3 个重要概念:

  1. helm:一个命令行客户端工具,注意用于 K8S 应用 chart 的创建、打包、发布和管理。
  2. chart:应用描述,一系列用于描述 K8S 资源相关文件的集合。
  3. release:基于 chart 的部署实体,一个 chart 被 helm 运行后会生成对应的 release,将在 K8S 中创建出真实运行的资源对象。

    1.2 Helm客户端

    1.2.1 部署Helm

    Helm 客户端下载地址:https://github.com/helm/helm/releases,安装命令如下:
    image.png
    1. tar zxvf helm-v3.2.1-linux-amd64.tar.gz
    2. mv linux-amd64/helm /usr/bin/

    1.2.2 配置国内Chart仓库

    添加存储库:
    # 添加微软库,这里阿里云库不是最新版,无法使用
    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm repo add aliyun https://apphub.aliyuncs.com
    helm repo add stable http://mirror.azure.cn/kubernetes/charts/
    helm repo update
    
    查看配置的存储库:
    helm repo list 
    helm search repo stable
    
    删除存储库:
    helm repo remove aliyun
    

    2. Helm基本使用

    2.1 使用chart部署应用

    这里以安装 nginx 为例。 ```shell

    1、查找nginx包

    [root@k8s-master01 ~]# 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
    bitnami/nginx 9.7.1 1.21.5 Chart for the nginx server
    bitnami/nginx-ingress-controller 9.1.2 1.1.1 Chart for the nginx Ingress controller
    stable/nginx-ingress 1.41.3 v0.34.1 DEPRECATED! An nginx Ingress controller that us… stable/nginx-ldapauth-proxy 0.1.6 1.13.5 DEPRECATED - nginx proxy with ldapauth
    stable/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego
    bitnami/kong 5.0.1 2.7.0 Kong is a scalable, open source API layer (aka … stable/gcloud-endpoints 0.1.2 1 DEPRECATED Develop, deploy, protect and monitor…

2、将nginx包从创库拉到当前目录

[root@k8s-master01 ~]# helm pull aliyun/nginx —untar

3、查看nginx目录

[root@k8s-master01 ~]# tree nginx/ nginx/ ├── Chart.yaml ├── ci │ └── values-with-ingress-metrics-and-serverblock.yaml ├── README.md ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── ingress.yaml │ ├── NOTES.txt │ ├── server-block-configmap.yaml │ ├── servicemonitor.yaml │ ├── svc.yaml │ └── tls-secrets.yaml ├── values.schema.json └── values.yaml

4、安装nginx到集群

type=NodePort表示将service对外暴露端口的方式改为NodePort

persistence.enabled=false表示将不启用持久化存储卷

helm install my-nginx aliyun/nginx —set service.type=NodePort —set persistence.enabled=false

5、查看是否安装成功

[root@k8s-master01 ~]# kubectl get all NAME READY STATUS RESTARTS AGE pod/my-nginx-77d8457bcf-xd4wh 1/1 Running 0 9m

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 443/TCP 2d23h service/my-nginx NodePort 10.111.160.245 80:30454/TCP,443:30816/TCP 9m

NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-nginx 1/1 1 1 9m

NAME DESIRED CURRENT READY AGE replicaset.apps/my-nginx-77d8457bcf 1 1 1 9m

浏览器访问 nginx:[http://192.168.58.21:30454/](http://192.168.58.22:30454/)、[http://192.168.58.22:30454/](http://192.168.58.22:30454/)、[http://192.168.58.23:30454/](http://192.168.58.22:30454/)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/446852/1642055467792-0930feeb-1361-4873-b5df-80ae5539a7fd.png#clientId=u9ee058a0-6d3e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=208&id=u3266305a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=416&originWidth=1719&originalType=binary&ratio=1&rotation=0&showTitle=false&size=71540&status=done&style=none&taskId=ue7cc9d6c-aceb-4eb9-a5f6-b42c573a282&title=&width=859.5)<br />其他命令:
```shell
# 查看详细信息
helm status tomcat

# 查看发布状态
helm list

# 删除chart
helm delete tomcat

2.2 安装前自定义chart配置选项

自定义选项是因为并不是所有的 chart 都能按照默认配置运行成功,可能会需要一些环境
依赖,例如 PV。 所以我们需要自定义 chart 配置选项,安装过程中有两种方法可以传递配置数据:

  • —values(或-f):指定带有覆盖的 YAML 文件。这可以多次指定,最右边的文件优先
  • —set:在命令行上指定替代。如果两者都用,—set 优先级高

1、将修改的变量写到 mysqlconfig.yaml 中。

persistence:
  enabled: true
  storageClass: "managed-nfs-storage"
  accessMode: ReadWriteOnce
  size: 8Gi
mysqlUser: "k8s"
mysqlPassword: "123456"
mysqlDatabase: "k8s"

2、安装 mysql 并指定配置文件。


helm install db -f mysqlconfig.yaml stable/mysql

# 查看pod
kubectl get pods