Kubernetes - 监控

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

使用Prometheus进行监控

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

Prometheus有多个组件可以参与监控 :

  • 普罗米修斯 : 它是废弃和存储数据的核心组件.

  • Prometheus node explore : 获取主机级矩阵并将它们暴露给普罗米修斯.

  • Ranch-eye : 是 haproxy 并将 cAdvisor 统计数据公开给普罗米修斯.

  • Grafana  : 去;可视化数据.

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

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

使用Prometheus进行监控

Sematext Docker代理

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

将代理部署到节点

Kubernetes提供DeamonSets,确保添加pod到群集.

配置SemaText Docker代理

它是通过环境变量配置的.

  • 在 apps.sematext.com

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

  • 创建Logsene应用程序以获取Logsene应用程序令牌. Logsene应用程序将保存您的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代理Docker

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

Kubernetes Log

Kubernetes容器的日志不多与Docker容器日志不同.但是,Kubernetes用户需要查看已部署的pod的日志.因此,让Kubernetes特定信息可用于日志搜索非常有用,例如 :

  • Kubernetes namespace

  • 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中将没有任何数据(由于你没有推送任何数据,这是预期的.)