ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**容器监控之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里面的文件拷贝出来。 ![](https://i.loli.net/2019/04/03/5ca4204158953.jpg) 为了方便维护,将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自己手动提前建立,这个目录保存的是历史数据) ~~~ ![](https://i.loli.net/2019/04/03/5ca425875602e.png) ~~~ 启动prometheus # kubectl apply -f . 通过浏览器访问 http://nodeip:30090 修改configMap后需要apply,项目会自动重新加载(在prometheus-statefulset.yaml里已经添加了一个自动检测configmap更新的Image,一旦变化会自动加载prometheus,大概15秒延迟)也可手动通过curl -X POST "http://nodeip:30090/-/reload"重启加载配置文件。 ~~~ **注意**: 如果你没有pv,可以先使用本地磁盘进行部署。 ![](https://i.loli.net/2019/04/03/5ca4252be2378.png) ~~~ 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://i.loli.net/2019/04/03/5ca42a768d56f.png) 参考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://box.kancloud.cn/b67a0a3a3cc55c6fed7d4e1842f09b34_788x601.png) 导入视图模板,模板有很多[模板地址](https://grafana.com/dashboards?dataSource=prometheus&page=2),以315模板为例导入步骤:Dashboard-Import ![](https://box.kancloud.cn/2b5681eb84853129f7b23c341d440342_457x327.jpg) 输入315后不需要点load,随便点击旁边空白处,等待几秒; ![](https://box.kancloud.cn/426817c2034b972bd9df68990fc7a1d4_767x511.png) 已经可以看到集群状态; ![](https://box.kancloud.cn/7a4f180b89716a16ba68f76a13e41c69_760x431.png)![](https://box.kancloud.cn/ca72a5a16a6060200515ec9222ba42f6_1364x660.png) **使用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: ![](https://box.kancloud.cn/ba90fab6e000fac554071864326e5be9_969x445.jpg) 点击上图中Next up:后面的超链接,出现以下界面: ![](https://box.kancloud.cn/ca4c442692fa9b08a06b4816187d9bb0_907x639.jpg) ![](https://box.kancloud.cn/bd2fe042f47861a25059e9679eee0bae_1166x650.jpg) 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 就可以看到集群信息了。 ![](https://box.kancloud.cn/f9fb139b0f839a2efb08697400afbe0d_1348x641.jpg) 模板的k8s node界面会无法显示,参考官方git hub上的问题修改 将项目目录的dist 和 src 下所有json 文件里面的nodename全部替换instance,因为最新版本的node-export提供的metrics里的label变了。 然进入grafana,进入kubernetes-plug,点击update ![](https://i.loli.net/2019/04/25/5cc15a4c4d957.png)