Kubernetes(K8S) 监控

  • Kubernetes 监控

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

    这是一个监控和警报系统。它建立在SoundCloud上,并于2012年开源。它可以很好地处理多维数据。
    Prometheus有多个组件可以参与监控-
    • Prometheus-它是抓取和存储数据的核心组件。
    • Prometheus node explore-获取主机级别矩阵,并将其公开给Prometheus。
    • Ranch-eye- 是haproxy,将cAdvisor的统计信息暴露给Prometheus。
    • Grafana- 数据可视化。
    • InfuxDB - 时间序列数据库,专门用于存储牧场主的数据。
    • Prom-ranch-exporter -这是一个简单的node.js应用程序,可帮助查询Rancher服务器的服务堆栈状态。
    kubernets
  • Sematext Docker代理

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

    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"
    
    将在容器端口5601和相应的主机/节点端口组合处访问Kibana UI。开始时,在Kibana中将没有任何数据(这是您没有推送任何数据的预期结果)。