在 Kubernetes 上独立运行 Elastic Agent

编辑

您需要什么

编辑
步骤 1:下载 Elastic Agent 清单
编辑

您可以在 此处 找到 Elastic Agent Docker 镜像。

下载清单文件

curl -L -O https://raw.githubusercontent.com/elastic/elastic-agent/v8.16.0/deploy/kubernetes/elastic-agent-standalone-kubernetes.yaml

您可能需要调整清单中 Elastic Agent 容器的 资源限制。容器资源使用情况取决于数据流的数量和环境大小。

此清单包括 Kubernetes 集成以收集 Kubernetes 指标和系统集成以从节点收集系统级指标和日志。

Elastic Agent 部署为 DaemonSet,以确保集群的每个节点上都有一个正在运行的实例。这些实例用于从主机检索大多数指标,例如系统指标、Docker 统计信息以及在 Kubernetes 之上运行的所有服务的指标。这些指标可通过部署的 kube-state-metrics 访问。请注意,默认情况下,所有内容都部署在 kube-system 命名空间下。要更改命名空间,请修改清单文件。

此外,DaemonSet 中的一个 Pod 将持续保持一个领导者锁定,使其负责处理集群范围内的监控。您可以在 领导者选举提供程序 中找到有关领导者选举配置选项的更多信息。领导者 Pod 将检索对整个集群唯一的指标,例如 Kubernetes 事件或 kube-state-metrics。我们通过在清单中应用以下 条件(在声明具有这些指标集的数据流之前),确保从领导者 Pod 中检索这些指标

...
inputs:
  - id: kubernetes-cluster-metrics
    condition: ${kubernetes_leaderelection.leader} == true
    type: kubernetes/metrics
    # metricsets with the state_ prefix and the metricset event
...

出于 Kubernetes 安全态势管理 (KSPM) 目的,Elastic Agent 需要读取各种 Kubernetes 资源、节点进程和文件的权限。为此,Elastic Agent 对必要的资源授予读取权限,并挂载来自托管节点文件系统的卷以允许 Elastic Agent Pod 访问。

Kubernetes 集群中的节点大小和数量有时可能很大,在这种情况下,收集集群级别指标的 Pod 可能需要比您希望分配给 DaemonSet 中所有 Pod 更多的运行时资源。如果资源不足,收集集群范围指标的领导者可能会遇到性能问题。在这种情况下,用户可能会考虑避免使用具有领导者选举策略的单个 DaemonSet,而是使用 Deployment 运行一个专用的独立 Elastic Agent 实例来收集集群范围的指标,此外还可以使用 DaemonSet 收集每个节点的指标。然后,可以独立且适当地为 Deployment 和 DaemonSet 分配资源。有关更多信息,请查看 在 Kubernetes 上扩展 Elastic Agent 页面。

步骤 2:连接到 Elastic Stack
编辑

在部署清单之前设置 Elasticsearch 设置

- name: ES_USERNAME
  value: "elastic" 
- name: ES_PASSWORD
  value: "passpassMyStr0ngP@ss" 
- name: ES_HOST
  value: "https://somesuperhostiduuid.europe-west1.gcp.cloud.es.io:9243" 

用于连接到 Elasticsearch 的基本身份验证用户名。

用于连接到 Kibana 的基本身份验证密码。

要与其通信的 Elasticsearch 主机。

有关所有可用选项,请参阅 环境变量

步骤 3:配置容忍度
编辑

Kubernetes 控制平面节点可以使用 污点 来限制可以在其上运行的工作负载。独立 Elastic Agent 的清单定义了容忍度以在其上运行。在控制平面节点上运行的 Agent 会收集 Kubernetes 的控制平面组件(调度程序、控制器管理器)的指标。要禁用 Elastic Agent 在控制平面节点上运行,请删除 DaemonSet 规范的以下部分

spec:
  # Tolerations are needed to run Elastic Agent on Kubernetes control-plane nodes.
  # Agents running on control-plane nodes collect metrics from the control plane components (scheduler, controller manager) of Kubernetes
  tolerations:
    - key: node-role.kubernetes.io/control-plane
      effect: NoSchedule
    - key: node-role.kubernetes.io/master
      effect: NoSchedule

这两个容忍度都执行相同的操作,但 node-role.kubernetes.io/masterKubernetes 版本 v1.25 开始已弃用

步骤 4:部署 Elastic Agent
编辑

要将 Elastic Agent 部署到 Kubernetes,请运行

kubectl create -f elastic-agent-standalone-kubernetes.yaml

要检查状态,请运行

$ kubectl -n kube-system get pods -l app=elastic-agent
NAME                            READY   STATUS    RESTARTS   AGE
elastic-agent-4665d             1/1     Running   0          81m
elastic-agent-9f466c4b5-l8cm8   1/1     Running   0          81m
elastic-agent-fj2z9             1/1     Running   0          81m
elastic-agent-hs4pb             1/1     Running   0          81m

在只读文件系统上运行 Elastic Agent

如果您想在 Kubernetes 的只读文件系统上运行 Elastic Agent,可以通过指定 readOnlyRootFilesystem 选项来实现。

步骤 5:在 Kibana 中查看您的数据
编辑
  1. 启动 Kibana

    1. 登录 您的 Elastic Cloud 帐户。
    2. 导航到部署中的 Kibana 端点。
  2. 您可以通过转到 分析 → 发现 并选择索引 metrics-* 或更具体的 metrics-kubernetes.* 来查看数据流。如果您看不到这些索引,请 为其创建数据视图
  3. 您可以通过选择 分析 → 仪表板 或通过 通过集成安装资产 来查看预定义的仪表板。

Red Hat OpenShift 配置

编辑

如果您使用的是 Red Hat OpenShift,则需要在清单文件中指定其他设置并启用容器以特权方式运行。

  1. 在清单文件中,修改 agent-node-datastreams ConfigMap 并调整输入

    • kubernetes-cluster-metrics 输入

      • 如果使用 https 访问 kube-state-metrics,请将以下设置添加到所有 kubernetes.state_* 数据集中

          bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
          ssl.certificate_authorities:
            - /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt
    • kubernetes-node-metrics 输入

      • kubernetes.controllermanager 数据流条件更改为

        condition: ${kubernetes.labels.app} == 'kube-controller-manager'
      • kubernetes.scheduler 数据流条件更改为

        condition: ${kubernetes.labels.app} == 'openshift-kube-scheduler'
      • kubernetes.proxy 数据流配置应如下所示

        - data_stream:
            dataset: kubernetes.proxy
            type: metrics
          metricsets:
            - proxy
          hosts:
            - 'localhost:29101'
          period: 10s
      • 将以下设置添加到连接到 https://${env.NODE_NAME}:10250 的所有数据流

          bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
          ssl.certificate_authorities:
            - /path/to/ca-bundle.crt

        ca-bundle.crt 可以是包含 Kubelet API 中使用的证书颁发机构的任何 CA 捆绑包。根据 OpenShift 的每个特定安装,这可以在 secretsconfigmaps 中找到。在某些安装中,它可以作为服务帐户密钥的一部分提供,位于 /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt 中。当使用 OpenShift 安装程序 for GCP 时,请在 elastic-agent Pod 中挂载以下 configmap 并在 ssl.certificate_authorities 中使用 ca-bundle.crt

        Name:         kubelet-serving-ca
        Namespace:    openshift-kube-apiserver
        Labels:       <none>
        Annotations:  <none>
        
        Data
        ====
        ca-bundle.crt:
  2. 授予 elastic-agent 服务帐户对特权 SCC 的访问权限

    oc adm policy add-scc-to-user privileged system:serviceaccount:kube-system:elastic-agent

    此命令使容器能够以 OpenShift 的管理员身份获得特权。

  3. 如果 elastic-agent 正在运行的命名空间设置了 "openshift.io/node-selector" 注解,则 elastic-agent 可能无法在所有节点上运行。在这种情况下,请考虑覆盖命名空间的节点选择器以允许在任何节点上调度

    oc patch namespace kube-system -p \
    '{"metadata": {"annotations": {"openshift.io/node-selector": ""}}}'

    此命令将项目的节点选择器设置为空字符串。

自动发现目标 Pod
编辑

有关更多信息,请参阅 使用 Elastic Agent 进行 Kubernetes 自动发现