基于Webhook的认证服务集成
之前我们学习了kubernetes有哪些认证插件,通过几个简单的最基础的认证方式,包括静态token,包括x509,包括serviceaccount,理解了认证插件是如何运作的。
如果要将一个k8s集群落地到你的企业,要做生产化运维的时候,你往往要做的的第一步就是和企业内部的认证平台去做集成。
如果只是小的集群,只有几个人使用,那么是没有必要的,因为k8s本身是开放式的平台,一般落地生产集群的时候,可以通过一些机制把它构建为多租户的平台,可以让企业用户都来使用这个平台。
可以通过和认证集成,通过权限控制,通过配额管理等这些手段放在一起,可以将其打造为多租户的集群,这会使得公司的效率有所提升。
下面是如何基于webhook去做企业的认证服务的集成。
什么是webhook?你要在K8s apiserver之外去跑一个服务,然后对apiserver做一些配置,当apiserver去做认证的时候,他要去读取有没有webhook的这种配置。
如果有的话,在配置里面你要告诉apiserver,本身你这个认证服务是要实现post的方法,按照k8s规范,你要告诉apiserver你这个服务跑在哪个地方。
如果你webhook开启了,它会将这个请求以Post方式发到它认证的路径上面,也就是它自己没有能力去认证用户信息,它就将这个请求转到外面的一个服务,让外面的服务代它去做认证。
整个认证服务的约定是什么?它本身也是遵循了k8s的api对象的一个约定,右边可以看到有自己的apiversion,它的类型是tokenreview,在k8s和webhook做集成的时候,它就组装了这么一个对象,对象里面就有spec,spec属性里面只有一个属性叫token,它就允许用户发一个token给我,我将token组装成这样一个对象,并且通过post方法发给一个外部认证的服务地址。
这个地址就需要我们自己去开发,我们要去解析apiserver发过来的请求,并且要去做对应的认证,如果认证通过我们要将tokenreview status填好,比如认证是否通过,其次用户名是什么,uid group是什么,将这些信息传回给apiserver之后,这个token我就交给了第三方的认证服务,第三方认证服务告诉我它是谁,最后决定这个请求是接受还是拒绝。
开发认证服务
这里面通过json.decode,将apiserver发过来的json字符串转化为token review对象,如果decode失败,就直接返回error认证失败。
如果你们公司有自己的ldap服务器,那么就可以写怎么去连接ldap, 将这个token发过去,看看它是不是认,通过这个方式让你的真正认证服务来校验这个token是否有效。
将认证服务跑起来,接下来要让apiserver去认这个服务。
来看看webhook-config.json,如果让apiserver和webhook去做集成,我必须让apiserver知道wehook,这个配置是要给到apiserver的,api会将请求转发到server路径,将请求发到这个地址认证就可以接住了。
配置
做一次认证,有效期是多少,每次认证都要走外部的话,那么它对外部的认证平台压力比较大,只要在有效期内,那么就会一直认这个token,而不会重新去做认证,这样提高了认证效率。