简介

⚡️: OpenLDAP是轻量级目录访问协议(LDAP)的开源实现,它提供了一种存储和访问关于用户、组、计算机和其他资源的信息的中心化目录服务。

属性介绍

  • cn(common name):通用名称,表示一个对象的名称。在用户条目中,通常与用户的姓名相对应;在组条目中,则与组名相对应。
  • ou(organizational unit):组织单位,表示一个组织或部门。在LDAP目录服务中,可以使用ou来创建多级组织结构,并将用户和其他对象分配到相应的组织单元中,以便更好地管理它们。
  • dc(domain component):域组件,表示域名的一部分。在LDAP中,域名通常是按照层次结构组织的,例如:example.com可以被拆分为dc=example,dc=com。这样做有利于有效地组织和管理大规模的目录服务。
  • sn(surname):姓氏,表示一个人的姓氏。与cn属性不同,sn只表示姓氏,而且通常不唯一。

kubernetes集群部署

参考快速搭建kind测试集群快速搭建一本地测使用的kind集群。

Helm部署

极简部署

1
2
helm repo add stable https://charts.helm.sh/stable
helm install openldap stable/openldap

常规部署

部署十分简单,但是我们可能需要调整Helm chart配置,所以建议把包拉取到本地调整之后再进行部署,下面是详细流程

增加helm repo

增加helm repo:

1
helm repo add stable https://charts.helm.sh/stable
1
2
➜  ~ helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories

检索验证repo:

1
helm search repo openldap
1
2
3
4
➜  ~ helm search repo openldap
NAME CHART VERSION APP VERSION DESCRIPTION
stable/openldap 1.2.7 2.4.48 DEPRECATED - Community developed LDAP software

拉取chart

为了能够进行配置修改操作,将chart拉到本地:

1
helm pull stable/openldap

解压chart:

1
tar -zxvf openldap-1.2.7.tgz 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜  github tar -zxvf openldap-1.2.7.tgz 
x openldap/Chart.yaml
x openldap/values.yaml
x openldap/templates/NOTES.txt
x openldap/templates/_helpers.tpl
x openldap/templates/configmap-customldif.yaml
x openldap/templates/configmap-env.yaml
x openldap/templates/deployment.yaml
x openldap/templates/pvc.yaml
x openldap/templates/secret.yaml
x openldap/templates/service.yaml
x openldap/templates/tests/openldap-test-runner.yaml
x openldap/templates/tests/openldap-tests.yaml
x openldap/.helmignore
x openldap/README.md

配置调整

拉取的Chart包,整体比较小,来看下大概的结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.
├── Chart.yaml
├── README.md
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── configmap-customldif.yaml
│   ├── configmap-env.yaml
│   ├── deployment.yaml
│   ├── pvc.yaml
│   ├── secret.yaml
│   ├── service.yaml
│   └── tests
│   ├── openldap-test-runner.yaml
│   └── openldap-tests.yaml
└── values.yaml

我们如果有参数方面的变更,可以在values.yaml文件内进行填充配置,或者修改配置。

templates目录下就是整个chart的模板,包含了部署需要的configmap、deployment、pvc、secret、svc等资源yaml模板。

刚刚我们拉取的Chart包 部署openldap,values.yaml文件内需要调整的地方不是很多:

1
2
3
4
5
6
7
8
env:
LDAP_ORGANISATION: "King Inc."
LDAP_DOMAIN: "king-ldap.net"
LDAP_BACKEND: "hdb"
LDAP_TLS: "false"
LDAP_TLS_ENFORCE: "false"
LDAP_REMOVE_CONFIG_AFTER_SETUP: "false"

部署

在chart的根目录执行安装:

1
helm install --kubeconfig=$HOME/.kube/king_test_config ldap ./
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Password:
WARNING: This chart is deprecated
NAME: ldap
LAST DEPLOYED: Wed Jan 15 21:56:54 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
OpenLDAP has been installed. You can access the server from within the k8s cluster using:

ldap-openldap.default.svc.cluster.local:389


You can access the LDAP adminPassword and configPassword using:

kubectl get secret --namespace default ldap-openldap -o jsonpath="{.data.LDAP_ADMIN_PASSWORD}" | base64 --decode; echo
kubectl get secret --namespace default ldap-openldap -o jsonpath="{.data.LDAP_CONFIG_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://ldap-openldap.default.svc.cluster.local:389 -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w $LDAP_ADMIN_PASSWORD


Test server health using Helm test:
helm test ldap


You can also consider installing the helm chart for phpldapadmin to manage this instance of OpenLDAP, or install Apache Directory Studio, and connect using kubectl port-forward.

Helm 测试

1
helm list ldap

查看idap的pod:

1
kubectl --kubeconfig=$HOME/.kube/king_test_config get pod -A|grep ldap
1
2
NAMESPACE            NAME                                               READY   STATUS    RESTARTS   AGE
default ldap-openldap-6d5cc55fc-vzq5v 1/1 Running 0 17m

登录idap的pod:

1
kubectl --kubeconfig=$HOME/.kube/king_test_config exec -it pod/ldap-openldap-6d5cc55fc-vzq5v -- /bin/bash

可以使用ldapsearch命令进行查询:

1
$ ldapsearch -x -b <search_base> -H <ldap_host> -D <bind_dn> -W
  • -x:表示简单的身份认证。
  • -b:指定搜索的 DC。
  • -H:指定搜索的主机 URL,如果你是在 LDAP 服务器上,则不需要带这个参数。比如我这里为 ldap://192.168.31.76:389
  • -D:绑定的 DN。
  • -W:绑定的 DN 的密码。

例如一个实际的查询命令:

1
ldapsearch -x -b "dc=king-ldap,dc=net" -D "cn=admin,dc=king-ldap,dc=net"  -W

会要求输入密码,可以如此获取:

1
env|grep -i PASSWORD
1
2
LDAP_CONFIG_PASSWORD=M2ulnYD2lZPvM1hKsYP5sCy8meDN8h61
LDAP_ADMIN_PASSWORD=a4QL47j3QvQWaTkDolvgLHpbpX8YDTdn

查询结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
root@ldap-openldap-6d5cc55fc-vzq5v:~# ldapsearch -x -b "dc=king-ldap,dc=net" -D "cn=admin,dc=king-ldap,dc=net"  -W
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <dc=king-ldap,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# king-ldap.net
dn: dc=king-ldap,dc=net
objectClass: top
objectClass: dcObject
objectClass: organization
o: King Inc.
dc: king-ldap

# admin, king-ldap.net
dn: cn=admin,dc=king-ldap,dc=net
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9eEl0d3JvcFN1cTgxelBLSFozVHYzQzJSdmtLcXNXenY=

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

Helm 数据持久化?

看下pvc的yaml模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: {{ template "openldap.fullname" . }}
labels:
app: {{ template "openldap.name" . }}
chart: {{ template "openldap.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
{{- if .Values.extraLabels }}
{{ toYaml .Values.extraLabels | indent 4 }}
{{- end }}
spec:
accessModes:
- {{ .Values.persistence.accessMode | quote }}
resources:
requests:
storage: {{ .Values.persistence.size | quote }}
{{- if .Values.persistence.storageClass }}
{{- if (eq "-" .Values.persistence.storageClass) }}
storageClassName: ""
{{- else }}
storageClassName: "{{ .Values.persistence.storageClass }}"
{{- end }}
{{- end }}
{{- end }}

根据配置,只要在values.yaml文件的这部分进行pvc配置的填入再进行安装即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

## Persist data to a persistent volume
persistence:
enabled: false
## database data Persistent Volume Storage Class
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, standard on
## GKE, AWS & OpenStack)
##
# storageClass: "-"
accessMode: ReadWriteOnce
size: 8Gi
# existingClaim: ""