**容器监控之prometheus**
**教程以阿里云k8s-1.11版本为基础部署的,其他版本应该也没问题**
Prometheus是SoundCloud开源的一款开源软件,它的实现参考了Google内部的监控实现,与源自Google的Kubernetes结合起来非常合适。另外相比heapster+influxdb的方案,性能更加突出,而且还内置了报警功能。它针对大规模的集群环境设计了拉取式的数据采集方式,你只需要在你的应用里面实现一个metrics接口,然后把这个接口告诉Prometheus就可以完成数据采集了。
注:K8S已经将cadvisor内置在kubelet中,prometheus可以读取到cadvisor的metric,cadvisor只采集容器的CPU内存等基础信息,关于node物理节点的监控和k8s中基础对象的监控,还需要额外组件支持,
以下组件都可以视为prometheus的agent采集器:
cadvisor:采集容器信息
node-exporter:采集物理节点信息
kube-state-metrics:采集K8S中基础对象信息,pod,deploy,rs 等状态。
node-directory-size-metrics:
prometheus构成:
Prometheus server:主要负责数据采集和存储,提供 PromQL 查询语言的支持;
Push Gateway:支持临时性 Job 主动推送指标的中间网关;
exporters:提供被监控组件信息的 HTTP 接口被叫做 exporter ,目前互联网公司常用的组件大部分都有 exporter 可以直接使用,比如 Varnish、Haproxy、Nginx、MySQL、Linux 系统信息 (包括磁盘、内存、CPU、网络等等);
PromDash:使用 rails 开发的 dashboard,用于可视化指标数据;
WebUI:9090 端口提供的图形化功能;
APIclients:提供 HTTPAPI 接口
alertmanager:实验性组件、用来进行报警;
注:prometheus-operator,这是coreos公司开源的项目,简化了prometheus的集群部署,安装后会将k8s的api中增加一个prometheus对象,部署prometheus只需要创建kind:prometheus对象,可以快速的扩展和收缩集群,使用prometheus集群的可以了解一下,这里使用单机版只部署一个Pod,不使用此项目。
[[prometheus地址]](https://github.com/prometheus/prometheus/tree/master/documentation/examples)
https://github.com/prometheus/prometheus/tree/master/documentation/examples
**创建prometueus所需yaml**
prometheus官方没有提供部署yaml, 可以去K8S官方git上去找部署文件。
[[k8s地址]](https://github.com/kubernetes/kubernetes/tree/release-1.11)
https://github.com/kubernetes/kubernetes/tree/release-1.11
K8S-1.11版本之后开始提供了prometheus的yaml,下载后将cluster\addons\prometheus里面的文件拷贝出来。

为了方便维护,将yaml文件分为4个文件夹:
~~~
1,alertmanager 报警模块
2,kube-state-metrics 监控项
3,node-exporter 监控项
4,prometheus主程序
~~~
**1,先部署prometheus和alertmanager**
~~~
prometheus包含的4个yaml:
prometheus-configmap.yaml (不用改)
prometheus-rbac.yaml(不用改)
prometheus-service.yaml(type改为NodePort,自定义一个端口nodePort: 30090)
prometheus-statefulset.yaml(修改最下面的volumes部分,改成你自己的pvc存储,pv和pvc自己手动提前建立,这个目录保存的是历史数据)
~~~

~~~
启动prometheus
# kubectl apply -f .
通过浏览器访问 http://nodeip:30090
修改configMap后需要apply,项目会自动重新加载(在prometheus-statefulset.yaml里已经添加了一个自动检测configmap更新的Image,一旦变化会自动加载prometheus,大概15秒延迟)也可手动通过curl -X POST "http://nodeip:30090/-/reload"重启加载配置文件。
~~~
**注意**:
如果你没有pv,可以先使用本地磁盘进行部署。

~~~
alertmanager包含4个yaml:
alertmanager-configmap.yaml (不用改)
alertmanager-deployment.yaml(修改最下面的volumes部分,参考上面prometheus修改步骤)
alertmanager-pvc(删除掉)
alertmanager-service(type改为NodePort,自定义一个端口nodePort: 3009)
~~~
~~~
启动alertmanager
# kubectl apply -f .
通过浏览器访问 http://nodeip:30091
修改configMap后需要apply会自动加载,或通过curl -X POST "http://nodeip:30091/-/reload"加载配置文件。
~~~
**阿里云容器服务K8S-1.11安装prometheus后无法采集cadvisor和kubelet,登陆prometheus点击tatus-Targets可以看到服务状态提示401,需要修改kubelet启动参数**

参考https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus需要修改kubelet配置文件,kubelet需要开启--authentication-token-webhook=true --authorization-mode=Webhook两个参数才能采集。
~~~
阿里云K8S每个node需要修改:
/etc/systemd/system/kubelet.service.d/10\-kubeadm.conf
原来的:
Environment\="KUBELET\_AUTHZ\_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
改为:
Environment\="KUBELET\_AUTHZ\_ARGS=--authorization-mode=Webhook --authentication-token-webhook=true --client-ca-file=/etc/kubernetes/pki/ca.crt"
重启kubelet后就正常了
# systemctl daemon\-reload&&systemctl restart kubelet
~~~
**node-export**
项目地址:https://github.com/prometheus/node_exporter
运行上面k8s项目中拷贝出来的yaml启动即可
**kube-state-metrics**
项目地址:https://github.com/kubernetes/kube-state-metrics/tree/master/kubernetes
项目里提供了yaml,下载后直接运行即可。
也可以运行上面k8s项目中拷贝出来的yaml运行即可。二选一。
**安装grafana**
项目地址:https://github.com/grafana/grafana
grafana是一个图形化的界面,通过查询prometheus采集到的数据,进行图形化展示;(如果无法启动提示目录无权限,可以修改NFS目录权限,chmod 775 ,chown nfsnobody:root)
官方没有提供yaml,自行创建grafana.yaml
~~~
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: grafana
namespace: kube-system
labels:
app: grafana
component: core
spec:
replicas: 1
template:
metadata:
labels:
app: grafana
component: core
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/acs/grafana:5.0.4
name: grafana-core
ports:
- containerPort: 3000
imagePullPolicy: IfNotPresent
# env:
resources:
# keep request = limit to keep this container in guaranteed class
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 200m
memory: 512Mi
env:
# The following env variables set up basic auth twith the default admin user and admin password.
- name: GF_AUTH_BASIC_ENABLED
value: "true"
- name: GF_AUTH_ANONYMOUS_ENABLED
value: "false"
# - name: GF_AUTH_ANONYMOUS_ORG_ROLE
# value: Admin
# does not really work, because of template variables in exported dashboards:
# - name: GF_DASHBOARDS_JSON_ENABLED
# value: "true"
readinessProbe:
httpGet:
scheme: HTTP
path: /login
port: 3000
initialDelaySeconds: 30
periodSeconds: 5
volumeMounts:
- name: grafana-persistent-storage
mountPath: /var/lib/grafana
volumes:
- name: grafana-persistent-storage
persistentVolumeClaim:
claimName: grafana
---
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: kube-system
labels:
app: grafana
component: core
spec:
type: NodePort
ports:
- port: 3000
targetPort: 3000
nodePort: 30092
selector:
app: grafana
component: core
~~~
~~~
注意volumes改为自己的PVC,或改为本地存储。
# kubectl apply -f grafana.yaml
访问地址:http://nodeip:30092
~~~
初始账号密码admin:admin首次使用需要设置data source如下;

导入视图模板,模板有很多[模板地址](https://grafana.com/dashboards?dataSource=prometheus&page=2),以315模板为例导入步骤:Dashboard-Import

输入315后不需要点load,随便点击旁边空白处,等待几秒;

已经可以看到集群状态;

**使用kubernetes-app插件**
上面的315模板展示的信息有限,grafana提供了grafana-kubernetes-app插件,可以展示更多信息。
项目地址:https://grafana.com/plugins/grafana-kubernetes-app?version=1.0.1
项目git:https://github.com/grafana/kubernetes-app/
从git上下载源码,解压到grafana容器中的/var/lib/grafana/plugins中,因为部署grafana时已经将数据持久化到了PVC,要将代码拷贝到对应的存储目录中,安装后需要重启grafana。
~~~
完成后重启部署grafana
kubectl delete -f grafana.yaml
kubectl apply -f grafana.yaml
~~~
登录grafana依次点击-configruatione-plugins-kubernetes-enable;
图1:

点击上图中Next up:后面的超链接,出现以下界面:


Url:你的k8s-api服务地址
Ca:你的ca.pem
Client cert:连接api服务的公钥 我的是admin.pem
Clinet key:连接api服务的私钥 我的是admin.key
Datasource:prometheus
填写完成后点击Save,**不要点击Deploy**(这个是自动部署node-export和kube-state-metric的,这个功能不好用,前面已经手动部署过了),提示成功后,返回到(图1)的界面,点击Update,此时配置就完成了,点击左侧的kubernetes-clusters-k8s overview 就可以看到集群信息了。

模板的k8s node界面会无法显示,参考官方git hub上的问题修改
将项目目录的dist 和 src 下所有json 文件里面的nodename全部替换instance,因为最新版本的node-export提供的metrics里的label变了。
然进入grafana,进入kubernetes-plug,点击update

- 部署介绍
- 一,系统初始化操作
- 二,创建TLS证书
- 三,创建kubeconfig文件
- 四,安装etcd集群
- 五,部署master节点
- 六,部署node节点
- 附,新增node节点
- 七,网络插件calico
- 八,安装DNS组件
- 九,安装dashboard
- 十,服务发布nginx-ingress
- 十一,prometheus监控部署
- 十二,prometheus自定义监控和报警
- 十三,Harbor私有仓库
- 十四,NFS数据持久化
- 其他
- linux相关文档
- centos7.4搭建openvpn
- docker-compose搭建ldap
- docker-compose搭建openvpn
- docker-compose搭建superset
- docker-compose搭建jenkins
