在 Azure VM 上安装 Elastic Stack (ELK)

适用对象:✔️ Linux VM ✔️ 灵活规模集

本文逐步讲解如何在 Azure 中的 Ubuntu VM 上部署 ElasticsearchLogstashKibana。 若要查看实际操作中的 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 控制台中打开端口并处理数据