1. 说明

此项目需要镜像 bitnami/openldap:2.6

2. 导入配置

OpenLDAP 需要一些初始化配置才能工作。

2.1. 创建共享配置

我们可创建一个共享的 ConfigMap 以供系统使用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: ConfigMap
metadata:
  name: conf-ldap
  namespace: core-system
  labels:
    app: ldap
  annotations: (1)
    reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "kube-system,default,core-system,core-middleware,core-app,share-app,monitor-app,dev-ops"
    reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
    reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
    reflector.v1.k8s.emberstack.com/reflection-auto-namespaces: "kube-system,default,core-system,core-middleware,core-app,share-app,monitor-app,dev-ops"
data:
  LDAP_DOMAIN: 'cluster.local'
  LDAP_HOST: 'svc-ldap.core-system.svc.cluster.local'
  LDAP_URL: 'ldap://svc-ldap.core-system.svc.cluster.local:389'
  LDAP_ADDRESS_PORT: 'svc-ldap.core-system.svc.cluster.local:389'
  LDAP_BASE_DN: 'dc=cluster,dc=local'
  LDAP_USERS_DN: 'ou=people,dc=cluster,dc=local'
  LDAP_GROUPS_DN: 'ou=groups,dc=cluster,dc=local'
  LDAP_BIND_DN: 'cn=service-account,dc=cluster,dc=local'
其中:
1 复制此 ConfigMap 到各个 namespace 下 (reflector 提供)

2.2. 创建 Secret

部署 OpenLDAP 前,需要配置管理员密码和共享用户密码。

 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
apiVersion: v1
kind: Secret
metadata:
  name: secret-ldap-admin
  namespace: core-system
  labels:
    app: ldap
type: Opaque
stringData:
  LDAP_ADMIN_DN: 'cn=admin,dc=cluster,dc=local'
  LDAP_ADMIN_USERNAME: 'admin'
  LDAP_ADMIN_PASSWORD: 'admin' (1)
---
apiVersion: v1
kind: Secret
metadata:
  name: secret-ldap-service
  namespace: core-system
  labels:
    app: ldap
  annotations: (2)
    reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "kube-system,default,core-system,core-middleware,core-app,share-app,monitor-app,dev-ops"
    reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
    reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
    reflector.v1.k8s.emberstack.com/reflection-auto-namespaces: "kube-system,default,core-system,core-middleware,core-app,share-app,monitor-app,dev-ops"
type: Opaque
stringData:
  LDAP_BIND_DN_PASSWORD: 'service-account' (3)
其中:
1 设置管理员密码,请将其设置为复杂的密码
2 配置共享用户秘密共享
3 只读用户密码
生产环境部署一定要更改为复杂的密码!

3. 部署 OpenLDAP

3.1. 创建持久化存储

OpenLDAP 运行过程中需要存储数据。使用以下 YAML 创建,注意,此处需要用到之前教程创建的 StroageClass

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-ldap
  namespace: core-system
  labels:
    app: ldap
spec:
  storageClassName: 'sc-nfs-share'
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

3.2. 导入初始化配置

使用以下配置初始化 LDAP 服务器,将完成以下功能:

  • 支持 memberOf

  • 创建相关服务账户

  • 创建此文档相关联的角色

  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
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
apiVersion: v1
kind: ConfigMap
metadata:
  name: conf-ldap-schema
  namespace: core-system
  labels:
    app: ldap
data:
  bootstrap.sh: |
    #!/usr/bin/env bash
    set -e
    SRC_PATH=/bootstrap
    DIST_PATH=/workspace
    mkdir -p $DIST_PATH $DIST_PATH/custom
    for ldif_path in $(cd $SRC_PATH ; ls *.ldif) ;do
        cat "$SRC_PATH/$ldif_path" | sed \
            -e "s|<_BIND_DN_PASSWORD_>|$(slappasswd -h {SSHA} -s ${LDAP_BIND_DN_PASSWORD})|g" \
            -e "s|<_ADMIN_PASSWORD_>|$(slappasswd -h {SSHA} -s ${LDAP_ADMIN_PASSWORD})|g" | tee "$DIST_PATH/$ldif_path" > /dev/null
    done 
    mv $DIST_PATH/*.ldif $DIST_PATH/custom/
    mv $DIST_PATH/custom/schema.ldif $DIST_PATH/schema.ldif
    exit 0
  schema.ldif: |
    dn: cn=module,cn=config
    cn: module
    objectClass: olcModuleList
    olcModulePath: /opt/bitnami/openldap/lib/openldap
    olcModuleLoad: memberof.so
    olcModuleLoad: refint.so

    dn: olcOverlay=memberof,olcDatabase={2}mdb,cn=config
    objectClass: olcMemberOf
    objectClass: olcOverlayConfig
    olcOverlay: memberof

    dn: olcOverlay=refint,olcDatabase={2}mdb,cn=config
    objectClass: olcConfig
    objectClass: olcOverlayConfig
    objectClass: olcRefintConfig
    objectClass: top
    olcOverlay: refint
    olcRefintAttribute: memberof member manager owner

  01-top.ldif: |
    dn: dc=cluster,dc=local
    objectClass: top
    objectClass: dcObject
    objectClass: organization
    o: cluster local
    dc: cluster
    
    dn: ou=people,dc=cluster,dc=local
    objectClass: organizationalUnit
    description: LDAP系统角色分组
    ou: people
    
    dn: ou=groups,dc=cluster,dc=local
    objectClass: organizationalUnit
    description: LDAP集群用户分组
    ou: groups
    
    dn: cn=service-account,dc=cluster,dc=local
    cn: service-account
    description: Bind DN 账户,用于查询LDAP服务器内部信息
    objectClass: simpleSecurityObject
    objectClass: organizationalRole
    userPassword: <_BIND_DN_PASSWORD_>
  02-users-admin.ldif: |
    dn: uid=admin,ou=people,dc=cluster,dc=local
    cn: admin
    sn: admin
    uid: admin
    description: 系统自动创建的默认管理员用户
    objectClass: inetOrgPerson
    objectClass: organizationalPerson
    objectClass: person
    mail: admin@cluster.local
    userPassword: <_ADMIN_PASSWORD_>
  03-cluster-groups.ldif: |
    dn: cn=oci,ou=groups,dc=cluster,dc=local
    cn: oci
    description: 镜像操作员角色
    member: uid=admin,ou=people,dc=cluster,dc=local
    objectClass: groupOfNames
    
    dn: cn=admin,ou=groups,dc=cluster,dc=local
    cn: admin
    description: 管理员角色
    member: uid=admin,ou=people,dc=cluster,dc=local
    objectClass: groupOfNames
    
    dn: cn=develop,ou=groups,dc=cluster,dc=local
    cn: develop
    description: 项目开发者角色
    member: uid=admin,ou=people,dc=cluster,dc=local
    objectClass: groupOfNames
    
    dn: cn=library,ou=groups,dc=cluster,dc=local
    cn: library
    description: 依赖库上传者角色
    member: uid=admin,ou=people,dc=cluster,dc=local
    objectClass: groupOfNames
    
    dn: cn=package,ou=groups,dc=cluster,dc=local
    cn: package
    description: 软件包上传者角色
    member: uid=admin,ou=people,dc=cluster,dc=local
    objectClass: groupOfNames
    
    dn: cn=monitor,ou=groups,dc=cluster,dc=local
    cn: monitor
    description: 集群监控监控管理角色
    member: uid=admin,ou=people,dc=cluster,dc=local
    objectClass: groupOfNames

3.3. 部署 OpenLDAP 服务

现在可以部署 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
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
apiVersion: v1
kind: Service
metadata:
  labels:
    app: ldap
  name: svc-ldap
  namespace: core-system
spec:
  ports:
    - port: 389
      targetPort: 1389
  selector:
    app: ldap
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-ldap
  namespace: core-system
  labels:
    app: ldap
spec:
  serviceName: svc-ldap
  selector:
    matchLabels:
      app: ldap
  replicas: 1
  template:
    metadata:
      labels:
        app: ldap
    spec:
      containers:
        - name: ldap-core
          image: docker.io/bitnami/openldap:2.6
          volumeMounts:
            - name: ldap-data
              mountPath: /bitnami/openldap
            - name: ldap-workspace
              mountPath: /workspace
          ports:
            - containerPort: 1389
              name: openldap
          envFrom:
            - secretRef:
                name: secret-ldap-admin
            - secretRef:
                name: secret-ldap-service
          env:
            - name: LDAP_ROOT
              valueFrom:
                configMapKeyRef:
                  key: LDAP_BASE_DN
                  name: conf-ldap
            - name: LDAP_ALLOW_ANON_BINDING
              value: "no"
            - name: LDAP_SKIP_DEFAULT_TREE
              value: "yes"
            - name: LDAP_CUSTOM_SCHEMA_FILE
              value: "/workspace/schema.ldif"
            - name: LDAP_CUSTOM_LDIF_DIR
              value: "/workspace/custom"
      initContainers:
        - name: ldap-pre
          image: bitnami/openldap:2.6
          envFrom:
            - secretRef:
                name: secret-ldap-admin
            - secretRef:
                name: secret-ldap-service
          command:
            - bash
            - /bootstrap/bootstrap.sh
          volumeMounts:
            - mountPath: /workspace
              name: ldap-workspace
            - mountPath: /bootstrap
              name: ldap-schema

      volumes:
        - name: ldap-data
          persistentVolumeClaim:
            claimName: pvc-ldap
        - name: ldap-schema
          configMap:
            name: conf-ldap-schema
        - name: ldap-workspace
          emptyDir: { }
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: ldap
  name: svc-ldap-lb
  namespace: core-system
  annotations:
    metallb.universe.tf/allow-shared-ip: "private-ip-share"
spec:
  ports:
    - port: 389
      targetPort: 1389
  selector:
    app: ldap
  type: LoadBalancer

4. 验证

部署完成后,执行以下命令验证部署的完整性。

1
2
3
# 检查配置是否同步到 default 命名空间
kubectl get secrets,configmaps  -n core-system
kubectl get pods,service -n core-system

确认 Pod 状态均为 Running 且未多次重启即表示部署无误。

5. 扩展

可使用 CURL 测试 LDAP .

1
curl --user $LDAP_BIND_DN:$LDAP_PASS ldap://$LDAP_HOST/$LDAP_BASE?uid?one?"$LDAP_USER_FILTER"

如遇到 LDAP 出现问题,可使用以下命令快速清除

1
2
kubectl exec -it -n core-system pods/sts-ldap-0 -- rm -rf '/bitnami/openldap/data' '/bitnami/openldap/slapd.d'
kubectl delete -n core-system pods/sts-ldap-0