在 Kubernetes 上部署 OpenLDAP 的詳細教學
===
###### tags: `LDAP`
###### tags: `LDAP`, `OpenLDAP`, `Kubernetes`, `K8s`
<br>
[TOC]
<br>
:::success
### :bulb: GitHub:
https://github.com/jp-gouin/helm-openldap
- [values.yaml](https://github.com/jp-gouin/helm-openldap/blob/master/values.yaml)
:::
<br>
## 前言
本教學將引導您在 Kubernetes 叢集上部署高可用性的 OpenLDAP 服務。我們將使用 Helm Chart `openldap-stack-ha` 來實現這一目標,該 Chart 包含 OpenLDAP 服務器、phpLDAPadmin 管理界面和 ltb-passwd 自助密碼服務。
<br>
## 步驟一:準備環境
### 前提條件
- 執行中的 Kubernetes 叢集 (v1.8+)
- 已安裝 Helm (v3+)
- 具有建立 PV 的儲存支援
- `kubectl` 指令列工具已設定
### 安裝 Helm (如果尚未安裝)
```bash
# 下載並安裝 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 驗證安裝
helm version
```
<br>
## 步驟二:新增 Helm 儲存庫
> [[github] OpenLDAP Helm Chart](https://github.com/jp-gouin/helm-openldap?tab=readme-ov-file)
首先,新增包含 OpenLDAP Chart 的 Helm 儲存庫:
```bash
# 新增 Helm 儲存庫
helm repo add helm-openldap https://jp-gouin.github.io/helm-openldap/
# 更新儲存庫資訊
helm repo update
```
<br>
## 步驟三:自訂設定
在安裝 Chart 前,先建立自訂的 values 檔,覆蓋預設設定。
建立 `openldap-values.yaml`:
```yaml=
# openldap-values.yaml
# 全域設定
global:
ldapDomain: "esc4000.ocis.asus.com" # 改為您的網域名稱
# 等效於:dc=esc4000,dc=ocis,dc=asus,dc=com (<- 最終轉換結果)
adminPassword: "YourSecurePassword" # 管理員密碼
configPassword: "YourSecurePassword" # 設定管理員密碼(cn=config)
# 副本數量 (用於高可用)
replicaCount: 3
# 日誌等級
logLevel: info
# 持久化設定
persistence:
enabled: true
accessMode: ReadWriteOnce
size: 8Gi
# TLS/LDAPS 設定(選用)
initTLSSecret:
tls_enabled: false # 設為 true 以啟用 TLS
# secret: "ldap-tls-secret" # 含 TLS 憑證與金鑰的 Secret 名稱
# 複寫設定
replication:
enabled: true
retry: 60
timeout: 1
interval: "00:00:00:10"
# PHPLDAPAdmin 設定
phpldapadmin:
enabled: true
ingress:
enabled: false # 設為 true 以啟用 Ingress
# hosts:
# - ldapadmin.example.org
# 自助密碼服務
ltb-passwd:
enabled: true
ingress:
enabled: false # 設為 true 以啟用 Ingress
# hosts:
# - passwd.example.org
```
- ### 「第一次啟動」時會自動建立預設樹

Helm chart(jp-gouin/helm-openldap)底層用的是 Bitnami 的 OpenLDAP 映像,它在「第一次啟動」時會自動建立預設樹,包括 `ou=users`、`ou=groups`,以及範例帳號 `user01`、`user02` 與群組 `readers`。除非你明確關閉它,否則都會被種下來。這個行為可用環境變數 `LDAP_SKIP_DEFAULT_TREE` 關掉。([ComputingForGeeks][1])
### 停用預設樹
> https://github.com/jp-gouin/helm-openldap?tab=readme-ov-file#to-400
> A default tree (Root organisation, users and group) is created during startup, this can be skipped using `LDAP_SKIP_DEFAULT_TREE` , however you need to use customLdifFiles or customLdifCm to create a root organisation.
在 `openldap-values.yaml` 加上:
```yaml=
env:
LDAP_SKIP_DEFAULT_TREE: "yes" # 不要建立預設 users/groups/範例帳號
# (可選)若要自訂最小化樹,只放 base DN:
customLdifFiles:
00-base.ldif: |-
dn: dc=asus,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: ASUS
dc: asus
```
- ### 說明
- 看到 `user01/user02/readers` 正是 Bitnami 預設示範的組合;若想完全避免,務必啟用 `LDAP_SKIP_DEFAULT_TREE`。
- Bitnami 映像提供 `env` 傳入環境變數 `LDAP_SKIP_DEFAULT_TREE`;`customLdifFiles` 可在啟動時載入你要的 LDIF。
- 如果你把 `LDAP_SKIP_DEFAULT_TREE` 設為 `yes`,而且**不**提供任何 `customLdifFiles`,系統就不會替你建立 `ou=users`/`ou=groups` 或範例帳號。這正是你想要的狀態。([ComputingForGeeks](https://computingforgeeks.com/how-to-run-openldap-in-bitnami-docker-container/?utm_source=chatgpt.com))
- 之後要擴充樹,再用 LDIF 匯入或在 phpLDAPadmin 裡自行新增即可。
<br>
## 步驟四:安裝 Chart
現在,讓我們使用自定義配置安裝 OpenLDAP Chart:
```bash
# 安裝 Chart
helm install openldap helm-openldap/openldap-stack-ha \
-f openldap-values.yaml \
--namespace openldap \
--create-namespace
```
- **確認部署狀態**
```
$ helm list -n openldap
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
openldap openldap 1 2025-09-10 15:55:21.223470788 +0800 CST deployed openldap-stack-ha-4.3.3 2.6.9
```
- **執行過程**
```
NAME: openldap
LAST DEPLOYED: Mon Sep 22 08:45:48 2025
NAMESPACE: openldap
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
OpenLDAP-Stack-HA has been installed. You can access the server from within the k8s cluster using:
openldap.openldap.svc.cluster.local:
Or
openldap.openldap.svc.cluster.local:
You can access the LDAP adminPassword and configPassword using:
kubectl get secret --namespace openldap openldap -o jsonpath="{.data.LDAP_ADMIN_PASSWORD}" | base64 --decode; echo
kubectl get secret --namespace openldap openldap -o jsonpath="{.data.LDAP_CONFIG_ADMIN_PASSWORD}" | base64 --decode; echo
You can access the LDAP service, from within the cluster (or with kubectl port-forward) with a command like (replace password and domain):
ldapsearch -x -H ldap://openldap.openldap.svc.cluster.local: -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w $LDAP_ADMIN_PASSWORD
You can access PHPLdapAdmin, using
You can access Self Service Password, using
Test server health using Helm test:
helm test openldap
Enjoy :)
```
<br>
## 步驟五:驗證部署
安裝完成後,確認所有 Pod 是否正常運作:
```bash
# 查看 Pod 狀態
kubectl -n openldap get pods -l app.kubernetes.io/component=openldap
# 查看服務
kubectl -n openldap get svc -l app.kubernetes.io/component=openldap
```
- 等待所有 Pod 進入 Running 狀態。
- **備註**
- `-l app.kubernetes.io/name=openldap-stack-ha` 找不到
- 服務的標籤與名稱如下:
| Service | name | labels |
|---------|------|--------|
| LDAP 服務 | `svc/openldap` | `app.kubernetes.io/component=openldap`<br>`release=openldap`<br>`chart=openldap-4.3.3` |
| Headless |`svc/openldap-headless` | `app.kubernetes.io/component=openldap`<br>`release=openldap`<br>`chart=openldap-4.3.3` |
| phpLDAPadmin |`svc/openldap-phpldapadmin` | `app=phpldapadmin`<br>`release=openldap`<br>`chart=phpldapadmin-0.1.2` |
| ltb-passwd |`svc/openldap-ltb-passwd` | `app.kubernetes.io/name=openldap-ltb`<br>`app.kubernetes.io/instance=openldap`<br>`helm.sh/chart=ltb-passwd-0.1.0` |
<br>
或,**查看所有元件**:
```bash
$ kubectl -n openldap get all,cm,secret,sa
NAME READY STATUS RESTARTS AGE
pod/openldap-0 1/1 Running 0 16m
pod/openldap-1 1/1 Running 1 (15m ago) 15m
pod/openldap-2 1/1 Running 1 (14m ago) 14m
pod/openldap-ltb-passwd-8684b5684b-96smr 1/1 Running 0 16m
pod/openldap-phpldapadmin-84b7b947fd-x6svs 1/1 Running 0 16m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/openldap ClusterIP 10.102.140.215 <none> 389/TCP,636/TCP 16m
service/openldap-headless ClusterIP None <none> 389/TCP,636/TCP 16m
service/openldap-ltb-passwd ClusterIP 10.109.51.252 <none> 80/TCP 16m
service/openldap-phpldapadmin ClusterIP 10.107.170.66 <none> 80/TCP 16m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/openldap-ltb-passwd 1/1 1 1 16m
deployment.apps/openldap-phpldapadmin 1/1 1 1 16m
NAME DESIRED CURRENT READY AGE
replicaset.apps/openldap-ltb-passwd-8684b5684b 1 1 1 16m
replicaset.apps/openldap-phpldapadmin-84b7b947fd 1 1 1 16m
NAME READY AGE
statefulset.apps/openldap 3/3 16m
NAME DATA AGE
configmap/kube-root-ca.crt 1 16m
configmap/openldap-env 13 16m
configmap/openldap-ltb-passwd-ldap-cm 1 16m
configmap/openldap-phpldapadmin 4 16m
configmap/openldap-replication-acls 7 16m
NAME TYPE DATA AGE
secret/openldap Opaque 3 16m
secret/openldap-ltb-passwd Opaque 1 16m
secret/sh.helm.release.v1.openldap.v1 helm.sh/release.v1 1 16m
NAME SECRETS AGE
serviceaccount/default 0 16m
serviceaccount/openldap-openldap-stack-ha-foo 0 16m
```
<br>
## 步驟六:存取 LDAP 服務
### 從叢集內部存取
```bash
# 取得 LDAP 服務名稱與連接埠
LDAP_SERVICE=$(kubectl -n openldap get svc -l app.kubernetes.io/component=openldap -o jsonpath='{.items[0].metadata.name}')
LDAP_PORT=$(kubectl -n openldap get svc -l app.kubernetes.io/component=openldap -o jsonpath='{.items[0].spec.ports[?(@.name=="ldap-port")].port}')
echo "LDAP 服務可透過 $LDAP_SERVICE:$LDAP_PORT 存取"
```
- 執行範例
```
LDAP 服務可以通過 openldap:389 訪問
```
<br>
---
### 使用暫時性的 Pod 進行測試
```bash
# 建立一個暫時性 Pod ,來測試 LDAP 連線
kubectl run ldap-test --rm -it --image=bitnami/openldap:latest -- bash
$ ldapsearch -x \
-H ldap://openldap[.<namespace>]:389 \
-D "cn=admin,dc=esc4000,dc=ocis,dc=asus,dc=com" \
-w YourSecurePassword \
-b "dc=esc4000,dc=ocis,dc=asus,dc=com" \
"(objectClass=*)" -LLL
```
- ### `ldapsearch -x ...` 指令完整解說
### 這條指令在做什麼(大意)
用**簡易認證**(`-x`)以**管理者 DN**登入位於 `openldap:389` 的 LDAP 伺服器,從**基底 DN** `dc=esc4000,dc=ocis,dc=asus,dc=com` 往下做**整棵樹(subtree)搜尋**,把**所有物件(`(objectClass=*)`)**與其屬性輸出為**精簡 LDIF**(`-LLL`)格式。
---
### 逐項參數解釋
- `ldapsearch`
OpenLDAP 的查詢工具。
- `-x`
用「**簡易綁定**(simple bind)」方式登入,而不是 SASL。這在用 `cn=admin,...` + 密碼的情境是正確的。
- `-H ldap://openldap:389`
指定目標伺服器的 **URI**。
- `openldap` 是 **Service 名稱**(在 `openldap` 命名空間內部署時,DNS 會解析成 `openldap.openldap.svc.cluster.local`)。
- `389` 是 LDAP(明文或 StartTLS)的服務埠。Chart 內部容器用 1389,但 Service 對外是 389——你用 Service 即可。
- `-D "cn=admin,dc=esc4000,dc=ocis,dc=asus,dc=com"`
**Bind DN**(要用來登入的身分)。這裡是你 Chart 產生的 **管理者 DN**。
> 你的 `global.ldapDomain: esc4000.ocis.asus.com` 會對應 Base DN `dc=esc4000,dc=ocis,dc=asus,dc=com`,預設管理者 DN 為 `cn=admin,<BaseDN>`。
- `-w YourSecurePassword`
管理者密碼(對應你 values 中 `adminPassword`)。
🔒 建議平常用 `-W`(大寫 W)讓工具**互動式輸入**密碼,避免密碼出現在 shell history。
- `-b "dc=esc4000,dc=ocis,dc=asus,dc=com"`
**Base DN**(搜尋的起點)。
預設搜尋範圍是 **sub**(整棵子樹),等同 `-s sub`。
- `"(objectClass=*)"`
**過濾條件**(LDAP filter)。這個條件匹配「**所有物件**」,也就是把整棵樹都列出。
你也可以改成:
* `"(uid=user1)"`:找某個使用者
* `"(&(objectClass=inetOrgPerson)(sn=Lin))"`:符合多條件
- `-LLL`
**輸出格式**調整:LDIF 但**去掉版本列與註解**,最適合丟管線或做自動化。
* `-L`:LDIF(含版本/註解)
* `-LL`:LDIF(去註解)
* `-LLL`:LDIF(去版本 + 去註解)
> 若你在 **default** 命名空間執行工具 Pod,`openldap` 這個短名不會解析,請改用 FQDN:
> `-H ldap://openldap.openldap.svc.cluster.local:389`
---
## 預期結果(節選示意)
輸出是 **LDIF**,每個條目都有 `dn:`,接著列屬性,例如:
```
dn: dc=esc4000,dc=ocis,dc=asus,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: esc4000.ocis.asus.com
dc: esc4000
dn: ou=People,dc=esc4000,dc=ocis,dc=asus,dc=com
objectClass: top
objectClass: organizationalUnit
ou: People
...
```
---
## 常見變體與小技巧
* **只取特定屬性**
在 filter 後面加屬性清單(空白分隔):
```bash
ldapsearch -x -H ldap://openldap:389 \
-D "cn=admin,dc=..." -W \
-b "dc=..." "(uid=user1)" uid cn mail -LLL
```
* **改搜尋範圍(scope)**
* `-s base`:只看 Base DN 本身
* `-s one`:只看 Base 的**下一層**
* `-s sub`:**整棵**子樹(預設)
* **LDAPS 或 StartTLS**
* LDAPS(636):`-H ldaps://openldap:636`(記得證書 SAN 要能匹配你連的主機/IP)
* StartTLS:在 389 上加 `-ZZ`
```bash
ldapsearch -x -ZZ -H ldap://openldap:389 ...
```
* **從叢集外連(只有內網 IP)**
先把 `svc/openldap` 設為 **NodePort**,再改 URI:
`-H ldap://10.78.26.241:30389`
* **排查密碼/身分錯**
`Invalid credentials (49)` 通常是 **Bind DN 或密碼不對**;請對照 `adminPassword` 與 DN 是否完全吻合。
`anonymous bind disallowed (48)` 表示你沒帶 `-D/-w` 企圖匿名查詢,但伺服器禁了匿名綁定——加上 `-D/-W` 即可。
---
## 小結
* 這條指令用 **管理者 DN + 密碼**,在 `openldap:389` 做 **subtree 搜尋**,把整個目錄以**精簡 LDIF**印出。
* 依需求常改的只有三處:**URI(-H)**、**Bind DN/密碼(-D/-W)**、**Base DN(-b)/filter**。
* 自動化腳本建議用 `-W` 互動式輸入或讀環境變數,避免把密碼寫在命令列。
- **執行結果**
```
dn: dc=esc4000,dc=ocis,dc=asus,dc=com
objectClass: dcObject
objectClass: organization
dc: esc4000
o: example
dn: ou=users,dc=esc4000,dc=ocis,dc=asus,dc=com
objectClass: organizationalUnit
ou: users
dn: ou=groups,dc=esc4000,dc=ocis,dc=asus,dc=com
objectClass: organizationalUnit
ou: groups
dn: cn=user01,ou=users,dc=esc4000,dc=ocis,dc=asus,dc=com
cn: User1
cn: user01
sn: Bar1
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: Yml0bmFtaTE=
uid: user01
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/user01
dn: cn=user02,ou=users,dc=esc4000,dc=ocis,dc=asus,dc=com
cn: User2
cn: user02
sn: Bar2
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: Yml0bmFtaTI=
uid: user02
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/user02
dn: cn=readers,ou=users,dc=esc4000,dc=ocis,dc=asus,dc=com
cn: readers
objectClass: groupOfNames
member: cn=user01,ou=users,dc=esc4000,dc=ocis,dc=asus,dc=com
member: cn=user02,ou=users,dc=esc4000,dc=ocis,dc=asus,dc=com
```
<br>
---
### 存取 LDAP 服務的流程解說
1. 叢集**內部**用 `ldap://openldap.<namespace>:389`;
2. 叢集**外部**(NodePort)用 `ldap://10.78.26.241:30389`。
---
#### (1) 叢集內部:`ldapsearch` → Service → Pod(簡易綁定 + 子樹查詢)
- #### FlowChart
```mermaid
flowchart LR
T["工具 Pod:ldapsearch"]
SVC["Service:openldap(ClusterIP 389)"]
P1["Pod:openldap-0(slapd 1389)"]
P2["Pod:openldap-1(slapd 1389)"]
P3["Pod:openldap-2(slapd 1389)"]
D["DIT:dc=esc4000,dc=ocis,dc=asus,dc=com"]
T -- "ldap://openldap:389" --> SVC
SVC -- "Endpoints" --> P1
SVC -- "Endpoints" --> P2
SVC -- "Endpoints" --> P3
P1 --- D
P2 --- D
P3 --- D
```
- #### SequenceDiagram
```mermaid
sequenceDiagram
autonumber
participant U as ldapsearch(工具 Pod)
participant DNS as CoreDNS
participant SVC as Service openldap<br/>(ClusterIP:389 → targetPort:1389)
participant P as openldap-* Pod(slapd:1389)
participant D as 目錄資料樹(DIT)<br/>dc=esc4000,dc=ocis,dc=asus,dc=com
U->>DNS: 解析 openldap(短名或 FQDN)
DNS-->>U: 回傳 ClusterIP
U->>SVC: TCP 389 建立連線
U->>SVC: Bind 請求(-x 簡易綁定,-D 管理者 DN,-w 密碼)
SVC->>P: 轉送到後端 Pod(slapd:1389)
P-->>U: BindResponse(成功/失敗)
U->>P: SearchRequest(-b BaseDN,scope=sub,filter=objectClass=*)
P->>D: 評估查詢、擷取條目
D-->>P: 條目與屬性
P-->>U: SearchResultEntry… + SearchResultDone
```
- #### 對應參數
- `-H ldap://openldap[.<namespace>]:389` → 透過 K8s **Service** 存取(ClusterIP 389 → Pod 1389)
- `-D "cn=admin,dc=esc4000,dc=ocis,dc=asus,dc=com"` → **Bind DN**(管理者 DN)
- `-w YourSecurePassword` → 管理者密碼(建議平時用 `-W` 互動輸入)
- `-b "dc=esc4000,dc=ocis,dc=asus,dc=com"` → **Base DN**(查詢起點,預設 scope=sub)
- `"(objectClass=*)"` → 取整棵子樹所有物件
- `-LLL` → 精簡 LDIF 輸出(去版本/註解)
---
### (2) 叢集外部(選用):NodePort 對外提供
- #### FlowChart
```mermaid
flowchart LR
C["用戶端/跳板機<br/>ldapsearch"]
N["叢集節點 IP<br/>NodePort 30389"]
SVC["Service:openldap<br/>(ClusterIP 389)"]
P1["Pod:openldap-0(slapd 1389)"]
P2["Pod:openldap-1(slapd 1389)"]
P3["Pod:openldap-2(slapd 1389)"]
D["DIT<br/>dc=esc4000,dc=ocis,dc=asus,dc=com"]
C -- "ldap://10.78.26.241:30389" --> N
N -- "Kube-Proxy / iptables" --> SVC
SVC -- "Endpoints" --> P1
SVC -- "Endpoints" --> P2
SVC -- "Endpoints" --> P3
P1 --- D
P2 --- D
P3 --- D
```
- #### 對應作法
- Service 改成 `NodePort`(例:`389→30389`、`636→30636`)
- 外部測試:
`ldapsearch -x -H ldap://10.78.26.241:30389 -D "cn=admin,dc=..." -W -b "dc=..." "(objectClass=*)" -LLL`
- 若用 **LDAPS**:`ldaps://10.78.26.241:30636`,憑證 SAN 需包含 **IP** 才不會驗證失敗
---
#### 小提醒
- 在 **不同命名空間或 default** 內測試,建議用 FQDN:
`-H ldap://openldap.openldap.svc.cluster.local:389`
- `Invalid credentials (49)` 幾乎都是 **Bind DN 或密碼不符**。
- `anonymous bind disallowed (48)` 表示需帶 `-D/-W`。
- Chart 新版容器內部預設埠是 **1389/1636**,**Service** 對外仍是 **389/636**(或你的 NodePort)。
<br>
---
<br>
## 步驟七:配置 phpLDAPadmin 訪問
如果您啟用了 phpLDAPadmin,您可以通過端口轉發來訪問管理界面:
```bash
# 尋找 phpLDAPadmin Pod 的名稱
PHPLDAP_POD=$(kubectl get pods -l app.kubernetes.io/name=phpldapadmin -o jsonpath='{.items[0].metadata.name}')
# 設置端口轉發
kubectl port-forward pod/$PHPLDAP_POD 8080:80
```
現在,您可以在瀏覽器中訪問 http://localhost:8080 來使用 phpLDAPadmin。
登錄憑證:
- 登錄 DN: `cn=admin,dc=example,dc=org`
- 密碼: `YourSecurePassword` (您在 values 文件中設置的 adminPassword)
<br>
## 步驟八:初始化 LDAP 數據
您可以通過 phpLDAPadmin 界面或使用 LDIF 文件來初始化 LDAP 數據。
### 使用 LDIF 文件添加用戶和組
創建一個 LDIF 文件 `initial-data.ldif`:
```ldif
# 添加組織單位
dn: ou=People,dc=example,dc=org
objectClass: organizationalUnit
ou: People
dn: ou=Groups,dc=example,dc=org
objectClass: organizationalUnit
ou: Groups
# 添加用戶
dn: uid=user1,ou=People,dc=example,dc=org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user1
sn: User1
givenName: Test
cn: Test User1
displayName: Test User1
uidNumber: 10000
gidNumber: 10000
userPassword: password1
gecos: Test User1
loginShell: /bin/bash
homeDirectory: /home/user1
# 添加組
dn: cn=users,ou=Groups,dc=example,dc=org
objectClass: posixGroup
cn: users
gidNumber: 10000
memberUid: user1
```
應用 LDIF 文件:
```bash
# 使用臨時 Pod 應用 LDIF 文件
kubectl run ldap-add --rm -it --image=bitnami/openldap:latest -- \
ldapadd -x -H ldap://my-openldap-openldap-stack-ha:389 \
-D "cn=admin,dc=example,dc=org" \
-w YourSecurePassword -f /tmp/initial-data.ldif
```
注意:您需要先將 LDIF 文件複製到 Pod 中,或者使用 ConfigMap 來掛載它。
<br>
## 步驟九:配置 TLS/LDAPS (可選)
若要啟用 LDAPS,您需要創建一個包含 TLS 證書和密鑰的 Secret:
```bash
# 生成自簽名證書 (生產環境中應使用正式 CA 簽發的證書)
openssl req -new -x509 -days 365 -nodes \
-out tls.crt -keyout tls.key \
-subj "/CN=my-openldap-openldap-stack-ha.default.svc.cluster.local"
# 創建 Secret
kubectl create secret generic ldap-tls-secret \
--from-file=tls.crt \
--from-file=tls.key \
--from-file=ca.crt=tls.crt
```
更新 values 文件以啟用 TLS:
```yaml
initTLSSecret:
tls_enabled: true
secret: "ldap-tls-secret"
```
然後升級 Helm 釋出:
```bash
helm upgrade my-openldap helm-openldap/openldap-stack-ha -f my-openldap-values.yaml
```
<br>
## 步驟十:故障排除指南
### 常見問題與解決方案
#### 1. 連接問題
如果無法連接到 LDAP 服務:
```bash
# 檢查服務是否正常運行
kubectl get pods -l app.kubernetes.io/name=openldap-stack-ha
# 檢查服務端點
kubectl get endpoints my-openldap-openldap-stack-ha
# 測試從叢集內部連接
kubectl run ldap-test --rm -it --image=bitnami/openldap:latest -- \
ldapsearch -x -H ldap://my-openldap-openldap-stack-ha:389 \
-b dc=example,dc=org \
-D "cn=admin,dc=example,dc=org" \
-w YourSecurePassword
```
#### 2. 認證失敗
如果認證失敗:
```bash
# 重設管理員密碼
kubectl exec -it my-openldap-openldap-stack-ha-0 -- \
ldappasswd -x -H ldap://localhost:389 \
-D "cn=admin,dc=example,dc=org" \
-w OldPassword \
-s NewPassword \
"cn=admin,dc=example,dc=org"
```
#### 3. 複製問題
如果複製不同步:
```bash
# 檢查複製狀態
kubectl exec -it my-openldap-openldap-stack-ha-0 -- \
ldapsearch -x -H ldap://localhost:389 \
-b cn=config \
-D "cn=admin,cn=config" \
-w YourSecurePassword \
"olcSyncrepl=*"
```
<br>
## 總結
通過這個步驟指南,您已經學會了如何:
1. 在 Kubernetes 上部署高可用的 OpenLDAP 服務
2. 配置基本的 LDAP 設定和安全選項
3. 初始化和管理 LDAP 目錄資料
4. 啟用進階功能如 TLS 加密和多主複製
5. 與其他 Kubernetes 應用程式整合
6. 進行常見的故障排除和維護操作
這個部署使用了 helm-openldap Chart,提供了易於管理的高可用 LDAP 解決方案,適合企業級環境使用。
如需更詳細的配置選項,請參考原始文檔和 Chart 說明:`helm show values helm-openldap/openldap-stack-ha`
祝您順利部署!
<br>
{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}