前面演示了如何通过静态token和x509的方式完成认证,接着看看如何集成外部认证服务完成kube-apiserver的认证。如果k8s需要链接外部认证服务,那么认证服务需要满足Kubenetes的规范,即认证接口的URL=https://authservice/authenticate,Method=POST,Input格式如下所示
{"apiVersion":"authentication.k8s.io/v1beta1",
"kind":"TokenReview",
"spec":{
"token": "tokenvalue"
}}
当认证服务满足上面的规范后,kube-apiserver是如何对接外部认证服务完成认证的呢?下面将以github代替真正的认证为例子给大家演示认证过程.(备注:github上生成token,当把token发送到github后,github可以返回token认证是否成功的信息),具体的认证过程如下所示
为了演示如何通过webhook完成认证,首先需要创建webhook服务,并在本地启动它,具体webhook服务的代码请看这里。 这里的makefile配置的操作系统是Linux,如果是mac电脑,需要修改makefile中“GOOS=darwin”。该webhook的服务大致的作用是将APIServer发送过来的请求进行decode,如果decode成功则把信息转发给认证服务(这里用的github,因为github上可以生成token,然后完成认证的功能,实际项目中应该是转发到企业的认证服务上)。github认证完成后,返回认证结果信息,webhook将认证结果信息返回给apiserver。
webhook服务在本地启动后,可以访问3000端口checkwebhook服务是否启动成功。
在github上生成一个token,然后通过api访问webhook服务,可以看到返回了认证成功的消息,说明webhook服务正确启动了。
webhook服务启动后,如何让APIServer把请求转发到webhook呢?这里就需要先创建webhook-config.json文件,具体内容如下,可以看到下面的api对象是一个Config对象,这里最主要的是server信息配置,这里的IP地址是本机的IP地址,因为上面的webhook服务启动后是监听3000端口,所以这里server地址是http://xxx:3000/authenticate.
{
"kind": "Config",
"apiVersion": "v1",
"preferences": {},
"clusters": [
{
"name": "github-authn",
"cluster": {
"server": "http://xx.xx.xx.xx:3000/authenticate"
}
}
],
"users": [
{
"name": "authn-apiserver",
"user": {
"token": "secret"
}
}
],
"contexts": [
{
"name": "webhook",
"context": {
"cluster": "github-authn",
"user": "authn-apiserver"
}
}
],
"current-context": "webhook"
}
接着,将该文件存放到集群中的/etc/config目录下,然后修改/etc/kubernetes/manifests/kube-apiserver.yaml,增加webhook-config的配置。
修改kube-apiserver.yaml文件后,kube-apiserver会自动重启,执行“kubectl get pod”能正常返回信息则重启成功,如果提示localhost:xxx:6443 connect refuse,说明kube-apiserver重启失败,需要检查kube-apiserver.yaml文件配置是否正确。
kube-apiserver.yaml文件修改成功后,接着在github上生成一个token.
修改~/.kube/config文件,新增一个user,且user的token是刚刚在github生成的token
此时,用githubuser获取pod信息,会返回403的信息,说明认证已经通过,只是该用户无权限访问pod资源而已。指定用户获取pod信息的命令:kubectl get po --user githubuser。
以上就是通过集成外部认证服务完成kube-apiserver认证的过程。