跳转至

Kubernetes集群包管理解决方案及应用商店 Helm&Kubeapps

为什么使用 helm ?

为什么使用 helm

当今的软件开发,随着云原生技术的普及,我们的工程应用进行微服务化和容器化的现象也变得越来越普遍。而Kubernetes几乎已经成了云原生服务编排绕不开的标准和技术。

假设我们需要在 K8s 中简单部署一个 nginx,必要步骤如下:

1、创建或者编写deployment模板
# kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deployment.yaml
2、启动 nginx 的 pod
# kubectl apply -f deployment.yaml
3、检查 pod 服务
# kubectl get pod
4、创建 service
# kubectl expose deployment  nginx --port=8099 --target-port=80 --type=NodePort --dry-run=client -o yaml > service.yaml
5、启动 service 服务
# kubectl apply -f service.yaml
6、检查 service 端口
# kubectl get svc
7、访问 nginx 服务
# kubectl get svc

实际生产中,微服务项目可能有十几个模块,若还需要进行安全访问和控制,那么需要创建诸如Role、ServiceAccount等资源。部署和版本升级时也往往需要修改或添加配置文件中的一些参数(例如:服务占用的CPU、内存、副本数、端口等),维护大量的yaml文件极为不便,所以,我们需要将这些YAML文件作为一个整体管理,并高效复用。

  • 在Linux操作系统软件部署中,我们可以使用批量管理工具完成软件的批量管理等,例如yum、dnf等;
  • 在容器应用中Docker使用Dockerfile文件解决了容器镜像制作难题;
  • 在kubernetes应用中,通过YAML格式文件解决容器编排部署难题,例如可以通过YAML格式的资源清单文件,非常方便部署不同控制器类型的应用;但是如何维护大量的,系统性的YAML文件,需要我们拥有更好的工具,不能简单使用YAML资源清单托管服务器就可以解决的,

那么在 CNCF 的体系中使用 Helm 可以简化我们部署安装过程

什么是 helm ?

helm 官方 https://helm.sh/

官方的定义是:Helm 是一个为 K8s 进行包管理的工具。Helm 将 yaml 作为一个整体管理并实现了这些 yaml 的高效复用,就像 Linux 中的 yum 或 apt-get,它使我们能够在 K8s 中方便快捷的安装、管理、卸载 K8s应用。

  • Helm(舵柄; 舵轮)是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等。
  • helm一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。
  • 通过helm可以很方便的将之前打包好的yaml文件部署到kubernetes上。
  • 对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。
  • 对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。
  • 除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。
  • Helm 社区已经维护了一个官方 Helm Hub,我们可以直接使用已经做好的 Helm Chart,部署和管理比较复杂的应用程序
  • 早期的hub.helm.dev转移到了https://artifacthub.io/。

helm 作用及核心概念

Helm基于go模板语言,用户只要提供规定的目录结构和模板文件。在真正部署时Helm模板引擎便可以将其渲染成真正的K8s资源配置文件,并按照正确的顺序将它们部署到节点上。

Helm 定义了一套 Chart 格式来描述一个应用。打个比方,一个安卓程序打包成 APK 格式,就可以安装到任意一台运行安卓系统的手机上,如果我们把 kubernetes 集群比做安卓系统,kubernetes 集群内应用比做安卓程序,那么 Chart 就可以比做 APK。这就意味着,kubernetes 集群应用只要打包成 Chart,就可以通过 Helm 部署到任意一个 kubernetes 集群中。

Helm中有三个重要概念,分别为Chart、Repository和Release。

  • Chart代表中Helm包。它包含在K8s集群内部运行应用程序,工具或服务所需的所有资源定义,为所有项目资源清单yaml文件的集合,采用TAR格式,可以类比成yum中的RPM。

  • Repository就是用来存放和共享Chart的地方,可以类比成YUM仓库。

  • Release是运行在K8s集群中的Chart的实例,一个Chart可以在同一个集群中安装多次。Chart就像流水线中初始化好的模板,Release就是这个“模板”所生产出来的各个产品。

Helm作为K8s的包管理软件,每次安装Charts 到K8s集群时,都会创建一个新的 release。你可以在Helm 的Repository中寻找需要的Chart。Helm对于部署过程的优化的点在于简化了原先完成配置文件编写后还需使用一串kubectl命令进行的操作、统一管理了部署时的可配置项以及方便了部署完成后的升级和维护。

helm 架构

Helm 客户端使用 REST+JSON 的方式与 K8s 中的 apiserver 进行交互,进而管理 deployment、service 等资源,并且客户端本身并不需要数据库,它会把相关的信息储存在 K8s 集群内的 Secrets 中。

helm 相关使用

helm 部署

二进制安装 github.com/helm/helm

1、下载并解压安装包
[root@k8smaster002~]# wget https://get.helm.sh/helm-v3.14.0-linux-amd64.tar.gz && tar -xf helm-v3.14.0-linux-amd64.tar.gz
2、移动至 /bin/
[root@k8smaster002~]# mv linux-amd64/helm /bin/helm
3、查看版本
[root@k8smaster002~]# helm version
version.BuildInfo{Version:"v3.14.0", GitCommit:"3fc9f4b2638e76f26739cd77c7017139be81d0ea", GitTreeState:"clean", GoVersion:"go1.21.5"}

helm 基础使用

仓库的增删改查

1. 添加及删除仓库

1、添加新的仓库地址
# 微软源
[root@k8s-master01 ~]# helm repo add stable http://mirror.azure.cn/kubernetes/charts/

# bitnami源
[root@k8s-master01 ~]# helm repo add bitnami https://charts.bitnami.com/bitnami

# prometheus源
[root@k8s-master01 ~]# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
2、查看仓库
[root@k8s-master01 ~]# helm repo list
NAME                    URL                                               
prometheus-community    https://prometheus-community.github.io/helm-charts
bitnami                 https://charts.bitnami.com/bitnami                
stable                  http://mirror.azure.cn/kubernetes/charts/ 
3、更新仓库
[root@k8s-master01 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "prometheus-community" chart repository
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "bitnami" chart repository
Update Complete. Happy Helming!
4、删除仓库
[root@k8s-master01 ~]# helm repo remove stable
"stable" has been removed from your repositories
[root@k8s-master01 ~]# helm repo list
NAME                    URL                                               
prometheus-community    https://prometheus-community.github.io/helm-charts
bitnami                 https://charts.bitnami.com/bitnami      

查看 charts

1. 使用helm search repo 关键字可以查看相关 charts

1、查看仓库
[root@k8s-master01 ~]# helm search repo stable
NAME                                    CHART VERSION   APP VERSION             DESCRIPTION                                       
stable/acs-engine-autoscaler            2.2.2           2.1.1                   DEPRECATED Scales worker nodes within agent pools 
stable/aerospike                        0.3.5           v4.5.0.5                DEPRECATED A Helm chart for Aerospike in Kubern...
stable/airflow                          7.13.3          1.10.12                 DEPRECATED - please use: https://github.com/air...
stable/ambassador                       5.3.2           0.86.1                  DEPRECATED A Helm chart for Datawire Ambassador   
stable/anchore-engine                   1.7.0           0.7.3                   Anchore container analysis and policy evaluatio...
stable/apm-server                       2.1.7           7.0.0                   DEPRECATED The server receives data from the El...
stable/ark                              4.2.2           0.10.2                  DEPRECATED A Helm chart for ark                   
stable/artifactory                      7.3.2           6.1.0                   DEPRECATED Universal Repository Manager support...
stable/artifactory-ha                   0.4.2           6.2.0                   DEPRECATED Universal Repository Manager support...
2、查看 nginx
[root@k8s-master01 ~]# helm search repo nginx
NAME                                            CHART VERSION   APP VERSION     DESCRIPTION                                       
bitnami/nginx                                   16.0.2          1.25.4          NGINX Open Source is a web server that can be a...
bitnami/nginx-ingress-controller                11.0.2          1.10.0          NGINX Ingress Controller is an Ingress controll...
bitnami/nginx-intel                             2.1.15          0.4.9           DEPRECATED NGINX Open Source for Intel is a lig...
prometheus-community/prometheus-nginx-exporter  0.2.1           0.11.0          A Helm chart for the Prometheus NGINX Exporter    
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  
stable/gcloud-endpoints                         0.1.2           1               DEPRECATED Develop, deploy, protect and monitor...