以下将说明 KubeSphere 如何接入 AD 域账号,同样适用于对接外部 LDAP。

查看 AD 域

在 windows server 2016 上,进入 Active Director 管理中心,获取managerDN(可以是只读账号)

创建并编辑脚本

说明:目前版本仅支持通过在后台以脚本的形式接入 AD / LDAP 认证,接入的账号默认无任何权限,需要在集群用户管理页面赋予集群角色。

创建一个 inject-ks-account.sh 的脚本,然后修改脚本中host、managerDN、managerPWD、userSearchBase ,注意修改usernameAttributemailAttribute

#!/bin/bash
set -e

host="139.198.111.111:30222"    # 将 host 的值改为实际的服务器 IP 与 端口
managerDN="cn=Administrator,cn=Users,dc=kubesphere,dc=com"  # 值修改为实际的 AD 域的管理账号, 可以为只读账号
managerPWD="123456789"    #  管理账号密码
userSearchBase="cn=Users,dc=kubesphere,dc=com"   # 根据实配置进行修改
sidecar="kubespheredev/ad-sidecar:v0.0.4"

generate_config() {
cat << EOF
apiVersion: v1
data:
  sync.yaml: |
    sync:
      interval: "300s"
    src:
      host: "${host}"
      managerDN: "${managerDN}"
      managerPWD: "${managerPWD}"
      userSearchBase: "${userSearchBase}"
      usernameAttribute: "sAMAccountName"
      descriptionAttribute: "description"
      mailAttribute: "mail"
    dst:
      host: "openldap.kubesphere-system.svc:389"
      managerDN: "cn=admin,dc=kubesphere,dc=io"
      managerPWD: "admin"
      userSearchBase: "ou=Users,dc=kubesphere,dc=io"
kind: ConfigMap
metadata:
  name: ad-sync-config
  namespace: kubesphere-system
EOF
}

# apply sync config 
generate_config | kubectl apply -f -


# inject sidecar
kubectl -n kubesphere-system get deploy ks-account -o json | jq '.spec.template.spec.volumes += [{"configMap":{"name":"ad-sync-config"},"name":"ad-sync-config"}]' | jq '.spec.template.spec.containers += [{"command":["ad-sidecar","--logtostderr=true","--v=2"],"image":"'${sidecar}'","imagePullPolicy":"IfNotPresent","name":"ad-sidecar","ports":[{"containerPort":19090,"protocol":"TCP"}],"volumeMounts":[{"mountPath":"/etc/kubesphere/sync.yaml","name":"ad-sync-config","subPath":"sync.yaml"}]}]' | kubectl apply -f - 

# use proxy port
kubectl -n kubesphere-system get svc ks-account -o json | jq '.spec.ports[0].targetPort=19090' | kubectl apply -f -

创建完成后,后台执行 inject-ks-account.sh

待ks-account pod就绪后, 登录 kubesphere 可以看到 AD 中的账户数据

至此可以用AD中的账户登录 kubesphere

root@ks-allinone:~# kubectl get pods/ks-account-789d47f78c-2fqwl -n kubesphere-system
NAME                          READY   STATUS             RESTARTS   AGE
ks-account-789d47f78c-2fqwl   1/2     CrashLoopBackOff   174        14h

Error from server (BadRequest): a container name must be specified for pod ks-account-789d47f78c-2fqwl, choose one of: [ks-account ad-sidecar] or one of the init containers: [wait-redis wait-ldap]

正常情况下managerPWD不能给普通用户的。要用走流程申请,太麻烦了,每个要登录的人都要申请一次。

    ysicing 这里的managerDN 和managerPWD 可以是只读的管理账号,用于账户认证

      hongming 我知道,但是这个权限管的比较严。这样的设计有点不太合理。或者可以支持考虑支持
      oauth登录

        ysicing 接入 AD 账号这样的操作本来也应该是管理员级别的角色来操作吧,managerPWD也仅仅是管理账号的密码,接入KubeSphere后 AD 域内的账号还是可以用他们之前默认的帐密登录呀。

        Feynman 更改标题为「KubeSphere 如何接入 AD 域账号

        请问接入AD后,能否把用户名显示为 DisplayName,或者提供这样一个字段可以配置,目前只能显示 sAMAccountName 作为显示名称。管理上有所不便

        和k8s 中其他资源名一样 , kubesphere 中的username 也必须是唯一值,目前版本还无法展示displayName,可以到 gitub 上建立相关的issue方便追踪,最快将在 2.1.1 支持 displayName 属性

        非常感谢楼主,按照操作,KubeSphere 可实现接入 AD 域账号,但是在测试中发现有两个问题:
        1.AD 域,增加了用户,并不会KubeSphere显示,需要再次运行脚本,能否在KubeSphere增加同步账号功能?
        2.如果有多个AD 域,我尝试分别创建两个脚本,但是只能一个AD 域能够显示,这种情况如何解决?

        1. 配置中默认的同步时间是5分钟,可以调整
        2. 暂时无法接入多个AD域

          接入 AD / LDAP 的脚本与 KubeSphere 后端都是开源的,大家如果都对 LDAP / AD 接入有迫切需求 可以提 PR 参与开发和改进脚本,共同参与去解决 common issue,这才是开源项目的本质哈

          用这个方式成功同步了AD帐号,之前一直都能用,今天早上来发现ad帐号无法登陆了,提示帐号密码错误,admin帐号是可以登陆的,这个是2.1完全新部署的,老的2.0.2版本的ks用同样的帐号是可以登陆的,ad服务器应该没有问题,不知是何原因,3个ks-account的日志如图:

            winter 看样子是sidecar 被覆盖掉了,kubectl -n kubesphere-system get deploy ks-account -o yaml看看sidecar 还在不在, 如果没有sidecar 这个container 的话,需要重新跑一下脚本

              hongming 那天重跑了脚本可以登录了,但是今天又登录不了了,而且这次连admin都登录不了了,提示密码错误,但是密码肯定对的,在jenkins用admin帐号是可以登录的,当时那个是没有sidecar了,不知什么原因没了,这次是有sidecar的,admin在ks-account里的日志是报无效的授权,域帐号我在ad服务器上看到的日志是未知的帐号或密码错误

                winter 这种情况我也遇到过,不知道如何解决,后来我又重新部署了一次,期待。。。

                是否可以考虑支持oatuh2统一认证,场景:和其他应用集成在一起,不需要二次登陆。