master构筑见:使用kubeadm工具快速安装kubernetes集群-master(1.11.2)
Node构筑见:使用kubeadm工具快速安装Kubernetes集群-node(1.11.2)
Docker私有仓库构筑见:CentOS7下搭建Docker私有仓库
Docker私有仓库在k8s集群中的使用:在Kubernetes集群中使用私有仓库(1.11.2)

1. 为什么要使用Prometheus

Prometheus在2016加入 CNCF ( Cloud Native Computing Foundation ), 作为在kubernetes之后的第二个由基金会主持的项目,Prometheus的实现参考了Google内部的监控实现,与源自Google的Kubernetes结合起来非常合适。另外相比influxdb的方案,性能更加突出,而且还内置了报警功能。它针对大规模的集群环境设计了拉取式的数据采集方式,只需要在应用里面实现一个metrics接口,然后把这个接口告诉Prometheus就可以完成数据采集了。

2. 环境

CentOS: 7.5
Docker: 1.13
k8s: 1.11.2
Prometheus: 10.9.54.19/prom/prometheus:v2.2.0
Node Exporter: 10.9.54.19/prom/node-exporter:latest
Grafana: 10.9.54.19/grafana/grafana:4.2.0

Docker hub:10.9.54.19
Master节点:10.9.54.20
Node1节点:10.9.54.21
Node2节点:10.9.54.22

3. 部署

3.1. Node Exporter

Prometheus社区提供的NodeExporter项目可以对于主机的关键度量指标状态监控,通过Kubernetes的DeamonSet我们可以确保在各个主机节点上部署单独的NodeExporter实例,从而实现对主机数据的监控。

3.1.1. 创建Pod

定义YAML文件
[root@k8s-master ~]# vim node-exporter.yml

执行kubectl create 创建Pod

3.1.2. 创建Service

定义Service Yaml
[root@k8s-master ~]# vim node-exporter.svc.yml

执行kubectl create 创建Service

3.2. Prometheus

3.2.1. RBAC

在Kubernetes1.6版本中新增角色访问控制机制RBAC(Role-Based Access Control)让集群管理员可以针对特定使用者或服务账号的角色,进行更精确的资源访问控制。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。
RBAC 的授权策略可以利用 kubectl 或者 Kubernetes API 直接进行配置。RBAC 可以授权给用户,让用户有权进行授权管理,这样就可以无需接触节点,直接进行授权管理。RBAC 在 Kubernetes 中被映射为 API 资源和操作。

定义YAML文件
[root@k8s-master ~]# vim prometheus.rbac.yml

注:ClusterRoleBinding 用于授权集群范围内所有命名空间的权限

3.2.2. 利用ConfigMap管理Prometheus的配置

在Kubernetes 1.2版本后引入ConfigMap来处理这种类型的配置数据。
ConfigMap是存储通用的配置变量的,类似于配置文件,使用户可以将分布式系统中用于不同模块的环境变量统一到一个对象中管理,而它与配置文件的区别在于它是存在集群的”环境”中的,并且支持K8S集群中所有通用的操作调用方式。
从数据角度来看,ConfigMap的类型只是键值组,用于存储被Pod或者其他资源对象(如RC)访问的信息。这与secret的设计理念有异曲同工之妙,主要区别在于ConfigMap通常不用于存储敏感信息,只存储简单的文本信息。
ConfigMap可以保存环境变量的属性,也可以保存配置文件。创建pod时,对ConfigMap进行绑定,pod内的应用可以直接引用ConfigMap的配置。相当于ConfigMap为应用/运行环境封装配置。

定义ConfigMap
[root@k8s-master ~]# vim prometheus.configmap.yml

3.2.3. Deployment

定义YAML文件
[root@k8s-master ~]# vim prometheus.deploy.yml

创建Prometheus的Deployment

3.2.4. Service

定义YAML文件
[root@k8s-master ~]# vim prometheus.svc.yml

创建Prometheus的Service

3.2.5. 测试

Pods

Service

Prometheus对应的Node Port是30003,通过浏览器访问http://10.9.54.20:30003/targets,查看Prometheus连接k8s的api server的状态

Node Exporter对应的Node Port是31672,通过浏览器访问http://10.9.54.20:31672/metrics,查看metrics接口获取到所有容器相关的性能指标数据

3.3. Grafana

3.3.1. Deployment

定义YAML文件
[root@k8s-master ~]# vim grafana.deploy.yml

创建Grafana的Deployment

3.3.2. Service

定义YAML文件
[root@k8s-master ~]# vim grafana.svc.yml

创建Grafana的Service

3.3.3. Ingress

Kubernetes关于服务的暴露主要是通过NodePort方式,通过绑定minion主机的某个端口,然后进行pod的请求转发和负载均衡,但这种方式下缺陷是
Service可能有很多个,如果每个都绑定一个node主机端口的话,主机需要开放外围一堆的端口进行服务调用,管理混乱无法应用很多公司要求的防火墙规则
理想的方式是通过一个外部的负载均衡器,绑定固定的端口,比如80,然后根据域名或者服务名向后面的Service ip转发,Nginx很好的解决了这个需求,但问题是如果有新的服务加入,如何去修改Nginx的配置,并且加载这些配置? Kubernetes给出的方案就是Ingress,Ingress包含了两大主件Ingress Controller和Ingress.
Ingress解决的是新的服务加入后,域名和服务的对应问题,基本上是一个ingress的对象,通过yaml进行创建和更新进行加载。
Ingress Controller是将Ingress这种变化生成一段Nginx的配置,然后将这个配置通过Kubernetes API写到Nginx的Pod中,然后reload.
定义YAML文件
[root@k8s-master ~]# vim grafana.ing.yml

创建Grafana的Ingress

3.3.4. 配置Grafana

配置本地host,添加:10.9.54.20 k8s.grafana

浏览器访问:http://k8s.grafana/login
默认用户名和密码都是admin


添加数据源



导入Dashboard模板

这里使用的是kubernetes集群模板,模板编号315,在线导入地址https://grafana.com/dashboards/315


效果展示:




如果想赏钱,可以用微信扫描下面的二维码,一来能刺激我写博客的欲望,二来好维护云主机的费用; 另外再次标注博客原地址 itnotebooks.com 感谢!

手把手搭建CI/CD(一)

gitlab + tekton + argoCD

阅读全文

自动分析国家关于每年的法定节假日安排公告,生成查询接口自动判断作息日

背景 工作中经常遇到需要根据作息去做排班系统、跑定时报表任务、统一告警通道、巡检等等场景,之前是比较粗暴的区分周一~周五、周六和周日这样,遇到法定节...

阅读全文

Golang Terraform 创建阿里云ECS云主机

封装NewTerraform方法 将Terraform的环境相关信息都在这个方法内定义完成 1. Terraform工作目录定义 2. Plugins初始化,考虑到在线初始化太慢,这里是提前下...

阅读全文

欢迎留言