Kubernetes-모니터링

모니터링은 대규모 클러스터 관리를위한 핵심 구성 요소 중 하나입니다. 이를 위해 많은 도구가 있습니다.

Prometheus로 모니터링

모니터링 및 경고 시스템입니다. SoundCloud에서 구축되었으며 2012 년에 오픈 소스되었습니다. 다차원 데이터를 매우 잘 처리합니다.

Prometheus는 모니터링에 참여할 여러 구성 요소를 가지고 있습니다.

  • Prometheus − 데이터를 스크랩하고 저장하는 핵심 구성 요소입니다.

  • Prometheus node explore − 호스트 수준 매트릭스를 가져 와서 Prometheus에 노출합니다.

  • Ranch-eye −는 haproxy 및 노출 cAdvisor Prometheus에 대한 통계.

  • Grafana − 데이터 시각화.

  • InfuxDB − 목장주로부터 데이터를 저장하는 데 특별히 사용되는 시계열 데이터베이스.

  • Prom-ranch-exporter − 서비스 스택 상태를 Rancher 서버에 쿼리하는 데 도움이되는 간단한 node.js 애플리케이션입니다.

Sematext Docker 에이전트

최신 Docker 인식 메트릭, 이벤트 및 로그 수집 에이전트입니다. 모든 Docker 호스트에서 작은 컨테이너로 실행되며 모든 클러스터 노드 및 컨테이너에 대한 로그, 메트릭 및 이벤트를 수집합니다. 핵심 서비스가 Docker 컨테이너에 배포 된 경우 Kubernetes 핵심 서비스 용 컨테이너를 포함하여 모든 컨테이너 (하나의 포드에 여러 컨테이너가 포함될 수 있음)를 검색합니다. 배포 후 모든 로그와 지표를 즉시 사용할 수 있습니다.

노드에 에이전트 배포

Kubernetes는 클러스터에 포드가 추가되도록하는 DeamonSets를 제공합니다.

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 에이전트 Docker 실행

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

Kubernetes 로그

Kubernetes 컨테이너의 로그는 Docker 컨테이너 로그와 크게 다르지 않습니다. 그러나 Kubernetes 사용자는 배치 된 팟 (Pod)에 대한 로그를 확인해야합니다. 따라서 다음과 같은 로그 검색에 사용할 수있는 Kubernetes 관련 정보를 갖는 것이 매우 유용합니다.

  • Kubernetes 네임 스페이스
  • Kubernetes 포드 이름
  • 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에는 데이터가 없습니다 (데이터를 푸시하지 않았으므로 예상 됨).