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仓库,国内有点不好使
- 配置存储库
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
- 查看存储库
helm repo list
helm search repo stable
- 删除存储库
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少配置了转发地址或配置了对应的地址,然而改配置并未生效.