监控是管理大型集群的关键组件之一.为此,我们提供了许多工具.
使用Prometheus进行监控
这是一个监控和警报系统.它是在SoundCloud上构建的,并于2012年开源.它可以很好地处理多维数据.
Prometheus有多个组件可以参与监控 :
普罗米修斯 : 它是废弃和存储数据的核心组件.
Prometheus node explore : 获取主机级矩阵并将它们暴露给普罗米修斯.
Ranch-eye : 是 haproxy 并将 cAdvisor 统计数据公开给普罗米修斯.
Grafana : 去;可视化数据.
InfuxDB : 时间序列数据库专门用于存储来自牧场主的数据.
Prom-ranch-exporter : 它是一个简单的node.js应用程序,它有助于向Rancher服务器查询服务堆栈的状态.
Sematext Docker代理
这是一个支持Docker的现代指标,事件和日志收集代理.它在每个Docker主机上作为一个小容器运行,并为所有群集节点和容器收集日志,指标和事件.如果核心服务部署在Docker容器中,它会发现所有容器(一个pod可能包含多个容器),包括Kubernetes核心服务的容器.部署完成后,所有日志和指标都可立即使用.
将代理部署到节点
Kubernetes提供DeamonSets,确保添加pod到群集.
配置SemaText Docker代理
它是通过环境变量配置的.
在 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占位符.
创建DaemonSet对象
apiVersion: extensions/v1beta1kind: DaemonSetmetadata: name: sematext-agentspec: 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.ymldaemonset "sematext-agent-daemonset" created
Kubernetes Log
Kubernetes容器的日志不多与Docker容器日志不同.但是,Kubernetes用户需要查看已部署的pod的日志.因此,让Kubernetes特定信息可用于日志搜索非常有用,例如 :
Kubernetes namespace
Kubernetes pod名称
Kubernetes容器名称
Docker图像名称
Kubernetes UID
使用ELK Stack和LogSpout
ELK堆栈包括Elasticsearch,Logstash和Kibana.要收集日志并将日志转发到日志记录平台,我们将使用LogSpout(尽管还有其他选项,如FluentD).
以下代码显示如何在Kubernetes上设置ELK集群和为ElasticSearch创建服务 :
apiVersion: v1kind: Servicemetadata: name: elasticsearch namespace: elk labels: component: elasticsearchspec: type: LoadBalancer selector: component: elasticsearch ports: - name: http port: 9200 protocol: TCP - name: transport port: 9300 protocol: TCP
创建复制控制器
apiVersion: v1kind: ReplicationControllermetadata: name: es namespace: elk labels: component: elasticsearchspec: replicas: 1 template: metadata: labels: component: elasticsearchspec:serviceAccount: elasticsearchcontainers: - 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: 9300volumeMounts:- mountPath: /data name: storagevolumes: - name: storage emptyDir: {}
Kibana URL
对于Kibana,我们提供Elasticsearch URL作为环境变量.
- name: KIBANA_ES_URLvalue: "http://elasticsearch.elk.svc.cluster.local:9200"- name: KUBERNETES_TRUST_CERTvalue: "true"
Kibana UI可以在容器端口5601和相应的主机/节点端口组合中访问.当你开始时,Kibana中将没有任何数据(由于你没有推送任何数据,这是预期的.)