在 Kubernetes 上独立运行 Elastic Agent

编辑

所需条件

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

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

下载清单文件

curl -L -O https://raw.githubusercontent.com/elastic/elastic-agent/v8.17.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,而是运行专用的独立 Elastic Agent 实例,以使用 Deployment 来收集集群范围的指标,并使用 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 的清单定义了在这些节点上运行的容忍度。在控制平面节点上运行的代理从 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 安装程序 用于 GCP 时,将以下 configmap 挂载到 elastic-agent pod 中,并在 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 自动发现