helm 是什么

Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。

chart是什么

Helm使用的包格式称为 chart。 chart就是一个描述Kubernetes相关资源的文件集合。单个chart可以用来部署一些简单的, 类似于memcache pod,或者某些复杂的HTTP服务器以及web全栈应用、数据库、缓存等等。

Chart是作为特定目录布局的文件被创建的。它们可以打包到要部署的版本存档中。

如果你想下载和查看一个发布的chart,但不安装它,你可以用这个命令: helm pull chartrepo/chartname。

参考:chart的基本结构及使用

helm能做什么

在 Kubernetes中部署一个可以使用的应用,需要涉及到很多的 Kubernetes 资源的共同协作。比如你安装一个 WordPress 博客,用到了一些 Kubernetes (下面全部简称k8s)的一些资源对象,包括 Deployment 用于部署应用、Service 提供服务发现、Secret 配置 WordPress 的用户名和密码,可能还需要 pv 和 pvc 来提供持久化服务。并且 WordPress 数据是存储在mariadb里面的,所以需要 mariadb 启动就绪后才能启动 WordPress。这些 k8s 资源过于分散,不方便进行管理,直接通过 kubectl 来管理一个应用,你会发现这十分蛋疼。
所以总结以上,我们在 k8s 中部署一个应用,通常面临以下几个问题:

如何统一管理、配置和更新这些分散的 k8s 的应用资源文件
如何分发和复用一套应用模板
如何将应用的一系列资源当做一个软件包管理

helm3安装

#1.下载helm3
curl -SLO https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz

#2. 打开包装
tar xzvf helm-v3.2.3-linux-amd64.tar.gz

#3.helm在解压后的目录中找到二进制文件,然后将其移至所需的目标位置
mv linux-amd64/helm /usr/bin/

4.在客户端运行:并有正确结果
[root@123 ~]# helm version
version.BuildInfo{Version:"v3.2.3", GitCommit:"8f832046e258e2cb800894579b1b3b50c2d83492", GitTreeState:"clean", GoVersion:"go1.13.12"}

参考:部署利器Helm

helm如何使用

添加存储库

微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库强烈推荐,基本上官网有的chart这里都有。
阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,国内有点不好使

  1. 配置存储库
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
  1. 查看存储库
helm repo list
helm search repo stable
  1. 删除存储库
helm repo remove aliyu

参考:Helm部署安装

使用Helm

helm的安装本地chart

指定本地chart目录:helm install .
指定本地chart压缩包:helm install nginx-1.2.3.tgz

[root@123 /mnt]# ll
total 8752824
drwxr-xr-x.  3 root root       4096 Sep 24 11:40 test-fe
-rw-r--r--.  1 root root       5575 Sep 24 16:32 test-fe-0.0.1.tgz

[root@123 test-fe]# ll
total 20
-rw-r--r--. 1 root root  257 Sep 24 11:40 Chart.yaml
-rw-rw-r--. 1 root root   33 Sep 22 17:50 OWNERS
-rw-rw-r--. 1 root root  261 Sep 22 17:50 README.md
drwxr-xr-x. 2 root root 4096 Sep 24 11:40 templates
-rw-r--r--. 1 root root 2520 Sep 24 11:40 values.yaml
# 进行安装
[root@123 test-fe]# helm install test-fe .

helm安装仓库chart

使用默认的远程仓库:helm install stable/nginx
使用指定的仓库:helm install localhost:8879/nginx-1.2.3.tgz

查找相关chart, 如:查找redis相关chart helm search repo redis

$ helm search repo redis
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION
apphub/prometheus-redis-exporter        3.1.0           1.0.4           Prometheus exporter for Redis metrics
apphub/redis                            9.3.1           5.0.5           Open source, advanced key-value store. It is of...
apphub/redis-cache                      0.4.1           4.0.12-alpine   A pure in-memory redis cache, using statefulset...
apphub/redis-ha                         3.8.0           5.0.5           Highly available Kubernetes implementation of R...
apphub/redis-operator                   1.0.0                           Redis Operator provides high availability redis...
apphub/redispapa                        0.0.1           0.0.1           利用redis的info信息对redis的使用情况进行监控的一...
bitnami/redis                           10.7.1          6.0.5           Open source, advanced key-value store. It is of...
bitnami/redis-cluster                   2.3.1           6.0.5           Open source, advanced key-value store. It is of...
stable/prometheus-redis-exporter        3.4.1           1.3.4           Prometheus exporter for Redis metrics
stable/redis                            10.5.7          5.0.7           DEPRECATED Open source, advanced key-value stor...
stable/redis-ha                         4.4.4           5.0.6           Highly available Kubernetes implementation of R...
apphub/codis                            3.2             3.2             A Helm chart for Codis

选定 Chart,根据 Chart 的官方文档
我们选定 stable/redis (opens new window)这个 chart。

跟踪官方文档,设置相关参数,存储为 values-production.yaml

$ helm install redis bitami/redis --values values-production.yaml

如何部署完成,可以查看安装某个 Release 时的 values

$ helm get values redis

如果需要升级,使用 helm upgrade

$ helm upgrade redis bitnami/redis --values values-production.yaml

验证状态

kubectl get po | grep redis

kubectl get service| grep redis

helm 指定namespace

通过在命令后添加 -n xxxx , 来配置namespaces

$ helm install redis .  -n test-namespace

helm不同版本

helm2, helm3不同
一、新的功能

1.版本以新格式存储
2.没有群集内(tiller)组件
3.Helm 3包括对新版Helm图表的支持(图表v2)
4.Helm 3还支持库图表-图表主要用作其他图表的资源。
5.用于在OCI注册表中存储Helm图表的实验支持(例如Docker Distribution)可以进行试。
6.现在在升级Kubernetes资源时将应用3向战略合并补丁。
7.现在可以根据JSON模式验证图表提供的值
8.为了使Helm更安全,可用和健壮,已进行了许多小的改进。

二、 Helm3的内部实现已从 Helm2发生了很大变化,使其与 Helm2不兼容

该版本主要变化如下
1. 最明显的变化是 Tiller的删除
2. Release 不再是全局资源,而是存储在各自命名空间内
3. Values 支持 JSON Schema校验器,自动检查所有输入的变量格式
4. 移除了用于本地临时搭建 Chart Repository 的 helm serve 命令。
5. helm install 不再默认生成一个 Release 的名称,除非指定了 --generate-name。
6. Helm CLI 个别更名,但旧的命令当前仍能使用。
	1. helm delete更名为 helm uninstall
	2. helm inspect更名为 helm show
	3. helm fetch更名为 helm pull

遇见的错误

#这个可能因为环境问题缺少某些东西,换个k8s环境好了,
root@123 ~]# helm install nginx-ingress nginx-ingress-139380128.tgz
Error: unable to build kubernetes objects from release manifest: unable to recognize "": no matches for kind "ServiceMonitor" in version "monitoring.coreos.com/v1"


[root@123 nginx-ingress]# helm install nginx-ingress .
Error: rendered manifests contain a resource that already exists. Unable to continue with install: ClusterRole "nginx-ingress" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "nginx-ingress"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "default"

这个是是因为没有指定namespace,默认使用的defalut,在default中创建成功后,在没有删除的情况下,再次执行 helm install nginx-ingress . -n xxxx, 来指定名称空间,仍然会 报以上错误
此时需要进行删除
如:helm uninstall nginx-ingress

然后再重新安装,并指定namespace
helm install nginx-ingress . -n xxxxx

错误:helm error kubernetes cluster unreachable

默认情况下,会通过读取 KUBECONFIG 变量来获取apiServer地址,默认地址为 ~/.kube/config
所以,这里对config进行配置, config地址为/data/.kube/config

#配置环境变量
vi  ~/.bashrc
export KUBECONFIG=/data/.kube/config

#使配置生效
source ~/.bashrc

参考:K3s: error: kubernetes cluster unreachable

ingress如何配置转发

创建Ingress.yaml,并在其中配置对应的路由地址,并执行以下命令使其生效
如example-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: hello-world.info
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 8080

创建ingress路由

kubectl apply -f Ingress.yaml
  • 注意:导出nginx-ingress的chart包时,此路由ingress.yaml,可能并未导出,在Helm安装nginx-ingress时,并无路由信息。需要自己找到,并自行应用,
  • 参考:在 Minikube 环境中使用 NGINX Ingress 控制器配置 Ingress

配置ingress 并启动后 default backend - 404

在后端没有配置对应的路由,即Ingress.yaml少配置了转发地址或配置了对应的地址,然而改配置并未生效.