在 Kubernetes 上独立运行 Elastic Agent
编辑在 Kubernetes 上独立运行 Elastic Agent
编辑所需条件
编辑- 已安装 kubectl.
-
用于存储和搜索数据的 Elasticsearch,以及用于可视化和管理的 Kibana。
要快速入门,请启动我们的 托管 Elasticsearch Service 的部署。Elasticsearch Service 在 AWS、GCP 和 Azure 上可用。 免费试用。
要安装和运行 Elasticsearch 和 Kibana,请参阅 安装 Elastic Stack。
-
kube-state-metrics
.您需要部署
kube-state-metrics
以获取有关集群上对象状态的指标(请参阅 Kubernetes 部署 文档)。您可以通过首先下载项目来完成此操作gh repo clone kubernetes/kube-state-metrics
然后部署它
kubectl apply -k kube-state-metrics
在托管的 Kubernetes 解决方案(例如 AKS、GKE 或 EKS)上,Elastic Agent 没有从 Kubernetes 控制平面 组件(如
kube-scheduler
和kube-controller-manager
)收集指标所需的权限。审核日志也仅在 Kubernetes 控制平面节点上可用,因此 Elastic Agent 无法收集。请参阅此处以了解更多信息。有关特定云提供商的更多信息,请参阅在由 Fleet 管理的 Azure AKS 上运行 Elastic Agent,在由 Fleet 管理的 GKE 上运行 Elastic Agent 和在由 Fleet 管理的 Amazon EKS 上运行 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"
有关所有可用选项,请参阅环境变量。
步骤 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/master
从 Kubernetes 版本 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 中查看您的数据
编辑-
启动 Kibana
- 登录到您的 Elastic Cloud 帐户。
- 导航到您的部署中的 Kibana 端点。
将您的浏览器指向 https://127.0.0.1:5601,将
localhost
替换为 Kibana 主机的名称。 - 您可以通过转到分析 → 发现并选择索引
metrics-*
,或者更具体地说,metrics-kubernetes.*
来查看数据流入情况。如果您看不到这些索引,请为它们创建一个数据视图。 - 您可以通过选择分析→仪表板来查看预定义的仪表板,或者通过通过集成安装资产。
Red Hat OpenShift 配置
编辑如果您使用的是 Red Hat OpenShift,则需要在清单文件中指定其他设置,并允许容器以特权方式运行。
-
在清单文件中,修改
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 的每个特定安装,可以在secrets
或configmaps
中找到它。在某些安装中,它可以作为服务帐户机密的一部分提供,位于/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:
-
-
-
授予
elastic-agent
服务帐户对特权 SCC 的访问权限oc adm policy add-scc-to-user privileged system:serviceaccount:kube-system:elastic-agent
此命令允许容器作为 OpenShift 的管理员获得特权。
-
如果 elastic-agent 运行所在的命名空间设置了
"openshift.io/node-selector"
注释,则 elastic-agent 可能不会在所有节点上运行。在这种情况下,请考虑覆盖命名空间的节点选择器以允许在任何节点上进行调度oc patch namespace kube-system -p \ '{"metadata": {"annotations": {"openshift.io/node-selector": ""}}}'
此命令将项目的节点选择器设置为空字符串。
自动发现目标 Pod
编辑有关更多信息,请参阅使用 Elastic Agent 进行 Kubernetes 自动发现。