欢迎访问我的博客,你的支持,是我最大的动力!

马哥_K8s进阶实战(13)Helm程序包管理器

Docker 小马奔腾 847℃ 评论
目录:
[显示]
Helm基础

Helm是K8s的应用程序包管理器,可创建、回滚(helm rollback)、安装及升级复杂应用

Charts,一个Helm程序包
Repository,Charts仓库
Config,应用程序实例化安装运行时使用的配置信息
Release,实例化配置后运行于集群中的一个Chart实例,同个Charts可使用不同Config重复安装多次,每次都生成一个Release

Helm 架构

Helm客户端是命令行工具,基于gRPC与Tiller server交互
Helm实现本地Charts开发、管理Charts仓库、与Tiller交互等功能

Tiller server 是K8s集群中的容器化服务应用,接收来自客户端的请求,在必要时与API Server时行交互

安装 Helm Client

项目地址:https://github.com/helm/helm
下载地址:https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz

将二进制文件复制到系统PATH环境变量指向的目录中即可
mv helm /usr/local/bin/
helm version  # v2.13.1

helm运行依赖于 kubeconfig 配置文件

安装 Tiller server

Tiller通常部署于集群之上,也可以部署于本地
部署于集群上时,需要事先创建 ServiceAccount

# 绑定 cluster-admin 授予最高权限

# Tiller server 环境初始化 (完成Tiller server安装)
## helm init 会到gcr.io/kubernetes-helm/ 获取镜像,镜像标签同Helm版本号
helm init --service-account tiller

# 使用阿里的服务 安装Tiller server
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --service-account tiller
kubectl get pods -n kube-system -l app=helm

# 查看版本
helm version

安装时可选参数:
--canary-image,安装canary分支,即项目master分支
--tiller-image,安装指定版本的镜像,默认同helm版本
--kube-context,安装至指定的K8s集群
--tiller-namespace,安装至指定的名称空间,默认为 kube-system

tiller将数据存储于ConfigMap资源中,卸载后重新安装不会导致数据丢失,尽可放心重装或升级

卸载 Tiller 两种方法:
1、kubectl delete deployment tiller-deploy -n kube-system
# kubectl get deployments.apps -n kube-system tiller-deploy -o yaml --export
2、helm reset

Helm 快速入门

Helm官方仓库:https://kubernetes-charts.storage.googleapis.com
国内镜像:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

# 更新默认仓库 stable 元数据
helm repo update
# 列出stable仓库中所有Charts列表
helm search
helm search redis
# 显示指定Charts详情
helm inspect stable/redis
# 安装 Charts
helm install stable/redis
helm install stable/redis -n redis --dry-run   # -n 指定Release名称 --dry-run 执行安装测试
helm install --name my-release stable/redis
helm install --name my-release --set redisPassword=secretpassword stable/redis
# 查看已安装的Release
helm list
# 查看状态
helm status redis
# 删除Release
helm delete redis
#升级或回滚 helm upgrade、helm rollback、helm history

用户提供的参数放在yaml文件中,通过-f 加载使用

Helm Charts

Charts是Helm的Kubernetes 程序包打包格式。Charts是一个遵循特定规范的目录结构打包成的用于部署的版本化归档文件

Charts文件组织结构

Chart.yaml 描述信息
LICENSE 许可证信息,可选
README.md 可选
requirementes.yaml 依赖关系描述文件,可选
values.yaml 默认配置值
charts/ 存放依赖到的所有Charts文件
templates/ 存放当前Charts用到的模板文件,生成清单文件
templates/NOTES 简单使用注解,在Charts安装完成后输出,常用于提供相关使用或初始访问的信息

至少应存在一个Charts依赖文件或一个模板文件
其他文件都将被忽略

Chart.yaml 文件

提供Charts相关元数据
name,version 字段为必选字段

Charts中依赖关系

一个Charts可能会依赖不止一个其他的Charts,这种依赖关系可经 requirements.yaml 进行动态链接,也可直接存储于charts目录进行手动管理
依赖关系文件配置完成,可使用 helm dependency update 命令更新依赖关系,并自动下载到charts目录
被依赖到的Charts可以是归档格式,也可以是目录格式

模板和值

模板文件中用到的值有两种提供方式:
通过 values.yaml 文件提供,常用于提供默认值
在运行 helm install 时传递需要自定义值的yaml文件,会覆盖默认值

char模板还包含一些固定的预定义值
如 Release.Name Release.Time Release.Service Release.IsUpgrade Release.IsInstall Release.Revision Chart.Name Chart.Version Files Capabilities等

上级Charts可访问下级Charts中的值,下级Charts不能访问上级Charts的值

Go模板语法:https://godoc.org/text/template

自定义 Charts

一个典型的服务类容器化应用通常由Pod控制器、Service、ConfigMap、Secret、Ingress、PersistentVolumeClaim等资源对象组成

1、生成一个空Charts
helm create mychart
2、修改Charts
默认修改value.yaml即可
3、检查
helm lint mychart
4、安装调度
helm install --name myapp --dry-run --debug ./mychart --set service.type=NodePort
## 会打印清单文件
helm install --name myapp --debug ./mychart --set service.type=NodePort
helm status myapp
5、打包
helm package ./mychart
# 生成 mychart-0.1.0.tgz
helm install --name myapp2 mychart-0.1.0.tgz --set service.type=NodePort

配置依赖关系
编辑文件 requirements.yaml
helm dependency update mychart
# 生成锁定文件 requirements.lock 并下载mysql-0.3.5.tgz至charts目录
也可手动将所依赖到的程序包直接放到charts目录中来定义依赖关系,不必再使用requirements.yaml文件

本地托管仓库

helm serve
# 内置http服务器
使用本地仓库
helm search local

任何能支持yaml文件及tar文件传输的http服务器都可作为仓库服务器使用

# 添加仓库
helm repo add local http://127.0.0.1:8879
# 列出所有仓库
helm repo list
# 更新元数据
helm repo update
# 删除仓库
helm repo remove local

使用Helm部署EFK日志管理系统

将fluentd作为节点级代理程序进行日志采集,并聚合存储于ES进行日志分析,通过Kibana进行数据可视化
部署EFK:
K8s项目 Addons目录的配置清单;
https://hub.kubeapps.com/

ElasticSearch集群

https://github.com/helm/charts/tree/master/incubator/elasticsearch
角色分离为三类节点:
客户端节点,上载节点,通常为2个
master节点,至少应为3个
data节点,根据需要

git clone https://github.com/helm/charts.git
kubectl create namespace logs
helm install elasticsearch -n efk-el --namespace=logs --set master.persistence.enabled="false",data.persistence.enabled="false"
## 编辑 values.yaml文件,修改cpu/mem/disk的要求,设置得小一点
## 仅用于测试 禁用pvc 使用emptyDir存储卷
## efk-el-elasticsearch-client.logs.svc:9200  随后的fluentd和kibana将通过此端点访问elasticsearch中的数据
helm status efk-el

# 测试es集群状态
kubectl run cirros-$RANDOM --rm -it --image=cirros -- sh
curl http://efk-el-elasticsearch-client.logs.svc:9200
curl http://efk-el-elasticsearch-client.logs.svc:9200/_cluster//health?pretty

日志采集代理 fluentd

fluentd是开源的数据收集器,基于C和Ruby开发,有数百种Ruby Gem形式独立存在的插件,用于连接多种数据源和数据输出组件
fluent-plugin-elasticsearch 插件用于实现将采集的数据发送给ElasticSearch

插件列表:https://www.fluentd.org/plugins

fluentd从配置文件读取配置信息:
source,定义数据源,每个源需要专有类型的定义
match,数据输出目标位置
filter,过滤器,事件处理流水线
system,系统级设置,处理器名称等
label,用于分组过滤器及输出目标
@include,引用配置信息中某些已有的定义,达到配置复用的目的

fluentd-elasticsearch是基于fluentd收集容器及系统日志并输出至ElasticSearch中
fluentd配置文件基于ConfigMap资源定义

helm install fluentd-elasticsearch -n efk-flu --namespace=logs --set elasticsearch.host="efk-el-elasticsearch-client.logs.svc.cluster.local"
若要收集master节点的日志,需要为部署的Pod对象添加tolerations以容忍master上的taints

验证:
curl http://efk-el-elasticsearch-client.logs.svc.cluster.local:9200/_cat/indices
# 查看已生成logstash开头的索引

可视化组件 Kibana

stable/kibana,通过环境变量 ELASTICSEARCH_URL指定ES集群访问接口,通过NodePort类型Service暴露服务

helm install stable/kibana -n efk-kib --namespace=logs -f kibana-values.yaml

疑问:安装elasticsearch集群时,会造成一台节点服务器负载超高,只能删除部署

转载请注明:轻风博客 » 马哥_K8s进阶实战(13)Helm程序包管理器

喜欢 (0)or分享 (0)