作者:来自 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 VM 和 Azure 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写代码
我们禁用了 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写代码
默认情况下,AKS Automatic 会将负载均衡器配置为 public;你可以通过设置 metadata annotation 来更改此行为:
`service.beta.kubernetes.io/azure-load-balancer-internal: "true"`AI写代码
15)检查你的 pods 是否正在运行。
`kubectl get pods`AI写代码
16)你也可以运行 kubectl get elasticsearch 和 kubectl 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写代码
在这个示例中,我们将添加一个节点并修改 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写代码
我们可以调整容器的 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 的内容,可以查看官方文档: