Kubernetes - 监控
监控是管理大型集群的关键组件之一。 为此,我们有许多工具。
使用 Prometheus 进行监控
这是一个监控和警报系统。 它是在 SoundCloud 构建的,于 2012 年开源。它很好地处理了多维数据。
Prometheus 有多个组件参与监控 −
Prometheus − 它是对数据进行报废和存储的核心组件。
Prometheus node explore − 获取主机级矩阵并将它们公开给 Prometheus。
Ranch-eye − 是一个 haproxy 并向 Prometheus 公开 cAdvisor 统计信息。
Grafana − 数据可视化。
InfuxDB − 专门用于存储来自 rancher 数据的时间序列数据库。
Prom-ranch-exporter − 它是一个简单的 node.js 应用程序,它有助于查询 Rancher 服务器的服务堆栈状态。
Sematext Docker 代理
它是一个现代的 Docker 感知指标、事件和日志收集代理。 它在每个 Docker 主机上作为一个微型容器运行,并为所有集群节点和容器收集日志、指标和事件。 如果核心服务部署在 Docker 容器中,它会发现所有容器(一个 pod 可能包含多个容器),包括 Kubernetes 核心服务的容器。 部署后,所有日志和指标立即可用。
将代理部署到节点
Kubernetes 提供 DeamonSets 确保将 pod 添加到集群中。
配置 SemaText Docker 代理
通过环境变量配置。
如果您还没有,请在 apps.sematext.com 获得一个免费帐户。
创建"Docker"类型的 SPM 应用程序以获取 SPM 应用程序令牌。 SPM App 将保存您的 Kubernetes 性能指标和事件。
创建Logsene App,获取Logsene App Token。 Logsene App 将保存您的 Kubernetes 日志。
编辑 DaemonSet 定义中 LOGSENE_TOKEN 和 SPM_TOKEN 的值,如下所示。
获取最新的 sematext-agent-daemonset.yml(原始纯文本)模板(如下所示)。
将其存储在磁盘上的某个位置。
用您的 SPM 和 Logsene 应用令牌替换 SPM_TOKEN 和 LOGSENE_TOKEN 占位符。
创建 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 堆栈和 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 和相应的 host/Node 端口组合处访问 Kibana UI。 开始时,Kibana 中不会有任何数据(这是意料之中的,因为您没有推送任何数据)。