如何在 Azure AKS 上自动部署 Elasticsearch

24 阅读7分钟

作者:来自 Elastic Eduard Martin

学习如何使用 Azure 上的 AKS Automatic 和 ECK 部署 Elasticsearch 与 Kibana,以实现部分托管的 Elasticsearch 设置配置。

Elasticsearch 新手?加入我们的 Elasticsearch 入门网络研讨会。你也可以开始免费 cloud 试用,或者现在在你的机器上尝试 Elastic。


这篇文章是一个系列的一部分,我们将学习如何使用不同的基础设施安装 Elasticsearch。

ECK 比基于 Marketplace 的 Elastic Cloud 方案需要更多工作量,但比你自己部署 VM 更自动化,因为 Kubernetes operator 会负责系统编排和节点扩缩。

这次我们将使用 Azure Kubernetes Service (AKS),采用 Automatic。在其他文章中,你将学习如何使用 Azure VMAzure Marketplace

什么是 AKS Automatic?

Azure Kubernetes Service (AKS) 会自动管理集群设置、动态分配资源,并集成安全最佳实践,同时保留 Kubernetes 灵活性,让开发者能够在几分钟内从容器镜像到已部署应用。

AKS Automatic 去除了大部分集群管理开销,并在简单性与灵活性之间取得良好平衡。根据你的使用场景选择最佳方案,但如果你计划:

  •  部署测试环境:部署快速且简单,非常适合快速实验或短期集群
  • 不需要严格 VM、存储或网络要求:AKS Automatic 提供预设默认值,如果它们适合你的需求,可以避免额外配置
  • 第一次使用 Kubernetes:它处理大量集群设置,降低学习门槛,让团队专注在应用本身

Source: Quickstart: Create an Azure Kubernetes Service (AKS) Automatic cluster (preview)

对于 Elasticsearch,我们将使用 Elastic Cloud on Kubernetes (ECK),它是官方的 Elastic Kubernetes operator,用来简化 Elastic Stack 在 Kubernetes 上的部署编排。

如何设置 AKS Automatic

1)登录 Microsoft Azure Portal

2)在右上角点击 Cloud Shell 按钮进入控制台,并从那里部署 AKS 集群。或者,你也可以使用 Azure Cloud Shell

记得在教程过程中把 project ID 更新成你自己的

打开 AKS 后应该会和上面的截图类似。

3)安装 aks-preview Azure CLI 扩展。这个预览版本允许我们在创建集群时选择 --sku automatic,从而启用 AKS Automatic 功能。

`az extension add --name aks-preview`AI写代码

如果你看到这个消息,表示 AKS 扩展已经正确安装。

4)使用 az feature register 命令注册 feature flags

`az feature register --namespace Microsoft.ContainerService --name AutomaticSKUPreview`AI写代码

你将看到我们刚创建的 feature 订阅的详细信息:

检查注册状态,直到它从 “Registering” 变为 “Registered”。注册完成可能需要几分钟。

`az feature show --namespace Microsoft.ContainerService --name AutomaticSKUPreview`AI写代码

运行 az provider register 来传播更改。

`az provider register --namespace Microsoft.ContainerService`AI写代码

5)创建资源组

资源组是用于管理和部署的一组逻辑 Azure 资源。

`az group create --name elastic-resource --location eastus`AI写代码

6)创建 Autopilot 集群。我们将其命名为 myAKSAutomaticCluster,并使用刚创建的资源组。确保你在以下任意 VM 类型上有 16 个 vCPU 可用:[Standard_D4pds_v5](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dpsv5-series "Standard_D4pds_v5")[Standard_D4lds_v5](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dldsv5-series "Standard_D4lds_v5")[Standard_D4ads_v5](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dadsv5-series "Standard_D4ads_v5")[Standard_D4ds_v5](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/ddsv5-series "Standard_D4ds_v5")[Standard_D4d_v5](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/ddv5-series "Standard_D4d_v5")[Standard_D4d_v4](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/ddv4-series "Standard_D4d_v4")[Standard_DS3_v2](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dsv3-series "Standard_DS3_v2")[Standard_DS12_v2](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/memory-optimized/dv2-dsv2-series-memory "Standard_DS12_v2"),以便 AKS 分配资源。

`

1.  az aks create \
2.      --resource-group elastic-resource \
3.      --name myAKSAutomaticCluster \
4.      --sku automatic \
5.      --generate-ssh-keys

`AI写代码

如果出现 MissingSubscriptionRegistration 错误,请回到第 4 步处理缺失的订阅。例如,如果提示 “The subscription is not registered to use namespace 'microsoft.insights'”,则需要运行 az provider register --namespace Microsoft.Insights

按照交互式登录操作:

系统会提示你运行 az login。你需要执行该命令,然后等待完成。

7)等待集群准备就绪。创建大约需要 10 分钟。

8)配置 kubectl 命令行访问权限。

`az aks get-credentials --resource-group elastic-resource --name myAKSAutomaticCluster`AI写代码

注意,我们安装的扩展启用了 AKS Automatic。

9)确认节点已部署。

`kubectl get nodes`AI写代码

你会看到一个 forbidden 错误消息;从错误中复制用户 ID。

10)将你的用户添加到 AKS 访问控制中。

获取 AKS ID,并复制命令的输出。

使用 AKS ID 和你的用户 principal ID 创建角色分配。

`az role assignment create --role "Azure Kubernetes Service RBAC Cluster Admin" --assignee <PRINCIPAL_ID> --scope <AKS_ID>`AI写代码

11)再次尝试确认节点是否已部署。

`kubectl get nodes`AI写代码

12)安装 Elastic Cloud on Kubernetes (ECK) operator。

`

1.  # Install ECK Custom Resource Definitions
2.  kubectl create -f https://download.elastic.co/downloads/eck/2.16.1/crds.yaml

4.  # Install the ECK operator
5.  kubectl apply -f https://download.elastic.co/downloads/eck/2.16.1/operator.yaml

`AI写代码

13)我们来创建一个使用默认值的单节点 Elasticsearch 实例。

`

1.  cat <<EOF | kubectl apply -f -
2.  apiVersion: elasticsearch.k8s.elastic.co/v1
3.  kind: Elasticsearch
4.  metadata:
5.    name: quickstart
6.  spec:
7.    version: 9.0.0
8.    nodeSets:
9.    - name: default
10.      count: 1
11.      config:
12.        node.store.allow_mmap: false
13.  EOF

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

我们禁用了 nmap,因为默认 AKS 机器的 vm.max_map_count 值太低。禁用它不推荐用于生产环境,正确做法是增加 vm.max_map_count 的值。你可以在这里了解更多操作方法。

14)我们还将部署一个 Kibana 单节点集群。对于 Kibana,我们将添加一个负载均衡器,这样我们就能获得一个外部 IP,从设备访问 Kibana。

`

1.  cat <<EOF | kubectl apply -f -
2.  apiVersion: kibana.k8s.elastic.co/v1
3.  kind: Kibana
4.  metadata:
5.    name: quickstart
6.  spec:
7.    version: 9.0.0
8.    http:
9.      service:
10.        spec:
11.          type: LoadBalancer
12.    count: 1
13.    elasticsearchRef:
14.      name: quickstart
15.  EOF

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

默认情况下,AKS Automatic 会将负载均衡器配置为 public;你可以通过设置 metadata annotation 来更改此行为:

`service.beta.kubernetes.io/azure-load-balancer-internal: "true"`AI写代码

15)检查你的 pods 是否正在运行。

`kubectl get pods`AI写代码

16)你也可以运行 kubectl get elasticsearchkubectl get kibana 来查看更具体的统计信息,如 Elasticsearch 版本、节点和健康状态。

17)访问你的服务。

`kubectl get svc`AI写代码

这会在 [EXTERNAL-IP](https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/accessing-services "EXTERNAL-IP") 下显示 Kibana 的外部 URL。负载均衡器的配置可能需要几分钟。复制 EXTERNAL-IP 的值。

18)获取 elastic 用户的 Elasticsearch 密码:

`kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode`AI写代码

19)通过浏览器访问 Kibana:

  • URL:https://<EXTERNAL_IP>:5601
  • 用户名:elastic
  • 密码:c44A295CaEt44D6xIzN6Zs5m(来自上一步)

2)从浏览器访问 Elastic Cloud 时,你会看到欢迎界面。

如果你想更改 Elasticsearch 集群规格,比如更改或调整节点大小,可以使用新的设置再次应用 YML 清单:

`

1.  cat <<EOF | kubectl apply -f -
2.  apiVersion: elasticsearch.k8s.elastic.co/v1
3.  kind: Elasticsearch
4.  metadata:
5.    name: quickstart
6.  spec:
7.    version: 9.0.0
8.    nodeSets:
9.      - name: default
10.        count: 2
11.        config:
12.          node.store.allow_mmap: false
13.        podTemplate:
14.          spec:
15.            containers:
16.              - name: elasticsearch
17.                resources:
18.                  requests:
19.                    memory: 1.5Gi
20.                    cpu: 2
21.                  limits:
22.                    memory: 1.5Gi
23.                    cpu: 2
24.  EOF

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

在这个示例中,我们将添加一个节点并修改 RAM 和 CPU。正如你所看到的,现在 kubectl get elasticsearch 显示有 2 个节点:

Kibana 也同样适用:

`

1.  cat <<EOF | kubectl apply -f -
2.  apiVersion: kibana.k8s.elastic.co/v1
3.  kind: Kibana
4.  metadata:
5.    name: quickstart
6.  spec:
7.    version: 9.0.0
8.    http:
9.      service:
10.        spec:
11.          type: LoadBalancer
12.    count: 1
13.    elasticsearchRef:
14.      name: quickstart
15.    podTemplate:
16.      spec:
17.        containers:
18.          - name: kibana
19.            env:
20.              - name: NODE_OPTIONS
21.                value: "--max-old-space-size=1024"
22.            resources:
23.              requests:
24.                memory: 0.5Gi
25.                cpu: 0.5
26.              limits:
27.                memory: 1Gi
28.                cpu: 1
29.  EOF

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

我们可以调整容器的 CPU/RAM,也可以调整 Node.js 的内存使用([max-old-space-size](https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-mib "max-old-space-size"))。

请记住,已有的 volume claim 不能缩小。应用更新后,operator 会在最小中断时间内完成更改。

测试完成后记得删除集群,以避免不必要的费用。

`az aks delete --name myAKSAutomaticCluster --resource-group elastic-resource`AI写代码

结论

使用 Azure AKS Automatic 配合 ECK 为部署 Elasticsearch 和 Kibana 提供了一个平衡的解决方案:它降低了运维复杂性,保证了自动扩展和更新,并利用了 Kubernetes 的灵活性。这种方法非常适合希望获得可靠、可重复和可维护部署流程的团队,而无需手动管理每一个基础设施细节,是测试和生产环境的实用选择。

下一步

如果你想了解更多关于 Kubernetes 的内容,可以查看官方文档:

原文:www.elastic.co/search-labs…