Skip to content

Latest commit

 

History

History
403 lines (315 loc) · 21.1 KB

监控与日志.md

File metadata and controls

403 lines (315 loc) · 21.1 KB

认证要求

  • Logging / Monitoring 日志/监控 5%
    • 理解如何监控所有的集群组件
    • 理解如何监控应用
    • 管理集群组件日志
    • 管理应用日志

监控方案

关于Kubernetes的监控,有几种方案:

  1. Prometheus + Influxdb + Grafana
  2. Heapster + Influxdb + Grafana
  3. Satellite
  4. Open-falcon + Heapster + Grafana

在kubernetes中的监控需要考虑到这几个方面:

  • 应该给Pod打上哪些label,这些label将成为监控的metrics。tags和labels变的非常重要,是应用分组的重要依据

  • 当应用的Pod漂移了之后怎么办?因为要考虑到Pod的生命周期比虚拟机和物理机短的多,如何持续监控应用的状态?
  • 更多的监控项,kubernetes本身、容器、应用等。多维度的监控,包括集群内的所有节点、容器、容器内的应用以及Kubernetes自身

  • 监控指标的来源,是通过heapster收集后汇聚还是直接从每台主机的docker上取?
  • 天生的分布式,对复杂应用的监控聚合是个挑战

关于docker 容器的命名: kubernetes容器命名规则解析,见下图所示。

在kubernetes代码中pkg/kubelet/dockertools/docker.go中的BuildDockerName方法定义了容器的名称规范。

参考 集群及应用监控 Kubernetes监控 Monitoring in the Kubernetes era

kubernetes集群组件监控

  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler
  • kube-dns addon

node节点的监控

对node的监控, 和对vm和物理机的监控是一样的。 可以通过安装open-falcon的agent,采集node节点的内存, CPU, 网络, 磁盘等使用情况。

此外, 官方还推荐了另外一种node的监控方案作为补充, 即使用Node problem detector插件。 它以daemonset的方式部署, 收集各种各样的节点问题, 并以nodeCondition和Event的方式汇报给apiserver。

目前这种方案支持一些常见的内核问题的监测。对于监测到的问题, k8s master不会触发任何修复措施。但是以后修复系统(remedy system)会被引进来处理node问题。

一些限制

  • 对kernel issue的监测,只支持kernel log, 不支持jounald
  • 默认支持Ubuntu和Debian上的kernel log的格式, 如果需要支持其它类型的格式, 需要进行扩展, 扩展比较方便

部署Node problem detector node-problem-detector.yaml (不修改默认配置)

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: node-problem-detector-v0.1
  namespace: kube-system
  labels:
    k8s-app: node-problem-detector
    version: v0.1
    kubernetes.io/cluster-service: "true"
spec:
  template:
    metadata:
      labels:
        k8s-app: node-problem-detector
        version: v0.1
        kubernetes.io/cluster-service: "true"
    spec:
      hostNetwork: true
      containers:
      - name: node-problem-detector
        image: gcr.io/google_containers/node-problem-detector:v0.1
        securityContext:
          privileged: true
        resources:
          limits:
            cpu: "200m"
            memory: "100Mi"
          requests:
            cpu: "20m"
            memory: "20Mi"
        volumeMounts:
        - name: log
          mountPath: /log
          readOnly: true
      volumes:
      - name: log
        hostPath:
          path: /var/log/

node-problem-detector.yaml (挂载configmap, 修改默认配置)

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: node-problem-detector-v0.1
  namespace: kube-system
  labels:
    k8s-app: node-problem-detector
    version: v0.1
    kubernetes.io/cluster-service: "true"
spec:
  template:
    metadata:
      labels:
        k8s-app: node-problem-detector
        version: v0.1
        kubernetes.io/cluster-service: "true"
    spec:
      hostNetwork: true
      containers:
      - name: node-problem-detector
        image: gcr.io/google_containers/node-problem-detector:v0.1
        securityContext:
          privileged: true
        resources:
          limits:
            cpu: "200m"
            memory: "100Mi"
          requests:
            cpu: "20m"
            memory: "20Mi"
        volumeMounts:
        - name: log
          mountPath: /log
          readOnly: true
        - name: config # Overwrite the config/ directory with ConfigMap volume
          mountPath: /config
          readOnly: true
      volumes:
      - name: log
        hostPath:
          path: /var/log/
      - name: config # Define ConfigMap volume
        configMap:
          name: node-problem-detector-config

具体可以参考https://kubernetes.io/docs/tasks/debug-application-cluster/monitor-node-health/

容器监控

cAdvisor

cAdvisor是一个来自Google的容器监控工具,也是kubelet内置的容器资源收集工具。它会自动收集本机容器CPU、内存、网络和文件系统的资源占用情况,并对外提供cAdvisor原生的API(默认端口为--cadvisor-port=4194)。cAdvisor提供了container和pod维度的监控。

Satellite

Satellite是硅谷初创公司Gravitational公司旗下一个用Go写的开源项目,可用来收集Kubernetes集群的健康信息,它既是一个library,也是一个应用。作为library,可以用做监控方案。适合小的集群, 比如说8个节点。

原理大致如下: 每个节点驻留一个agent, 它们互相之间通过一个Serf提供的gossip协议来交流。 Agent定期同步数据,这样每个节点都是随时更新关于集群作为一个整体的信息。 Serf提供的一致性保证比较弱,导致更新信息也不是很严格

参考“Satellite”:在生产过程中监控Kubernetes, 2016-03-27

Prometheus

Prometheus是一个开源的监控解决方案,包括数据采集、汇聚、存储、可视化、监控、告警等。除了基本的监控数据,也支持通过自定义exporter来获取自己想要的数据。

  • Retrieval,这个里面定义的是什么?我这个 Prometheus 的服务器在哪里拉取数据,也可以从其他的 Prometheus 的服务器拉取数据。我们可能有很多会跑一些运行,然后就退出了,在这个 short lived jobs 里面,他就是在这个拉完之后运行到下面,这里面都是一些静态定义的拉取目标, Prometheus 还可以支持动态的,比如说 DNS 等,这一块是 Retrieval
  • Storage,当然也有一些外挂存储的方式,这都是我们在做监控的环节下不需要的。
  • PromQL,通过这个可以直接查询。

参考 Prometheus Repo 用 Prometheus 来监控你的 Kubernetes 集群 用容器轻松搭建Prometheus运行环境

关于如何搭建Prometheus, 可以参考用容器轻松搭建Prometheus运行环境

Heapster

Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS。 Heapster是一个收集者,将每个Node上的cAdvisor的数据进行汇总,然后导到第三方工具(如InfluxDB)。

框架图:

Heapster首先从K8S Master获取集群中所有Node的信息,然后通过这些Node上的kubelet获取有用数据,而kubelet本身的数据则是从cAdvisor得到。所有获取到的数据都被推到Heapster配置的后端存储中,并还支持数据的可视化。现在后端存储 + 可视化的方法,如InfluxDB + grafana。

参考Kubernetes监控Heapster介绍

Influxdb

InfluxDB是一款用Go语言编写的开源分布式时序、事件和指标数据库,无需外部依赖。 该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metrics, loT传感器数据和实时分析数据。 InfluxDB特征:

  • 无结构(无模式):可以是任意数量的列
  • 可以设置metric的保存时间
  • 支持与时间有关的相关函数(如min、max、sum、count、mean、median等),方便统计
  • 支持存储策略:可以用于数据的删改。(influxDB没有提供数据的删除与修改方法)
  • 支持连续查询:是数据库中自动定时启动的一组语句,和存储策略搭配可以降低InfluxDB的系统占用量。
  • 原生的HTTP支持,内置HTTP API
  • 支持类似sql语法
  • 支持设置数据在集群中的副本数
  • 支持定期采样数据,写入另外的measurement,方便分粒度存储数据。
  • 自带web管理界面,方便使用(登入方式:http://< InfluxDB-IP >:8083)

关于Influxdb 关键概念, 高级概念, 基本语法, API, 使用示例及集群化的介绍,可以参考 Kubernetes监控InfluxDB介绍

参考 Kubernetes监控InfluxDB介绍 2016-12-07

微服务监控

Netsil

Netsil的应用程序,Application Operations Center (AOC,应用运维中心),帮助用户观察并且收集跨Kubernetes集群运行的微服务应用程序的分析数据。服务本身是不可知的,因为它在网络上才能决定其实际上如何运行。随着时间的推移,并且实时地,它学习并且发现用户的环境,帮助用户逐渐搭建出SLA指标器,警报器等等。

AOC拓扑有两个主要组件。第一个是作为带有单个副本的Replication Controller的一部分运行的Pod。它运行AOC仪表盘和数据收集的平台。第二个组件是AOC收集器的DaemonSet。它告诉Kubernetes在环境的所有节点上运行一个带有收集器容器的Pod。这些收集器配置为向AOC Pod发送信息。

生成流量

我们将使用Sock Shop的更多工具来模拟网站上的购物行为。这让我们能看到AOC是如何学习流量模式以及我们的通用拓扑的。 随着load-test的运行,可以开始看到AOC随着数据的获得被点亮了:

因为AOC作为DaemonSet部署,如果任意Pod销毁了并且在其他地方重新调度,AOC能够继续观测到拓扑,随着Kubernetes的变化而变化。

我很喜欢AOC的一个原因是部署通过服务来组织,并且我能够实时地观察到环境,并且开始深入不同的度量,为了那些可能影响到客户的事情搭建服务级别的警报。因此,当环境像下图一样变红时,我能够获得警报,知道某个服务处在紧急状态,比如Sock Shop里的信用卡和地址端点。

我甚至还可以深入仪表盘,知道承受最大压力的Pod和容器是什么。在本示例里,网络压力最大的容器是flannel Pod。这让我们能够了解最繁忙的服务是哪个,能够帮助我们重新思考配置或者Kubernetes里分发部署的方式。

总结

Netsil的AOC是非常棒的工具,可以帮助用户实时观察环境,随着使用模式的变化而更新。用户可以挖掘历史数据并且添加警报。应用程序随着添加更多的节点会自动扩展,新节点上线后就会在上面启动一个收集器,这样用户能够得到节点从上线到销毁的所有数据。 要部署Netsil到kubernetes上, 可以到这里下载相关编排文件: https://github.com/netsil/manifests/tree/master/kubernetes

参考 使用Netsil监控Kubernetes上的微服务 2016-12-07

Istio

Istio 是一个由 IBM、Google 以及 Lyft 联合推出的开源软件,以无痛方式为运行在 Kubernetes 上的微服务提供流量管理,访问策略管理以及监控等功能。这一软件目前仅在 Kubernetes 上运行,今后可能会扩展到其他平台。本文会结合官方例子,完成安装和基础的监控内容。

架构和组件 总体架构如图所示。

  • Envoy

一个 C++ 编写的高性能代理服务器,这里做了扩展,在 Istio 中会以 Sidecar 方式跟应用运行在同一 Pod 内,一方面可以接收并执行关于规则、流量拆分等方面的指令,另一方面能够产生各种指标用于监控和跟踪。

  • Mixer

Mixer 组件,主要进行访问控制以及策略控制,同时也负责从 Envoy 中获取各项指标。

  • Pilot

Pilot 是用户和 Isito 之间的桥梁,负责接收各种配置,并发送给各个组件。

  • Istio auth

内置认证和凭证管理,利用 TLS 提供服务之间、用户和服务之间的认证。 可以用来将没有加密支持的服务升级为加密版本,并且在网络策略之外,提供服务级别的策略控制,今后还会增加更多的鉴权和审计方面的能力。

功能 & 特性

  • 无需对现有服务进行变更
  • 支持 http 1.1/2、gRPC 以及 TCP 流量的负载均衡和故障转移
  • 可替换的组件
  • 流量监控
  • 可提供身份认证功能
  • 可定制的路由规则
  • 错误处理,例如超时、重试、访问量控制、健康检查和熔断器等。

安装说明 参见 https://github.com/istio/istio

运行应用 安装包内包含了一个叫 bookinfo 的小应用,由 Product(入口页)、Detail 和 Review 三部分组成,具体应用 YAML 在安装目录的samples/apps/bookinfo/bookinfo-v1.yaml文件中。打开文件我们会发现这是个很简单的小应用,无非是几个 Deployment 和 Service 的组合。

istio 提供了一个工具叫 istioctl,这个工具的功能之一,就是把普通的应用 YAML 注入为 istio 支持的应用模式,例如:istioctl kube-inject -f bookinfo-v1.yaml > bookinfo-istio-v1.yaml,比较新旧两个文件不难发现,这一工具为每个 Pod 新增了一个名为 proxy 的容器,以此接管流量,给监控和管理打下基础

监控

istio 内置了对 ServiceGraph、Prometheus 以及 Zipkin 的支持,简单的运行一下kubectl create -f install/kubernetes/addons,就会启用这几个服务。注意这几个服务使用的也都是 Loadbalancer 模式,读者应根据集群情况自行修改。

参考 Istio,Kubernetes 的微服务支持 , 2017-07-16

weave scope

对于复杂的应用编排和依赖关系,我们希望能够有清晰的图标一览应用状态和拓扑关系,因此我们用到了Weaveworks开源的scope。

安装scope

我们在kubernetes集群上使用standalone方式安装,详情参考Installing Weave Scope。

使用scope.yaml文件安装scope,该服务安装在kube-system namespace下。

$ kubectl apply -f scope.yaml

创建一个新的Ingress:kube-system.yaml,配置如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-ingress
  namespace: kube-system
spec:
  rules:
    - host: scope.weave.io
      http:
        paths:
        - path: /
          backend:
            serviceName: weave-scope-app
            servicePort: 80

执行kubectl apply -f kube-system.yaml后在你的主机上的/etc/hosts文件中添加一条记录:

172.20.0.119 scope.weave.io

在浏览器中访问scope.weave.io就可以访问到scope了

如上图所示,scope可以监控kubernetes集群中的一系列资源的状态、资源使用情况、应用拓扑、scale、还可以直接通过浏览器进入容器内部调试等。

日志方案

评估容器云平台日志系统的标准:

易扩展:能够支撑集群规模的增长 开销低:尽量占用较少的系统资源 入侵小:尽量不需要改动应用容器和云平台系统 大集中:将所有分布在各个主机节点上的日志集中在一起分析和查询 易部署:方便自动化部署到分布式集群中 易定制:方便处理不同日志格式,方便对接不同的存储方式 实效性:日志在产生之后需要能在短时间内即可以进行查看分析 社区活跃:方便未来的维护和更新,方便功能扩展

日志方案一般有几种选择

  1. Fluentd + ElasticSearch + Kibana
  2. Filebeat + ElasticSearch + Kibana

其中Fluentd或Filebeat打包成容器,以kubernetes的 daemonset的形式运行,每个node节点上都会启动一个Fluentd或Filebeat的Pod。 整体来说两种方案大同小异。 对于ElasticSearch 和 Kibana可以容器化,也可以用传统的ansible的方式部署。

Fluentd + ElasticSearch + Kibana

先看方案一:Fluentd + ElasticSearch + Kibana Fluentd在Kubernetes集群中的部署架构 每个Node节点上都要有Fluentd-Elasticsearch这个Pod,有两种方式支持:1. 放在/etc/kubernetes/manifest下,用脚本自动启动;2. 用DaemonSet启动。这两种模式都是为了保证在每一个Kubernetes集群节点上都有一个Fluentd的驻留Pod运行来收集日志。Kubernetes中DaemonSet这个API对象就是为了驻留Pod而设计的。 整体日志管理系统的架构 在Kubernetes集群中的每个节点上运行一个Fluentd的容器,收集容器的日志发送给到ElasticSearch集群中。ElasticSearch集群会保存一周的日志作为热数据以供实时分析和查询,用户可以通过Kibana查看任意Node、Namespace、Service、Pod和容器的数据。对于超过一周的日志数据,ElasticSearch会自动备份到Swift对象存储的相应Bucket中。

架构图中Swift是作为日志备份的后端存储。 可替代的方案有AWS S3, Google Cloud Storage, HDFS等

参考 Kubernetes容器集群中的日志系统集成实践

关于如何配置 Fluentd 来采集 Kubernetes 的日志, 可以参考 Kubernetes Logging with Fluentd

Filebeat + ElasticSearch + Kibana

日志的话用的elk + filebeat。对于另外一个常用的方案fluentd我们也做过调研。 为什么不用fluentd,而用filebeat呢?有三个理由:

  1. 我们内部有一个elk集群,filebeat和elk几乎是配套的, 他的升级和elk是同步的, 兼容性比fluentd好(fluentd默认不支持输出到logstash,一般都是直接输出到es集群)
  2. filebeat的功能也一样很强大,足够轻量级, 能够满足我们的日志采集和分割需求。
  3. 我们对filebeat的配置比较熟悉 ,因此我们没有必要再去维护一个fluentd。

具体实施方式

  • 将所有的Pod的日志都挂载到宿主机上,每台主机上单独起一个日志收集Pod
  • filebeat的配置使用configmap管理,更加灵活
  • filebeat的应用pod使用daemonset部署, 每个主机上都会独立起一个filebeat pod
  • 在logstash的indexer上使用grok做日志切割, 切割后查看kibana日志, 可以看到会多出container_name, container_id, pod_name, namespace等字段

该方式的局限性

  • 需要统一日志收集规则,目录和输出方式, 应用的日志需要打到标准输出(stdout)
  • 没有应用的service的信息, 当然你也可以将type,即filebeat配置文件里的document_type字段设置为service的name,这样的话,就可以根据应用来检索日志了

参考文献