Kubernetes – 监控

Kubernetes – 监控


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

使用 Prometheus 进行监控

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

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

  • Prometheus – 它是抓取和存储数据的核心组件。

  • Prometheus node explore – 获取主机级矩阵并将它们暴露给 Prometheus。

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

  • 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 应用程序令牌。SPM 应用程序将保存您的 Kubernetes 性能指标和事件。

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

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

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

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

    • 将 SPM_TOKEN 和 LOGSENE_TOKEN 占位符替换为您的 SPM 和 Logsene App 令牌。

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

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁