适用对象:✔️ Linux VM ✔️ 灵活规模集
本文逐步讲解如何在 Azure 中的 Ubuntu VM 上部署 Elasticsearch、Logstash 和 Kibana。 若要查看实际操作中的 Elastic Stack,可选择连接到 Kibana 并处理某些示例日志记录数据。
此外,可以按照在 Azure 虚拟机上部署 Elastic 模块进行操作,获取有关在 Azure 虚拟机上部署 Elastic 的更多指导性教程。
在本教程中,您将学习如何:
- 在 Azure 资源组中创建 Ubuntu VM
- 在 VM 上安装 Elasticsearch、Logstash 和 Kibana
- 使用 Logstash 将示例数据发送到 Elasticsearch
- 在 Kibana 控制台中打开端口并处理数据
此部署适用于使用 Elastic Stack 进行基本开发的情况。 有关 Elastic 堆栈的详细信息,包括针对生产环境的建议,请参阅 Elastic 文档和 Azure 体系结构中心。
先决条件
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 将扩展与 Azure CLI 配合使用。
运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade。
如果选择在本地安装并使用 CLI,本教程要求运行 Azure CLI 2.0.4 或更高版本。 运行 az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
创建资源组
在本部分中,将声明环境变量以用于后续命令。 随机后缀将追加到资源名称以保持唯一性。
export RANDOM_SUFFIX=$(openssl rand -hex 3)
export RESOURCE_GROUP="myResourceGroup$RANDOM_SUFFIX"
export REGION="chinanorth2"
az group create --name $RESOURCE_GROUP --location $REGION
结果:
{
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxxxxx",
"location": "chinanorth2",
"managedBy": null,
"name": "myResourceGroupxxxxxx",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
创建虚拟机
本部分创建一个具有唯一名称的 VM,如果它们尚不存在,也会生成 SSH 密钥。 追加随机后缀以确保唯一性。
export VM_NAME="myVM$RANDOM_SUFFIX"
az vm create \
--resource-group $RESOURCE_GROUP \
--name $VM_NAME \
--image Ubuntu2204 \
--admin-username azureuser \
--generate-ssh-keys
创建 VM 后,Azure CLI 会显示类似于以下示例的信息。 记下公网IP地址。 此地址用于访问 VM。
结果:
{
"fqdns": "",
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachines/myVMxxxxxx",
"location": "chinanorth2",
"macAddress": "xx:xx:xx:xx:xx:xx",
"powerState": "VM running",
"privateIpAddress": "10.0.0.4",
"publicIpAddress": "x.x.x.x",
"resourceGroup": "$RESOURCE_GROUP"
}
通过 SSH 连接到 VM
如果尚不知道 VM 的公共 IP 地址,请运行以下命令列出它:
az network public-ip list --resource-group $RESOURCE_GROUP --query [].ipAddress
使用以下命令创建与虚拟机的 SSH 会话。 替换虚拟机的正确公共 IP 地址。 在此示例中,IP 地址 40.68.254.142。
export PUBLIC_IP_ADDRESS=$(az network public-ip list --resource-group $RESOURCE_GROUP --query [].ipAddress -o tsv)
安装 Elastic Stack
在本部分中,导入 Elasticsearch 签名密钥并更新 APT 源列表以包含 Elastic 包存储库。 随后安装弹性堆栈组件所需的 Java 运行时环境。
ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
"
在 VM 上安装 Java 虚拟机并配置JAVA_HOME变量:
ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sudo apt install -y openjdk-8-jre-headless
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
"
运行以下命令以更新 Ubuntu 包源并安装 Elasticsearch、Kibana 和 Logstash。
ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
wget -qO elasticsearch.gpg https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo mv elasticsearch.gpg /etc/apt/trusted.gpg.d/
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
sudo apt update
# Now install the ELK stack
sudo apt install -y elasticsearch kibana logstash
"
注释
Elastic 文档中详述了安装说明,包括目录布局和初始配置
启动 Elasticsearch
使用以下命令启动 VM 上的 Elasticsearch:
ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sudo systemctl start elasticsearch.service
"
此命令不生成任何输出,因此请使用以下 curl 命令验证 Elasticsearch 是否在 VM 上运行:
ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sleep 11
sudo curl -XGET 'localhost:9200/'
"
如果 Elasticsearch 在运行,则会看到如下所示的输出:
结果:
{
"name" : "w6Z4NwR",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "SDzCajBoSK2EkXmHvJVaDQ",
"version" : {
"number" : "5.6.3",
"build_hash" : "1a2f265",
"build_date" : "2017-10-06T20:33:39.012Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
启动 Logstash 并将数据添加到 Elasticsearch
使用以下命令启动 Logstash:
ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sudo systemctl start logstash.service
"
测试 Logstash 以确保其正常工作:
ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
# Time-limited test with file input instead of stdin
sudo timeout 11s /usr/share/logstash/bin/logstash -e 'input { file { path => "/var/log/syslog" start_position => "end" sincedb_path => "/dev/null" stat_interval => "1 second" } } output { stdout { codec => json } }' || echo "Logstash test completed"
"
这是基本 Logstash 管道,它将标准输入回响到标准输出。
设置 Logstash,将内核消息从此 VM 转发到 Elasticsearch。 若要创建 Logstash 配置文件,请运行以下命令,该命令将配置写入名为 vm-syslog-logstash.conf 的新文件:
ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
cat << 'EOF' > vm-syslog-logstash.conf
input {
stdin {
type => "stdin-type"
}
file {
type => "syslog"
path => [ "/var/log/*.log", "/var/log/*/*.log", "/var/log/messages", "/var/log/syslog" ]
start_position => "beginning"
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => "localhost:9200"
}
}
EOF
"
测试此配置,然后将 syslog 数据发送到 Elasticsearch:
# Run Logstash with the configuration for 60 seconds
sudo timeout 60s /usr/share/logstash/bin/logstash -f vm-syslog-logstash.conf &
LOGSTASH_PID=$!
# Wait for data to be processed
echo "Processing logs for 60 seconds..."
sleep 65
# Verify data was sent to Elasticsearch with proper error handling
echo "Verifying data in Elasticsearch..."
ES_COUNT=$(sudo curl -s -XGET 'localhost:9200/_cat/count?v' | tail -n 1 | awk '{print $3}' 2>/dev/null || echo "0")
# Make sure ES_COUNT is a number or default to 0
if ! [[ "$ES_COUNT" =~ ^[0-9]+$ ]]; then
ES_COUNT=0
echo "Warning: Could not get valid document count from Elasticsearch"
fi
echo "Found $ES_COUNT documents in Elasticsearch"
if [ "$ES_COUNT" -gt 0 ]; then
echo "✅ Logstash successfully sent data to Elasticsearch"
else
echo "❌ No data found in Elasticsearch, there might be an issue with Logstash configuration"
fi
将 syslog 项发送到 Elasticsearch 时回响的终端中会显示这些 syslog 项。 发送某些数据后,使用 Ctrl+C 退出 Logstash。
启动 Kibana 并在 Elasticsearch 中直观显示数据
编辑 Kibana 配置文件(/etc/kibana/kibana.yml),并更改 Kibana 侦听的 IP 地址,以便可以从 Web 浏览器访问它:
server.host: "0.0.0.0"
使用以下命令启动 Kibana:
ssh azureuser@$PUBLIC_IP_ADDRESS -o StrictHostKeyChecking=no "
sudo systemctl start kibana.service
"
通过 Azure CLI 打开端口 5601,允许远程访问 Kibana 控制台:
az vm open-port --port 5601 --resource-group $RESOURCE_GROUP --name $VM_NAME
后续步骤
本教程已将 Elastic Stack 部署到 Azure 中的开发 VM。 你已了解如何执行以下操作:
- 在 Azure 资源组中创建 Ubuntu VM
- 在 VM 上安装 Elasticsearch、Logstash 和 Kibana
- 通过 Logstash 将示例数据发送到 Elasticsearch
- 在 Kibana 控制台中打开端口并处理数据