1. helm 简介

helm 类似 linux 下面的包管理器 apt-get/yum,能够快速的把 yaml 文件安装进 k8s,且能够方便解决不同环境的配置问题。

1.1 helm3 与 helm2

helm3 与 helm2 的主要区别在于:

  1. 移除 Tiller

    • helm3 移除了其服务器端组件,Tiller,现在完全没有代理。

    • Tiller 之前是一个运行在 Kubernetes 上的小型应用程序,它用于监听 Helm 命令并处理设置 Kubernetes 资源的实际工作。

    • helm3 使用与 kubectl 上下文相同的访问权限

    • 无需再使用 helm init 来初始化 Helm

    • Release Name 位于命名空间中

  2. 分布式仓库以及 Helm Hub

    • Helm 命令可以从远程仓库安装 Chart。类似 docker hub

    • helm3 可以添加多个远程仓库,从远程仓库进行安装

    • helm3 命令可以直接在 Helm Hub 中寻找 Chart

  3. JSON Schema 验证

    • 从 Helm 3 开始,chart 维护者可以为输入值定义 JSON Schema。这一功能的完善十分重要,因为迄今为止你可以在 values.yaml 中放入任何你所需的内容,但是安装的最终结果可能不正确或出现一些难以理解的错误消息。

    • Helm 3 默认添加了针对 Kubernetes 对象的 OpenAPI 验证,这意味着发送到 Kubernetes API 的请求将会被检查是否正确。

  4. helm3 相较与 helm2 命令行有些改变

2. helm3 安装

2.1 源码安装

  1. 下载 helm3 对应版本的源码包,地址为:https://github.com/helm/helm/releases

  2. 解压 tar 包。例如:tar -zxvf helm-v3.0.0-linux-amd64.tar.gz

  3. 找到文件夹中的 helm 二进制文件,将其拷贝到可执行目录中。例如:mv linux-amd64/helm /usr/local/bin/helm

2.2 脚本安装

  1. 下载安装脚本:curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

  2. 给脚本可执行权限:chmod 700 get_helm.sh

  3. 执行脚本:./get_helm.sh

2.3 helm 命令使用 tab 键补全

  1. 创建 helm 的配置文件 .helmrc

Copy to Clipboard
  1. 将 helm 的配置 加载到 bashrc 中

Copy to Clipboard
  1. 重新加载 bashrc

Copy to Clipboard

3. helm3 命令使用

3.1 仓库管理

kubernetes 官方的 package 的 helm 查询网站在:https://artifacthub.io/

仓库管理命令列表:

  • helm repo add – 添加 chart 仓库

    • helm repo add [NAME] [URL] [flags]

  • helm repo index – 生成一个包含打包图表的目录的索引文件

    • helm repo index [DIR] [flags]

  • helm repo list – 查看 chart 仓库

    • helm repo list [flags]

  • helm repo remove – 删除一个或多个 chart 仓库

    • helm repo remove [REPO1 [REPO2 ...]] [flags]

  • helm repo update – 从 chart 仓库本地更新可用 chart 的信息

    • helm repo update [flags]

注意:国内常用的仓库有

实例:

  1. 添加 chart 仓库

  2. 查看 仓库

Copy to Clipboard

3.2 搜索相关软件 chart

两种搜索方式:

  • helm search repo : 从 repo仓库中搜索

    • helm search repo [keyword] [flags]

    • helm search repo nginx

  • helm search hub : 从 官方 https://hub.helm.sh 搜索软件包

    • helm search hub [keyword] [flags]

3.3 部署应用

  1. helm pull : 从仓库下载图表,并(可选地)将其解压缩到本地目录中。类似 docker pull,下载到本地。

    • helm pull [chart URL | repo/chartname] [...] [flags]

  2. helm install : 可以直接安装,也可以下载下来后再安装

    • helm install [NAME] [CHART] [flags]

    • 有五种不同的方式可以安装的chart:

      1. 通过 仓库 安装helm install mymaria example/mariadb

      2. 通过一个打包好的 chart 文件: helm install mynginx ./nginx-1.2.3.tgz

      3. 通过一个文件夹中的解压后的文件: helm install mynginx ./nginx

      4. 通过网络路径安装: helm install mynginx https://example.com/charts/nginx-1.2.3.tgz

      5. 通过指定repo仓库安装helm install --repo https://example.com/charts/ mynginx nginx

对解压后的压缩包的说明:

Copy to Clipboard

说明:

  • Chart.yaml 是 chart 的描述信息

  • README.md 是此 chart 的帮助信息

  • templates 目录里是各种模板,比如定义 svc,定义 pvc 等

  • values.yaml 里记录的是 chart 的各种信息,比如镜像是什么,root 密码是什么,是否使用持久性存储等

3.4 验证 yaml 文件格式

  • helm lint PATH [flags] : 检查chart中可能出现的问题

3.5 查看已部署应用

注意: Release: 使用 Helm install 命令在 Kubernetes 集群中安装的 Chart 称为 Release

  1. helm list [flags] : list release

    • 默认情况下,它只列出已部署或失败的版本。

    • 默认情况下,项目按字母顺序排序。使用 ‘-d’ 标志按发行日期排序。

    • 如果提供了 --filter 标志,它将被视为一个过滤器。过滤器是应用于发布列表的正则表达式。只返回与筛选器匹配的项。

  2. helm status RELEASE_NAME [flags] : 显示 指定 release 的状态,状态信息包括:

    • 最后部署时间

    • k8s 命名空间

    • 状态(可以是: unknown, deployed, uninstalled, superseded, failed, uninstalling, pending-install, pending-upgrade or pending-rollback)

    • 这个版本包含的资源列表

    • 最后一次测试套件运行细节

    • 附加 notes 提供的chart

  3. helm show all [CHART] [flags] : 显示指定目录下 chart 的所有信息

  4. helm show chart [CHART] [flags] : 显示指定目录下 chart 的定义,也就是 Chart.yaml 文件的内容

  5. helm show readme [CHART] [flags] : 显示指定目录下 chart 的 readMe 信息,也就是 README.md 文件的内容

  6. helm show values [CHART] [flags] : 显示指定目录下 chart 的 values 信息,也就是 values.yaml 文件的内容

3.6 自定义chart

  • helm create NAME [flags] : 创建指定名称的 chart

Copy to Clipboard

3.7 打包

  • helm package [CHART_PATH] [...] [flags] : 将一个 chart 目录打包成 压缩包

3.8 查看 release 的历史版本

  • helm history RELEASE_NAME [flags] : 查看 release 的历史版本

3.9 卸载应用

  • helm uninstall RELEASE_NAME [...] [flags] : 卸载指定应用

4. helm 搭建私有仓库

4.1 推送到私有仓库

将自己写的包推送到私有仓库,有以下几个步骤:

  • 搭建私有仓库

  • 写好自己的 chart 文件

  • 将 chart 文件打包

  • 创建包的索引文件

  • 把包推送到私有仓库

4.2 搭建私有仓库

  1. 运行web容器作为私有仓库

    • 在一台新的机器上,搭建私有仓库,IP 地址为 10.113.69.133

    • 首先使用的是 httpd 镜像,其实其他镜像也可以,例如 nginx

    • 将本地目录 /k8s-proxy/helm-repo/ 映射到容器中

    • 在本地目录 /k8s-proxy/helm-repo/ 中写自己的 chart 文件

Copy to Clipboard
  1. 通过 helm package 将自己建的 chart 打包

    • 创建一个自定义文件夹,里面存放自定义的chart文件

    • 创建 testechart,helm create testchart

    • 进行打包,helm package testchart

Copy to Clipboard
  1. 执行 helm repo index 生成库的 index 文件

Copy to Clipboard
  1. 将生成的 index.yaml 文件及 charts 包复制到 httpd 容器所在节点映射到本地的目录

Copy to Clipboard
  1. 通过 helm repo add 将新仓库添加到 helm

Copy to Clipboard
  1. 搜索复制到 node01 上的 charts 包

Copy to Clipboard

5. 使用 helm 安装 Prometheus

5.1 prometheus 架构简介

Prometheus 是一套开源的系统监控报警框架。

Prometheus 的监控是基于时序数据的,即通过采样数据(metrics),不断获取监控目标的状态信息,即时地记录与展示,并根据设定的门限和方式及时发布告警。

结构图:

注意:

  • Prometheus Server是 Prometheus 架构中的核心部分,负责实现对监控数据的获取、存储及查询

    • Prometheus Server 可以通过静态配置管理监控目标,也可以配合使用 Service Discovery 的方式动态管理监控目标,并从这些监控目标中获取数据。

    • 其次 Prometheus Server 本身也是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。

    • Prometheus Server 对外提供了自定义的 PromQL,实现对数据的查询以及分析。

  • Exporter是提供监控数据的来源

    • Exporter 分为两类:

      • 一类 Exporter 直接内置了对 Prometheus 监控的支持,如 Kubernetes、etcd 等;

      • 另一类是因为原有监控目标并不直接支持 Prometheus,需要通过 Prometheus 提供的 Client Library 编写该监控目标的监控采集程序,如 Mysql、JMX 等。

    • 对于 Exporter,Prometheus Server 采用 pull 的方式来采集数据。

  • PushGateway同样是监控数据的来源

    • 对于由于特定原因,如网络环境不允许等,Prometheus Server 不能直接与 Exporter 进行通信时,可以使用 PushGateway 来进行中转。

    • 内部网络的监控数据主动 Push 到 Gateway 中,而和对 Exporter 一样,Prometheus Server 也利用 pull 的方式从 PushGateway 采集数据。

  • Alertmanager是 Prometheus 体系中的告警组件

    • 在 Prometheus Server 中可以设定门限与警报规则。

    • 当采集到的数据满足相关规则后,就会产生一条告警。

    • Alertmanager 从 Prometheus Server 接收到告警后,会根据事先设定的路径,向外发出告警。

    • 常见的告警发送路径有:电子邮件、PagerDuty、Webhook、Slack 等。

  • Grafana : 数据展示与输出

    • Prometheus Serve r有内置的 UI 用于展示采集到的监控数据。

    • 在该 UI 上,可以通过各种内置的数学公式对原始数据进行加工,并通过图形化的方式展现出来。

    • 当然,Prometheus Server 原生 UI 的展示方式还是比较基础和单薄,所以目前更多的是通过对接 Grafana 来进行数据的展示,可以得到更好的展示效果。

    • 此外,Prometheus Server 也提供 API 的方式来实现对监控数据的访问。

5.2 Prometheus-operator 架构简介

Prometheus Operator 架构图如下:

说明:

  • Operator : 根据自定义资源(Custom Resource Definition / CRDs)来部署和管理 Prometheus Server,同时监控这些自定义资源事件的变化来做相应的处理,是整个系统的控制中心。

  • Prometheus :声明 Prometheus deployment 期望的状态,Operator 确保这个 deployment 运行时一直与定义保持一致。

  • Prometheus Server : Operator 根据自定义资源 Prometheus 类型中定义的内容而部署的 Prometheus Server 集群,这些自定义资源可以看作是用来管理 Prometheus Server 集群的 StatefulSets 资源。

  • ServiceMonitor :声明指定监控的服务,描述了一组被 Prometheus 监控的目标列表。该资源通过 Labels 来选取对应的 Service Endpoint,让 – Prometheus Server 通过选取的 Service 来获取 Metrics 信息。

  • Service:简单的说就是 Prometheus 监控的对象。

  • Alertmanager :定义 AlertManager deployment 期望的状态,Operator 确保这个 deployment 运行时一直与定义保持一致。

5.3 通过 helm 安装 Prometheus-operator

  1. 创建 Prometheus 专属的命名空间

Copy to Clipboard
  1. 从 ali 仓库下载 prometheus-operator

Copy to Clipboard
  1. 如需修改配置值,可以修改 values.yaml 文件

  2. 然后开始安装 prometheus-operator

Copy to Clipboard
  1. 查看安装是否完成

Copy to Clipboard
  1. 修改 service prometheus-operator-grafana ,prometheus-operator-alertmanager ,prometheus-operator-prometheus 的类型为 NodePort

Copy to Clipboard
  1. 就可以 访问这些 NodePort 类型的 svc 了,例如,prometheus-operator-grafana 服务,就可以访问 nodeIp:30637

  2. 查看登录的用户名和密码, 密码都保存在了 sercret 中,prometheus-operator-grafana 为例

Copy to Clipboard
  1. 可以导入dashboard 的 json文件,来生成好看的界面,官网地址:https://grafana.com/grafana/dashboards

6. helm 安装日志管理

6.1 日志管理架构

ELK

  • Elasticsearch : 是个开源分布式搜索引擎,存储日志及提供查询接口。

  • Logstash : 是一个完全开源的工具,他可以对日志进行收集发送给 Elasticsearch.

  • Kibana : 是一个开源和免费的 web 界面的工具,可以让用户浏览 Elasticsearch 里的日志.

注意:

  • logstash : 性能低,消耗资源,且存在不支持消息队列缓存及存在数据丢失的问题

  • 因此 logstash 一般可以用 fluentd 或者 filebeat 替代为 EFK框架

日志管理架构图:

6.2 helm 安装日志管理系统 EFK

日志管理系统的组件:

  • elasticsearch

  • FileBeat

    • FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstash,官方也推荐此工具。

  • metricbeat

    • 系统级监控。用于从系统和服务收集指标。从 CPU 到内存,从 Redis 到 Nginx

    • Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据。

    • 可以获取系统级的 CPU 使用率、内存、文件系统、磁盘 IO 和网络 IO 统计数据,以及获得如同系统上 top 命令类似的各个进程的统计数据。

  • kibana

步骤:

  1. 创建单独存放日志管理系统的 namespace,名为 efk-logger

Copy to Clipboard
  1. 安装 elasticsearch

    • 添加官方 helm 源: helm repo add elastic https://helm.elastic.co

    • 搜索并且下载 elasticsearch ,下载好后,解压文件,helm pull elastic/elasticsearch

    • 修改默认的配置,values.yaml 文件中的内容

      • 因为不准备使用持久性存储,所以这里把 persistence 下面的 enabled 值有 true 改为 false。

      • 因为我们环境一台 master,3 台 worker,所以 replicas 修改为 3, minimumMasterNodes 修改为 1。

      • 如果 镜像因为网络的原因下载不了,那就需要先下载镜像。镜像为 docker.elastic.co/elasticsearch/elasticsearch

    • 安装 elasticsearch,helm install elasticsearch .

    • 查看安装状态,helm status elasticsearch

Copy to Clipboard
  1. 安装 filebeat

    • 搜索并且下载 filebeat ,下载好后,解压文件,helm pull elastic/filebeat

    • 修改默认的配置,values.yaml 文件中的内容

      • 建议提前把所需镜像在所有节点上下载下来, 镜像为:"docker.elastic.co/beats/filebeat"

    • 安装 filebeat, helm install filebeat .

    • 查看 状态,helm status elasticsearch

Copy to Clipboard
  1. 安装 metricbeat

    • 搜索并且下载 filebeat ,下载好后,解压文件,helm pull elastic/metricbeat

    • 修改默认的配置,values.yaml 文件中的内容

      • 建议提前把所需镜像在所有节点上下载下来, 镜像为docker.elastic.co/beats/metricbeat

    • 安装 filebeat, helm install metricbeat .

    • 查看 状态,helm status metricbeat

Copy to Clipboard
  1. 安装 kibana

    • 搜索并且下载 filebeat ,下载好后,解压文件,helm pull elastic/kibana

    • 修改默认的配置,values.yaml 文件中的内容

      • 建议提前把所需镜像在所有节点上下载下来, 镜像为docker.elastic.co/beats/kibana

      • 修改 kibana svc 的类型为 nodeport

    • 安装 filebeat, helm install kibana .

    • 查看 状态,helm status kibana

Copy to Clipboard
  1. 访问 kibana

    • 查看 kibana 的 svc 的 NodePort 的端口,就可以通过 nodeIP:NodePort 访问

Copy to Clipboard