在 Kubernetes 上独立运行 Elastic Agent
编辑在 Kubernetes 上独立运行 Elastic Agent
编辑您需要什么
编辑- 已安装 kubectl.
-
Elasticsearch 用于存储和搜索您的数据,Kibana 用于可视化和管理数据。
要快速入门,请启动我们 托管的 Elasticsearch 服务 的部署。Elasticsearch 服务可在 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.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"
有关所有可用选项,请参阅 环境变量。
步骤 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/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 中查看您的数据
编辑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 安装程序 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:
-
-
-
授予
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 自动发现。