监控是管理大型集群的关键组件之一.为此,我们提供了许多工具.
这是一个监控和警报系统.它是在SoundCloud上构建的,并于2012年开源.它可以很好地处理多维数据.
Prometheus有多个组件可以参与监控 :
普罗米修斯 : 它是废弃和存储数据的核心组件.
Prometheus node explore : 获取主机级矩阵并将它们暴露给普罗米修斯.
Ranch-eye : 是 haproxy 并将 cAdvisor 统计数据公开给普罗米修斯.
Grafana : 去;可视化数据.
InfuxDB : 时间序列数据库专门用于存储来自牧场主的数据.
Prom-ranch-exporter : 它是一个简单的node.js应用程序,它有助于向Rancher服务器查询服务堆栈的状态.
这是一个支持Docker的现代指标,事件和日志收集代理.它在每个Docker主机上作为一个小容器运行,并为所有群集节点和容器收集日志,指标和事件.如果核心服务部署在Docker容器中,它会发现所有容器(一个pod可能包含多个容器),包括Kubernetes核心服务的容器.部署完成后,所有日志和指标都可立即使用.
Kubernetes提供DeamonSets,确保添加pod到群集.
它是通过环境变量配置的.
在 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占位符.
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 create -f sematext-agent-daemonset.yml daemonset "sematext-agent-daemonset" created
Kubernetes容器的日志不多与Docker容器日志不同.但是,Kubernetes用户需要查看已部署的pod的日志.因此,让Kubernetes特定信息可用于日志搜索非常有用,例如 :
Kubernetes namespace
Kubernetes pod名称
Kubernetes容器名称
Docker图像名称
Kubernetes UID
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,我们提供Elasticsearch URL作为环境变量.
- name: KIBANA_ES_URL value: "http://elasticsearch.elk.svc.cluster.local:9200" - name: KUBERNETES_TRUST_CERT value: "true"
Kibana UI可以在容器端口5601和相应的主机/节点端口组合中访问.当你开始时,Kibana中将没有任何数据(由于你没有推送任何数据,这是预期的.)