Kubernetes - 监控


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

使用普罗米修斯进行监控

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

Prometheus 有多个组件参与监控 -

  • Prometheus - 它是废弃和存储数据的核心组件。

  • Prometheus 节点探索- 获取主机级别矩阵并将其公开给 Prometheus。

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

  • Grafana - 数据可视化。

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

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

使用普罗米修斯进行监控

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网址

对于 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 中不会有任何数据(这是预期的,因为您尚未推送任何数据)。