Kubernetes - 监控



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

使用 Prometheus 进行监控

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

Prometheus 有多个组件参与监控 -

  • Prometheus - 它是核心组件,负责抓取和存储数据。

  • Prometheus 节点探测器 - 获取主机级别的指标并将其暴露给 Prometheus。

  • Ranch-eye - 是一个 haproxy,并将 cAdvisor 统计数据暴露给 Prometheus。

  • Grafana - 数据可视化。

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

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

Monitoring with Prometheus

Sematext Docker 代理

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

将代理部署到节点

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

配置 SemaText Docker 代理

它通过环境变量进行配置。

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

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

  • 创建一个 Logsene 应用程序以获取 Logsene 应用程序令牌。Logsene 应用程序将保存您的 Kubernetes 日志。

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

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

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

    • 将 SPM_TOKEN 和 LOGSENE_TOKEN 占位符替换为您自己的 SPM 和 Logsene 应用程序令牌。

创建 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 Stack 和 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"

Kibana UI 将可以通过容器端口 5601 和相应的宿主/节点端口组合访问。开始时,Kibana 中不会有任何数据(这是预期的,因为您还没有推送任何数据)。

广告

© . All rights reserved.