OpenLDAP迁移总结

这两天总算把我的openLDAP从一台固定的机器上迁移到了rancher管理的k8s集群里。总体感受就是:如果有来生,打死我也不弄这个玩意了。


首先,解释一下之前为什么把openLDAP放到一台独立的固定机器上。简单来说,之前所有服务全部走openLDAP做认证,现在改成了除了rancher以外的所有服务都走openLDAP做认证。

之所以做这个改动的原因是,openLDAP负责的服务越来越多,责任越来越大。各种备份、自动恢复、不是很高可用的高可用之类的价值越来越大。而之前固定一台机器的做法,显然已经不符合时代的需要了。将openLDAP放到rancher里之后,虽然rancher是不能用它登陆了。但是我至少可以保留10年的备份,而且毕竟k8s,一个node挂了,还有别的node。

当然openLDAP对我来说的确是非常必要的。我大约有4-5个服务需要认证,而且这些服务之间存在service account,有相互访问的需求,所以用户统一管理是必然的。而最难受的就是,不是每个服务都支持目前流行的认证方式,其中nexus只支持ldap。所以ldap是唯一的选择。同时我又没找到什么别的更好用且能负担的工具(比如Azure AD domain service,AD DS,就太贵了)。

而且,显然认证肯定是要ssl的,所以证书又成了一个麻烦的事情。而且如果ldap作为一个服务没有一个地方和其他服务一起统一管理的话,很可能忘记更新证书。如果忘记更新证书的话,那后果是……

至于rancher成为了目前唯一一个使用azure ad的服务。其实也算合理,因为之后rancher会再host一个openLDAP,专门用于pub的服务相关认证。

总结一下,整个迁移的价值在于:

  1. Ldap属于关键服务,要经常备份,也要保证一定的可用性。
  2. 拆分我自己服务和我share出来的服务的ldap。
  3. Azure AD DS太贵了,买不起。
  4. Rancher同时作为两个AD的管理者,有理由使用独立的认证。
  5. 统一证书管理

迁移过程总的来说就是把/etc/ldap/slapd.d,/var/lib/ldap以及/container/service/slapd/assets/certs/打包,然后扔进集群就行。然后就花了足足5个小时。主要的问题在于证书这一块非常麻烦。

首先,1202年了,不会还有人直接把certificates打进docker image里吧?不会吧不会吧?所以和之前把证书直接放在机器上,然后通过volume映射进去不同,这些证书会被放进集群的secrets里,然后runtime的时候给到container。

于是第一个坑就来了。secrets映射进去,要么走环境变量,要么走volume映射进去。环境变量显然是不太行的,还是说有人会愿意把环境变量echo成文件?但其实volume也很坑。

我使用的是osixia/openldap这个image。选择这个image主要是用的人多,而且在github上也有源码的样子。

我们从这个image的github上可以看到,这个image支持一个叫做DISABLE_CHOWN的环境变量,说是可以Do not perform any chown to fix file ownership.。但这里就是一个神坑,因为这个变量的确可以阻止绝大多数的chown,但对于certificates,他依然会尝试chown到911这个user。而众所周知,把secrets通过volume映射成container里的文件是只读的……只读的……这就意味着,就算我给这些文件644 container也拉不起来。

于是呢,我的第一反应是给个init container。利用一个ubuntu的container,把证书的权限先调对了,拷贝到一个volume后再把这个volume挂到ldap上。

结果就踩了第二坑。这个坑主要是我其实并不懂slapd,也不懂这个image具体的运行方式导致的。就这个image,关于cert的存储路径似乎有三个地方:/container/run/service/slapd/assets/certs/, /container/service/service/slapd/assets/certs//container/service/slapd/assets/certs/。各种分不清楚,各种搞错,然后各种拉不起container。

最后,选择不当人了。要什么init container,直接覆盖这个image的entry point,自己写脚本。具体的做法是:

  1. secrets挂载到另外一个路径:/certs/
  2. Entrypoint覆写成:sh -c
  3. Command覆写成:'mkdir -p /container/service/slapd/assets/certs/ && cp /certs/* /container/service/slapd/assets/certs/ && chown -R 911 /container/service/slapd/assets/certs/ && /container/tool/run'

反正变态就完事了。


最后的最后,珍惜生命,远离LDAP。这还只是迁移一下,我记忆中学习和搭建这玩意简直就是噩梦。太复古了,各方面成本太高了。

展示评论