Skip to content

antony@notes:~/data-platform$ cat "Quick-Start-OpenSearch.md"

Quick Start OpenSearch

2026-03-24· data-platform

Podman Quick Start OpenSearch

環境準備

  • os: Ubuntu 24.04.4 LTS
  • podman version: 4.9.3

OpenSearch

  1. 建立 podman volume

    sudo podman volume create opensearch-data
  2. Create a Docker network

    sudo podman network create log-system
  3. 啟動 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:latest

    password 要自己定義,必須使用至少 8 個字元,包含至少一個大寫字母、一個小寫字母、一個數字,以及一個特殊字元。

OpenSearch dashboard

  1. 編輯 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"]
  2. 啟動 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
  3. 連線至 Web 管理網站

    http://<opensearch.hosts>:5601/

    image

With Logstash

sudo podman volume create logstash-data
mkdir -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
  }
}
EOF
sudo 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 logstash
curl -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 不支援 .build Quadlet(需 5.2.0+), 因此自訂映像需先手動 build,再由 .container 直接引用。

前置準備:安裝 podlet

curl -fsSL https://raw.githubusercontent.com/braveantony/bash-script/refs/heads/main/install-podlet.sh | sudo bash

1. 建立目錄結構

sudo mkdir -p /opt/logstash/build
sudo mkdir -p /etc/logstash/pipeline
sudo mkdir -p /etc/logstash/certs
sudo mkdir -p /etc/containers/systemd

2. 建立 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
EOF

3. 手動 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
  }
}
EOF

6. 建立環境變數檔

將所有敏感資訊和可變設定集中管理:

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_USERHTTP_AUTH_PASSWORDOPENSEARCH_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.volume

7-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.network

7-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:latest

7-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.container

7-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.service

10. 確認狀態

sudo systemctl status logstash.service
sudo podman ps
sudo podman logs logstash

11. 測試 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.confPipeline 設定檔
logstash.env/etc/logstash/logstash.env環境變數檔(權限 0600)
server.crt/etc/logstash/certs/server.crtSSL 憑證
server.key/etc/logstash/certs/server.keySSL 私鑰(PKCS8,權限 0600)
ca.crt/etc/logstash/certs/ca.crtCA 憑證(供客戶端驗證)
logstash-data.volume/etc/containers/systemd/logstash-data.volumeQuadlet Volume
log-system.network/etc/containers/systemd/log-system.networkQuadlet Network
logstash.container/etc/containers/systemd/logstash.containerQuadlet Container

環境變數一覽

變數名用途範例值
HTTP_AUTH_USERHTTP input basic auth 帳號logstash
HTTP_AUTH_PASSWORDHTTP input basic auth 密碼changeme
OPENSEARCH_HOSTSOpenSearch 連線 URLhttps://opensearch-node.kubeantony.com:9200
OPENSEARCH_INDEXOpenSearch index 名稱(含日期格式)opensearch-logstash-docker-%{+YYYY.MM.dd}
OPENSEARCH_PASSWORDOpenSearch admin 密碼!QAZ2wsx@WSX!!

注意事項

  • 以一般使用者操作,透過 sudo 提權,容器以 rootful 模式執行。
  • 使用 sudo systemctl(不帶 --user)管理服務。
  • Podman 4.9.3 不支援 .build Quadlet,映像需先手動 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 驗證設定。