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 中不會有任何資料(這是預期的,因為您還沒有推送任何資料)。

廣告