Kubernetes - 监控

监控是管理大型集群的关键组件之一。 为此,我们有许多工具。


使用 Prometheus 进行监控

这是一个监控和警报系统。 它是在 SoundCloud 构建的,于 2012 年开源。它很好地处理了多维数据。

Prometheus 有多个组件参与监控 −

  • Prometheus − 它是对数据进行报废和存储的核心组件。

  • Prometheus node explore − 获取主机级矩阵并将它们公开给 Prometheus。

  • Ranch-eye − 是一个 haproxy 并向 Prometheus 公开 cAdvisor 统计信息。

  • Grafana − 数据可视化。

  • InfuxDB − 专门用于存储来自 rancher 数据的时间序列数据库。

  • Prom-ranch-exporter − 它是一个简单的 node.js 应用程序,它有助于查询 Rancher 服务器的服务堆栈状态。

Monitoring with Prometheus

Sematext Docker 代理

它是一个现代的 Docker 感知指标、事件和日志收集代理。 它在每个 Docker 主机上作为一个微型容器运行,并为所有集群节点和容器收集日志、指标和事件。 如果核心服务部署在 Docker 容器中,它会发现所有容器(一个 pod 可能包含多个容器),包括 Kubernetes 核心服务的容器。 部署后,所有日志和指标立即可用。


将代理部署到节点

Kubernetes 提供 DeamonSets 确保将 pod 添加到集群中。


配置 SemaText Docker 代理

通过环境变量配置。

  • 如果您还没有,请在 apps.sematext.com 获得一个免费帐户。

  • 创建"Docker"类型的 SPM 应用程序以获取 SPM 应用程序令牌。 SPM App 将保存您的 Kubernetes 性能指标和事件。

  • 创建Logsene App,获取Logsene App Token。 Logsene App 将保存您的 Kubernetes 日志。

  • 编辑 DaemonSet 定义中 LOGSENE_TOKEN 和 SPM_TOKEN 的值,如下所示。

    • 获取最新的 sematext-agent-daemonset.yml(原始纯文本)模板(如下所示)。

    • 将其存储在磁盘上的某个位置。

    • 用您的 SPM 和 Logsene 应用令牌替换 SPM_TOKEN 和 LOGSENE_TOKEN 占位符。


创建 DaemonSet 对象

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
   name: sematext-agent
spec:
   template:
      metadata:
         labels:
            app: sematext-agent
      spec:
         selector: {}
         dnsPolicy: "ClusterFirst"
         restartPolicy: "Always"
         containers:
         - name: sematext-agent
            image: sematext/sematext-agent-docker:latest
            imagePullPolicy: "Always"
            env:
            - name: SPM_TOKEN
               value: "REPLACE THIS WITH YOUR SPM TOKEN"
            - name: LOGSENE_TOKEN
               value: "REPLACE THIS WITH YOUR LOGSENE TOKEN"
            - name: KUBERNETES
               value: "1"
            volumeMounts:
               - mountPath: /var/run/docker.sock
                  name: docker-sock
               - mountPath: /etc/localtime
                  name: localtime
            volumes:
               - name: docker-sock
                  hostPath:
                     path: /var/run/docker.sock
               - name: localtime
                  hostPath:
                     path: /etc/localtime

使用 kubectl 运行 Sematext Agent Docker

$ kubectl create -f sematext-agent-daemonset.yml
daemonset "sematext-agent-daemonset" created

Kubernetes 日志

Kubernetes 容器的日志与 Docker 容器日志没有太大区别。 但是,Kubernetes 用户需要查看已部署 Pod 的日志。 因此,让 Kubernetes 特定的信息可用于日志搜索非常有用,例如 −

  • Kubernetes 命名空间
  • Kubernetes pod 名称
  • Kubernetes 容器名称
  • Docker 镜像名称
  • Kubernetes UID

使用 ELK 堆栈和 LogSpout

ELK 堆栈包括 Elasticsearch、Logstash 和 Kibana。 为了收集日志并将其转发到日志平台,我们将使用 LogSpout(尽管还有其他选项,例如 FluentD)。

以下代码展示了如何在 Kubernetes 上设置 ELK 集群并为 ElasticSearch 创建服务 −

apiVersion: v1
kind: Service
metadata:
   name: elasticsearch
   namespace: elk
   labels:
      component: elasticsearch
spec:
   type: LoadBalancer
   selector:
      component: elasticsearch
   ports:
   - name: http
      port: 9200
      protocol: TCP
   - name: transport
      port: 9300
      protocol: TCP

创建复制控制器

apiVersion: v1
kind: ReplicationController
metadata:
   name: es
   namespace: elk
   labels:
      component: elasticsearch
spec:
   replicas: 1
   template:
      metadata:
         labels:
            component: elasticsearch
spec:
serviceAccount: elasticsearch
containers:
   - name: es
      securityContext:
      capabilities:
      add:
      - IPC_LOCK
   image: quay.io/pires/docker-elasticsearch-kubernetes:1.7.1-4
   env:
   - name: KUBERNETES_CA_CERTIFICATE_FILE
   value: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
   - name: NAMESPACE
   valueFrom:
      fieldRef:
         fieldPath: metadata.namespace
   - name: "CLUSTER_NAME"
      value: "myesdb"
   - name: "DISCOVERY_SERVICE"
      value: "elasticsearch"
   - name: NODE_MASTER
      value: "true"
   - name: NODE_DATA
      value: "true"
   - name: HTTP_ENABLE
      value: "true"
ports:
- containerPort: 9200
   name: http
   protocol: TCP
- containerPort: 9300
volumeMounts:
- mountPath: /data
   name: storage
volumes:
   - name: storage
      emptyDir: {}

Kibana URL

对于 Kibana,我们提供 Elasticsearch URL 作为环境变量。

- name: KIBANA_ES_URL
value: "http://elasticsearch.elk.svc.cluster.local:9200"
- name: KUBERNETES_TRUST_CERT
value: "true"

可以在容器端口 5601 和相应的 host/Node 端口组合处访问 Kibana UI。 开始时,Kibana 中不会有任何数据(这是意料之中的,因为您没有推送任何数据)。