自 2020 年 1 月 Elastic Cloud on Kubernetes 发布以来,Elastic 正式支持 Google Kubernetes Engine (GKE)。此后,Google 扩展了 GKE,推出了新的服务产品和交付机制。其中一项新产品是 GKE Autopilot。GKE 是一个托管的 Kubernetes 环境,而 GKE Autopilot 是一种 Kubernetes 操作模式,其中 Google 管理您的集群配置、扩展、安全等。它已准备好投入生产,并消除了与工作负载管理、部署自动化和可扩展性规则等任务相关的许多挑战。Autopilot 让您可以专注于构建和部署应用程序,而 Google 管理其他一切。
Elastic 致力于支持 Google Kubernetes Engine (GKE) 的所有交付模式。10 月份,在 Google Cloud Next ‘22 活动期间,我们宣布了将 Elastic Agent 集成并认证到 Anthos、Autopilot、Google Distributed Cloud 等平台的意向。
自那次活动以来,我们一直与 Google 合作,以获得 Elastic Agent 在 Anthos 上使用的认证,但我们并没有止步于此。
今天,我们很高兴宣布,我们已获得在 GKE Autopilot 上运行的认证。
Elastic 和 GKE Autopilot 的实践
Kubernetes 可观测性从未如此简单
为了展示使用 Autopilot 和 Elastic 入门有多么容易,让我们演练一下如何在 Autopilot 集群上部署 Elastic Agent。我将展示如何使用 Elastic Agent 轻松设置和监控 Autopilot 集群,并使用 Kibana 集成来观察集群的行为。
GKE 和 GKE Autopilot 之间的主要区别之一是,Autopilot 保护系统命名空间“kube-system”。为了提高集群的稳定性和安全性,Autopilot 会阻止用户空间工作负载添加或修改系统 Pod。Elastic Agent 的默认配置是将其自身安装到系统命名空间中。我们在这里所做的大部分更改都是为了使 Elastic Agent 在不同的命名空间中运行。
让我们开始使用 Elastic Stack 吧!
在撰写本文时,我使用了最新版本的 Elastic。您开始使用 Elastic Observability 的最佳方式是
- 在 Elastic Cloud 上获取一个帐户,并观看此教程,以帮助您启动您的第一个堆栈,或者
- 在您的 Google 帐户上启动 Elastic Cloud
预置 Autopilot 集群和 Elastic 堆栈
为了测试代理,我首先部署了推荐的默认 GKE Autopilot 集群。Elastic 的 GKE 集成支持 kube-state-metrics (KSM),这将增加可用于报告和仪表板的报告指标的数量。与 Elastic Agent 一样,KSM 默认在系统命名空间中运行,因此我修改了它的清单以与 Autopilot 配合使用。为了进行测试,我还将一个基本的 Elastic 堆栈部署在与我的 Autopilot 集群相同的 Google 区域中的 Elastic Cloud 上。我使用了在 Elastic 的托管服务 (ESS) 上部署的新集群,但如果您使用的是通过 Google Marketplace 购买的 Elastic Cloud 订阅,则该过程是相同的。
将 Elastic Observability 添加到 GKE Autopilot
因为这是一个全新的部署,Elastic 建议向其添加集成。让我们将 Kubernetes 集成添加到新的部署中
Elastic 提供了数百个集成;通过在搜索栏中键入“kub”来过滤列表 (1),然后单击 Kubernetes 集成 (2)。
Kubernetes 集成页面提供了集成的概述,并允许您管理要观察的 Kubernetes 集群。我们尚未添加集群,因此我单击“添加 Kubernetes”以添加第一个集成。
我更改了集成名称以反映 Kubernetes 产品类型,然后单击“保存并继续”以接受集成默认值。
此时,已创建了一个 Agent 策略。现在是安装代理的时候了。我单击了“Kubernetes”集成。
然后,我选择了“集成策略”选项卡 (1) 并单击“添加代理” (2)。
最后,我下载了标准 GKE 环境的完整清单。
我们不会直接使用此清单,但它包含我们将在下一节中在 Autopilot 上部署代理所需的许多值。
Elastic 堆栈已准备就绪,正在等待 Autopilot 日志、指标和事件。现在是时候使用 Elastic Agent for GKE 将 Autopilot 连接到此部署了。
将 Autopilot 连接到 Elastic
在 Google Cloud 终端中,我下载并编辑了 GKE Autopilot 的 Elastic Agent 清单。
$ curl -o elastic-agent-managed-gke-autopilot.yaml \
https://github.com/elastic/elastic-agent/blob/autopilotdocumentaton/docs/manifests/elastic-agent-managed-gke-autopilot.yaml
我使用了云 Shell 编辑器来配置 Autopilot 和 Elastic 集群的清单。例如,我更新了以下内容
containers:
- name: elastic-agent
image: docker.elastic.co/beats/elastic-agent:8.16.1
我还将代理更改为我安装的 Elastic 版本 (8.6.0)。
从我之前下载的集成清单中,我将 FLEET_URL 和 FLEET_ENROLLMENT_TOKEN 的值复制到此 YAML 文件中。
现在是时候将更新的清单应用于 Autopilot 实例了。
在提交之前,我总是喜欢先使用干运行来查看将要创建的内容(并检查是否存在语法错误)。
$ clear
$ kubectl apply --dry-run="client" -f elastic-agent-managed-gke-autopilot.yaml
一切看起来都不错,这次我要真正执行了。
$ clear
$ kubectl apply -f elastic-agent-managed-gke-autopilot.yaml
几分钟后,指标将开始从 Autopilot 集群直接流入 Elastic 部署。
向 Autopilot 集群添加工作负载
观察一个没有工作负载的 Autopilot 集群是很无聊的,所以我部署了一个修改版的 Google Hipster Shop(包含 OpenTelemetry 报告)
$ git clone https://github.com/bshetti/opentelemetry-microservices-demo
$ cd opentelemetry-microservices-demo
$ nano ./deploy-with-collector-k8s/otelcollector.yaml
为了让应用程序的遥测数据与我们的 Elastic Stack 通信,我将所有导出器类型实例从 HTTP (otlphttp/elastic) 替换为 gRPC (otlp/elastic)。然后,我用我的 APM 端点替换了 OTEL_EXPORTER_OTLP_ENDPOINT,并用我的 APM OTEL Bearer 和 Token 替换了 OTEL_EXPORTER_OTLP_HEADERS。
然后我部署了 Hipster Shop。
$ kubectl create -f ./deploy-with-collector-k8s/adservice.yaml
$ kubectl create -f ./deploy-with-collector-k8s/redis.yaml
$ kubectl create -f ./deploy-with-collector-k8s/cartservice.yaml
$ kubectl create -f ./deploy-with-collector-k8s/checkoutservice.yaml
$ kubectl create -f ./deploy-with-collector-k8s/currencyservice.yaml
$ kubectl create -f ./deploy-with-collector-k8s/emailservice.yaml
$ kubectl create -f ./deploy-with-collector-k8s/frontend.yaml
$ kubectl create -f ./deploy-with-collector-k8s/paymentservice.yaml
$ kubectl create -f ./deploy-with-collector-k8s/productcatalogservice.yaml
$ kubectl create -f ./deploy-with-collector-k8s/recommendationservice.yaml
$ kubectl create -f ./deploy-with-collector-k8s/shippingservice.yaml
$ kubectl create -f ./deploy-with-collector-k8s/loadgenerator.yaml
一旦商店的所有 Pod 都运行起来,我便部署了 OpenTelemetry 收集器。
$ kubectl create -f ./deploy-with-collector-k8s/otelcollector.yaml
观察和可视化 Autopilot 的指标
现在我们已经向 Autopilot 集群添加了 Elastic Agent 并添加了工作负载,让我们来看看集成提供的开箱即用的 Kubernetes 可视化功能。
“[指标 Kubernetes] 概述” 是一个很好的起点。它提供了集群使用的资源的高级视图,并允许我深入研究我感兴趣的更具体的仪表板
例如,“[指标 Kubernetes] Pod” 提供了集群中部署的 Pod 的高级视图
“[指标 Kubernetes] 卷” 提供了对 Autopilot 集群中存储的分配和使用方式的深入视图
创建警报
从这里,我可以轻松地发现集群行为的模式,甚至可以创建警报。这是一个警报的示例,用于在我主存储卷(称为“卷”)超过其已分配空间的 80% 时通知我
经过少量工作,我从标准仪表板创建了这个视图
结论
今天,我展示了在 GKE Autopilot 集群上进行监控、观察和生成警报是多么容易。要了解更多关于可能实现的功能的信息,请参阅 Elastic 官方文档,了解 使用 Elastic Agent 进行 Autopilot 可观察性。
下一步
如果您还没有 Elastic,您可以立即开始免费试用 Elastic 试用版。通过 Marketplace 订阅,从 Elastic 和 Google 一起获得更多好处。Elastic 的功能不仅仅是与 GKE 集成 — 查看 Elastic 提供的近 300 个集成。