Kubernetes – 监控
Kubernetes – 监控
监控是管理大型集群的关键组件之一。为此,我们有许多工具。
使用 Prometheus 进行监控
它是一个监控和警报系统。它是在 SoundCloud 构建的,并于 2012 年开源。它很好地处理了多维数据。
Prometheus 有多个组件可以参与监控 –
-
Prometheus – 它是抓取和存储数据的核心组件。
-
Prometheus node explore – 获取主机级矩阵并将它们暴露给 Prometheus。
-
Ranch-eye – 是一个haproxy并将cAdvisor统计数据暴露给Prometheus。
-
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 应用程序令牌。SPM 应用程序将保存您的 Kubernetes 性能指标和事件。
-
创建Logsene App,获取Logsene App Token。Logsene App 将保存您的 Kubernetes 日志。
-
在 DaemonSet 定义中编辑 LOGSENE_TOKEN 和 SPM_TOKEN 的值,如下所示。
-
获取最新的 sematext-agent-daemonset.yml(原始纯文本)模板(也如下所示)。
-
将其存储在磁盘上的某个位置。
-
将 SPM_TOKEN 和 LOGSENE_TOKEN 占位符替换为您的 SPM 和 Logsene App 令牌。
创建 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 网址
对于 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 中不会有任何数据(这是意料之中的,因为您尚未推送任何数据)。