Volume - ConfigMap
在 Kubernetes 中,ConfigMap 是一種用於儲存非機密性設定數據的物件,通常用來存放應用程式所需的設定,例如環境變量、命令列參數或配置文件。 ConfigMap 的目的是將應用程式的設定與其代碼解耦,讓配置可以在不改變容器映像的情況下進行更新。
ConfigMap 的用途
- 環境變量:用於向 Pod 中的容器注入設定數據。
- 命令列參數:提供啟動容器時所需的參數。
- 配置文件:將配置數據掛載為文件,供容器內的應用程式使用。
- 通用數據共享:用來儲存多個 Pod 共享的非機密性數據。
ConfigMap 的優點
- 解耦應用程式與配置:使應用程式部署更靈活。
- 共享配置:允許多個 Pod 使用同一份配置數據。
- 可控性強:可以根據需要輕鬆修改或更新配置。
注意事項
- 非機密性數據:ConfigMap 不適合存放機密性數據(如密碼或 API 金鑰),這些數據應使用 Secret。
- 大數據量限制:ConfigMap 的單個鍵值對大小限制為 1MB,若 需儲存更大的數據,需考慮其他方法。
- 動態更新:當 ConfigMap 發生變更時,掛載到 Pod 的數據可以自動更新,但容器內讀取方式需要支持重新加載機制。
ConfigMap 的建立方式
使用指令匯入整個設定檔
- 首先創建一個 initdb.sql 檔案,裡面儲存我們要用的欄位,目的是建立 DB 的初始欄位。
initdb.sql
DROP TABLE IF EXISTS posts CASCADE;
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
uuid VARCHAR(36) NOT NULL UNIQUE,
user_id NUMERIC NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
comments_count NUMERIC DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP NULL,
);
CREATE INDEX user_id_key ON posts (user_id);
COMMENT ON COLUMN posts.title IS '標題';
COMMENT ON COLUMN posts.content is '內容';
COMMENT ON COLUMN posts.comments_count IS '評論數';
- 透過 kubectl 指令,將整個 sql 儲存成 configmap。
kubectl.exe create configmap pg-initsql --from-file=initdb.sql
---
configmap/pg-initsql created
- 查看產生出來的結果
kubectl.exe describe configmaps pg-initsql
---
Name: pg-initsql
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
initdb.sql:
----
DROP TABLE IF EXISTS posts CASCADE;\r
CREATE TABLE posts (\r
id BIGSERIAL PRIMARY KEY,\r
uuid VARCHAR(36) NOT NULL UNIQUE,\r
user_id NUMERIC NOT NULL,\r
title VARCHAR(255) NOT NULL,\r
content TEXT NOT NULL,\r
comments_count NUMERIC DEFAULT 0,\r
created_at TIMESTAMP NOT NULL DEFAULT NOW(),\r
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),\r
deleted_at TIMESTAMP NULL,\r
);\r
\r
CREATE INDEX user_id_key ON posts (user_id);\r
\r
COMMENT ON COLUMN posts.title IS '標題';\r
COMMENT ON COLUMN posts.content is '內容';\r
COMMENT ON COLUMN posts.comments_count IS '評論數';
BinaryData
====
Events: <none>
使用 yaml 建立設定檔
- 同上面,但我們可以把 sql 放 yaml 中,雖然都是使用 yaml 整合再一起,但易讀性交低。
initdb-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: initdb
labels:
app: db
data:
initdb.sql: |
DROP TABLE IF EXISTS posts CASCADE;
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
uuid VARCHAR(36) NOT NULL UNIQUE,
user_id NUMERIC NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
comments_count NUMERIC DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP NULL
);
CREATE INDEX user_id_key ON posts (user_id);
COMMENT ON COLUMN posts.title IS '標題';
COMMENT ON COLUMN posts.content is '內容';
COMMENT ON COLUMN posts.comments_count IS '評論數';
- 透過指令我們也可以運行起來。
kubectl.exe apply -f initdb-configmap.yaml
---
configmap/initdb created
- 查看運行結果。
kubectl.exe describe configmaps initdb
---
Name: initdb
Namespace: default
Labels: app=db
Annotations: <none>
Data
====
initdb.sql:
----
DROP TABLE IF EXISTS posts CASCADE;
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
uuid VARCHAR(36) NOT NULL UNIQUE,
user_id NUMERIC NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
comments_count NUMERIC DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP NULL
);
CREATE INDEX user_id_key ON posts (user_id);
COMMENT ON COLUMN posts.title IS '標題';
COMMENT ON COLUMN posts.content is '內容';
COMMENT ON COLUMN posts.comments_count IS '評論數';
BinaryData
====
Events: <none>
使用指令建立 key-value 組合
- 使用指令建立一個 pg-connect,他定義了連線的 host 和 port,在--from-literal=後面接上 key=value。
kubectl.exe create configmap pg-connect --from-literal=host=127.0.0.1 --from-literal=port=5432
---
configmap/pg-connect created
- 使用指令查看一下運行的結果。
kubectl.exe describe configmaps pg-connect
---
Name: pg-connect
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
host:
----
127.0.0.1
port:
----
5432
BinaryData
====
Events: <none>