antony@notes:~/data-platform$ cat "Quick-Start-OpenSearch.md"
Quick Start OpenSearch
Podman Quick Start OpenSearch
環境準備
- os: Ubuntu 24.04.4 LTS
- podman version: 4.9.3
OpenSearch
建立 podman volume
sudo podman volume create opensearch-dataCreate a Docker network
sudo podman network create log-system啟動 OpenSearch,並掛載 volume
sudo podman run -d \ -p 9200:9200 \ -p 9600:9600 \ --name opensearch \ --net log-system \ -e "discovery.type=single-node" \ -e 'OPENSEARCH_INITIAL_ADMIN_PASSWORD=<password>' \ -v opensearch-data:/usr/share/opensearch/data \ docker.io/opensearchproject/opensearch:latestpassword 要自己定義,必須使用至少 8 個字元,包含至少一個大寫字母、一個小寫字母、一個數字,以及一個特殊字元。
OpenSearch dashboard
編輯 OpenSearch Dashboards 設定檔
mkdir ~/opensearch; nano opensearch_dashboards.yml檔案內容:
opensearch.hosts的值要根據環境做設定,並在環境的 DNS Server 新增一筆 A Record
server.name: opensearch_dashboards server.host: "0.0.0.0" server.customResponseHeaders: { "Access-Control-Allow-Credentials": "true" } server.ssl.enabled: false opensearch.hosts: ["https://opensearch-node.kubeantony.com:9200"] opensearch.ssl.verificationMode: none opensearch.username: kibanaserver opensearch.password: kibanaserver opensearch.requestHeadersWhitelist: ["securitytenant","Authorization"] opensearch_security.multitenancy.enabled: true opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"] opensearch_security.readonly_mode.roles: ["kibana_read_only"]啟動 OpenSearch Dashboards
sudo podman run -d --name osd \ --network host \ -v ./opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml \ docker.io/opensearchproject/opensearch-dashboards:latest連線至 Web 管理網站
http://<opensearch.hosts>:5601/
With Logstash
sudo podman volume create logstash-datamkdir -p ~/logstash/pipeline
cat > ~/logstash/pipeline/logstash.conf << 'EOF'
input {
http {
host => "0.0.0.0"
port => 8080
}
}
filter {
}
output {
opensearch {
hosts => ["https://opensearch-node.kubeantony.com:9200"]
index => "opensearch-logstash-docker-%{+YYYY.MM.dd}"
user => "admin"
password => "!QAZ2wsx@WSX!!"
ssl => false
ssl_certificate_verification => false
}
}
EOFsudo podman run -d -it --name logstash \
--net log-system \
-v logstash-data:/usr/share/logstash/data \
-p 8080:8080 \
-v ~/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:Z \
docker.io/opensearchproject/logstash-oss-with-opensearch-output-plugin:8.9.0 \sudo podman exec -it logstash /usr/share/logstash/bin/logstash-plugin update logstash-output-opensearch
sudo podman restart logstashcurl -XPOST http://logstash.kubeantony.com:8080 \
-H "Content-Type: application/json" \
-d '{"message": "test from outside"}'Logstash Podman Quadlet 部署指南(Rootful / Podman 4.9.3)
操作方式:以一般使用者登入,必要時透過
sudo提權。 Quadlet 檔案放在/etc/containers/systemd/,容器以 rootful 模式執行。版本限制:Podman 4.9.3 不支援
.buildQuadlet(需 5.2.0+), 因此自訂映像需先手動 build,再由.container直接引用。
前置準備:安裝 podlet
curl -fsSL https://raw.githubusercontent.com/braveantony/bash-script/refs/heads/main/install-podlet.sh | sudo bash1. 建立目錄結構
sudo mkdir -p /opt/logstash/build
sudo mkdir -p /etc/logstash/pipeline
sudo mkdir -p /etc/logstash/certs
sudo mkdir -p /etc/containers/systemd2. 建立 Containerfile(自訂映像,含更新 plugin)
sudo tee /opt/logstash/build/Containerfile > /dev/null << 'EOF'
FROM docker.io/opensearchproject/logstash-oss-with-opensearch-output-plugin:8.9.0
RUN /usr/share/logstash/bin/logstash-plugin update logstash-output-opensearch
EOF3. 手動 Build 自訂映像
由於 Podman 4.9.3 不支援 .build Quadlet,需先手動 build 映像:
sudo podman build -t localhost/logstash-custom:latest \
-f /opt/logstash/build/Containerfile注意:此步驟需要網路連線,且首次 build 會花一些時間下載基底映像和更新 plugin。 後續如需更新 plugin,重新執行此 build 指令即可。
4. 產生 SSL 憑證
使用 mkcert 產出自簽憑證,再將 key 轉為 PKCS8 格式並以固定檔名放入 /etc/logstash/certs/:
# 產出憑證(依照 mkcert 的使用方式,請先編輯 config 中的 DOMAIN_NAME)
git clone https://github.com/braveantony/mkcert.git
nano ./mkcert/config
./mkcert/certctl
# 設定你的 domain name(與 mkcert config 中一致)
DOMAIN_NAME="your-domain.com"
cd ~/mkcert
# 將 key 轉為 PKCS8 格式
openssl pkcs8 -in "${DOMAIN_NAME}/${DOMAIN_NAME}.key" -topk8 -nocrypt -out "${DOMAIN_NAME}/server.key"
# 複製憑證到固定路徑(使用固定檔名)
sudo cp "${DOMAIN_NAME}/${DOMAIN_NAME}.crt" /etc/logstash/certs/server.crt
sudo cp "${DOMAIN_NAME}/server.key" /etc/logstash/certs/server.key
sudo cp "${DOMAIN_NAME}/ca.crt" /etc/logstash/certs/ca.crt
# 設定權限
sudo chmod 0600 /etc/logstash/certs/server.key
sudo chmod 0644 /etc/logstash/certs/server.crt
sudo chmod 0644 /etc/logstash/certs/ca.crt
sudo chown -R root:root /etc/logstash/certs/5. 建立 Pipeline 設定檔
HTTP input 啟用 HTTPS + basic auth,OpenSearch output 透過環境變數帶入:
sudo tee /etc/logstash/pipeline/logstash.conf > /dev/null << 'EOF'
input {
http {
host => "0.0.0.0"
port => 8080
user => "${HTTP_AUTH_USER}"
password => "${HTTP_AUTH_PASSWORD}"
ssl => true
ssl_certificate => "/etc/logstash/certs/server.crt"
ssl_key => "/etc/logstash/certs/server.key"
}
}
filter {
}
output {
opensearch {
hosts => ["${OPENSEARCH_HOSTS}"]
index => "${OPENSEARCH_INDEX}"
user => "admin"
password => "${OPENSEARCH_PASSWORD}"
ssl => false
ssl_certificate_verification => false
}
}
EOF6. 建立環境變數檔
將所有敏感資訊和可變設定集中管理:
sudo tee /etc/logstash/logstash.env > /dev/null << 'EOF'
# HTTP input basic auth
HTTP_AUTH_USER=logstash
HTTP_AUTH_PASSWORD=logstash
# OpenSearch output
OPENSEARCH_HOSTS=https://opensearch-node.kubeantony.com:9200
OPENSEARCH_INDEX=opensearch-logstash-docker-%{+YYYY.MM.dd}
OPENSEARCH_PASSWORD=!QAZ2wsx@WSX!!
EOF
sudo chmod 0600 /etc/logstash/logstash.env
sudo chown root:root /etc/logstash/logstash.env請務必修改上方的預設值,尤其是
HTTP_AUTH_USER、HTTP_AUTH_PASSWORD和OPENSEARCH_PASSWORD。
7. 使用 podlet 產生 Quadlet 檔案(Rootful)
7-1. 產生 logstash-data.volume
sudo podlet --file /etc/containers/systemd/ --install \
podman volume create logstash-data修正 WantedBy 為 rootful 慣例:
sudo sed -i 's/WantedBy=default.target/WantedBy=multi-user.target/' \
/etc/containers/systemd/logstash-data.volume7-2. 產生 log-system.network
sudo podlet --file /etc/containers/systemd/ --install \
podman network create log-system修正 WantedBy:
sudo sed -i 's/WantedBy=default.target/WantedBy=multi-user.target/' \
/etc/containers/systemd/log-system.network7-3. 產生 logstash.container
sudo podlet --file /etc/containers/systemd/ --name logstash --install \
--description "Logstash with OpenSearch Output Plugin" \
podman run -d --name logstash \
--net log-system.network \
-v logstash-data.volume:/usr/share/logstash/data \
-v /etc/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:Z \
-v /etc/logstash/certs:/etc/logstash/certs:Z,ro \
-p 8080:8080 \
localhost/logstash-custom:latest7-4. 手動補上 EnvironmentFile 和 Service 設定,並修正 WantedBy
podlet 產生的檔案沒有 [Service] 區段,需在 [Install] 之前插入:
# 在 [Install] 前插入 EnvironmentFile 和 [Service] 區段
sudo sed -i '/^\[Install\]/i EnvironmentFile=/etc/logstash/logstash.env\n\n[Service]\nRestart=always\nTimeoutStartSec=120\n' \
/etc/containers/systemd/logstash.container
# 修正 WantedBy
sudo sed -i 's/WantedBy=default.target/WantedBy=multi-user.target/' \
/etc/containers/systemd/logstash.container7-5. 驗證最終檔案內容
執行 sudo cat /etc/containers/systemd/logstash.container,確認內容如下:
[Unit]
Description=Logstash with OpenSearch Output Plugin
[Container]
ContainerName=logstash
Image=localhost/logstash-custom:latest
Network=log-system.network
PublishPort=8080:8080
Volume=logstash-data.volume:/usr/share/logstash/data
Volume=/etc/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:Z
Volume=/etc/logstash/certs:/etc/logstash/certs:Z,ro
EnvironmentFile=/etc/logstash/logstash.env
[Service]
Restart=always
TimeoutStartSec=120
[Install]
WantedBy=multi-user.target如果
sed結果不如預期,可直接用sudo vi /etc/containers/systemd/logstash.container手動編輯。
8. 使用 Quadlet dry-run 驗證
sudo /usr/libexec/podman/quadlet -dryrun確認輸出無錯誤後再繼續。
9. 重新載入 systemd 並啟動
sudo systemctl daemon-reload
sudo systemctl start logstash.service10. 確認狀態
sudo systemctl status logstash.service
sudo podman ps
sudo podman logs logstash11. 測試 HTTPS + Basic Auth
帶認證 + 信任自簽 CA(應回傳 ok):
# Example: DOMAIN_NAME="logstash.kubeantony.com"
DOMAIN_NAME="your-domain.com"
curl --cacert /etc/logstash/certs/ca.crt \
-u logstash:logstash \
-X POST https://${DOMAIN_NAME}:8080 \
-H "Content-Type: application/json" \
-d '{"message": "test with https"}'或跳過憑證驗證(測試用):
curl -k -u logstash:logstash \
-X POST https://${DOMAIN_NAME}:8080 \
-H "Content-Type: application/json" \
-d '{"message": "test with https"}'不帶認證應回傳 401:
curl -k -s -o /dev/null -w "%{http_code}" \
-X POST https://${DOMAIN_NAME}:8080 \
-H "Content-Type: application/json" \
-d '{"message": "should fail"}'用 HTTP(非 HTTPS)應連線失敗:
curl -s -o /dev/null -w "%{http_code}" \
-X POST http://${DOMAIN_NAME}:8080 \
-H "Content-Type: application/json" \
-d '{"message": "should fail"}'應該會得到 000
路徑總覽
| 檔案 | 路徑 | 說明 |
|---|---|---|
Containerfile | /opt/logstash/build/Containerfile | 自訂映像 build 檔 |
logstash.conf | /etc/logstash/pipeline/logstash.conf | Pipeline 設定檔 |
logstash.env | /etc/logstash/logstash.env | 環境變數檔(權限 0600) |
server.crt | /etc/logstash/certs/server.crt | SSL 憑證 |
server.key | /etc/logstash/certs/server.key | SSL 私鑰(PKCS8,權限 0600) |
ca.crt | /etc/logstash/certs/ca.crt | CA 憑證(供客戶端驗證) |
logstash-data.volume | /etc/containers/systemd/logstash-data.volume | Quadlet Volume |
log-system.network | /etc/containers/systemd/log-system.network | Quadlet Network |
logstash.container | /etc/containers/systemd/logstash.container | Quadlet Container |
環境變數一覽
| 變數名 | 用途 | 範例值 |
|---|---|---|
HTTP_AUTH_USER | HTTP input basic auth 帳號 | logstash |
HTTP_AUTH_PASSWORD | HTTP input basic auth 密碼 | changeme |
OPENSEARCH_HOSTS | OpenSearch 連線 URL | https://opensearch-node.kubeantony.com:9200 |
OPENSEARCH_INDEX | OpenSearch index 名稱(含日期格式) | opensearch-logstash-docker-%{+YYYY.MM.dd} |
OPENSEARCH_PASSWORD | OpenSearch admin 密碼 | !QAZ2wsx@WSX!! |
注意事項
- 以一般使用者操作,透過
sudo提權,容器以 rootful 模式執行。 - 使用
sudo systemctl(不帶--user)管理服務。 - Podman 4.9.3 不支援
.buildQuadlet,映像需先手動sudo podman build建構。 - podlet 產生的
WantedBy=default.target是 rootless 慣例,rootful 需手動改為multi-user.target。 - podlet 產生的檔案不包含
[Service]區段,需手動補上。 - 寫入受保護路徑一律使用
sudo tee,避免重導向權限問題。 - SSL 私鑰必須為 PKCS8 格式,Logstash HTTP input plugin 不接受一般 PEM 格式的 key。
- 憑證目錄
/etc/logstash/certs/以ro(唯讀)掛載進容器。 - 環境變數檔
/etc/logstash/logstash.env權限務必為0600。 - 如需修改任何環境變數,編輯 env 檔後執行
sudo systemctl restart logstash.service。 - 如需更新 plugin,重新執行步驟 3 的 build 指令後重啟服務。
- 如需更換憑證,替換
/etc/logstash/certs/下的檔案後重啟服務。 - 部署前建議用
sudo /usr/libexec/podman/quadlet -dryrun驗證設定。