1.
2.
3.
a.
b.
c.
教程(五)jenkins 集成k8s 的认证原理与配置总结
配置流程
之前说了jenkins与k8s整合后pipeline如何使用k8s来动态创建slave节点。 这次总结一下在jenkins中如何填写与k8s的通信配置。
在插件管理中安装kubernetes插件
在系统配置中,添加一个云
在云配置中填写kubernetes的配置,其中包括
kubernetes api server的ip地址和端口号
kubernetes 根证书key
如果jenkins master部署到k8s中的话只需要填写service name即可。 如果jenkins master部署在k8s外则比较麻烦,
需要在k8s中为jenkins创建一个service account, 然后为这个service
account配置rbac以便让jenkins有权限创建相关资源。 然后service account下的secret下复制它的token。
最后在jenkins中添加一个secret text类型的凭据,把token内容复制进去。 这样才能让jenkins与k8s通信
k8s安全机制详解
这里主要讲下上面第三步如何配置kubernetes的方法。 这里涉及到k8s的安全机制。
之前在研究的时候觉得这块内容非常好,所以在这里记录一下。
k8s有很多种安全认证机制,可以说这方面它做的还是很复杂的。这里主要涉及的是基于数据证书和service account
token的认证以及rbac的鉴权机制。
x509数据证书认证
x509认证是默认开启的认证方式,
api-server启动时会指定k8s的根证书(ca)以及ca的私钥,只要是通过ca签发的客户端x509证书,则可认为是可信的客户端。
这里提一下k8s是启用https进行通信的, 而且是双向加密。 也就是说不仅仅需要客户端信任服务端的根证书(ca)来验证服务端的身份,
也需要服务端信任客户端的数字证书来验证客户端的身份。
数据证书的原理
这里我先用一点时间来介绍一下数字证书的双向认证方式(尽量简单易懂)。 互联网在通信时如果使用tls或者ssl协议作为安全加密方式的话,
基本认证用户信息都是采用非对称加密方式(只有身份认证这么做, 因为非对称加密性能差) 也就是我们常见的一个私钥一个公钥。
自己留一个私钥,公钥公开给所有人。 那么从自己这里发送给别人的报文只有对应的公钥才能解密,
所以如果对方用你公开的公钥来解密,解密成功,那就能证明你是你, 如果解密不成功,那这个请求就是有风险的。
而如果对方要发消息给自己, 对方就要拿着公开的公钥加密它的小心然后发送过来, 如果你自己可以用私钥解密成功,
就说明这个报文没有经过篡改,如果解密失败那就说这个报文被人篡改过。 这就是非对称加密,
私钥和公钥都能加密数据,但是只有私钥才能解密公钥加密的数据,也只有公钥才能解密私钥加密的数据。
所以数据证书就是基于非对称加密来的。 它包含公钥、名称以及证书授权中心的数字签名。
客户端下载服务端的数字证书并选择信任这个证书。 那么就可以正常通信, 如果没有服务端的证书会怎么样。
还记得我们在浏览器中访问带有https的网站会蹦出来的的安全提示信息么 ----- 这是一个不受信任的网址,是否继续访问。
因为我们没有下载服务端证书并信任它, 所以我们手中没有对应的公钥能解密,所以这就是个不安全的访问(无法确认对方的身份)。
我们可以选择继续访问, 当然这时候会有人问既然没有公钥解密那是怎么能选择继续访问的呢,
我们刚才也说了,非对称算法只用来做身份的验证,它不会加密真正的报文数据。报文加密是对称算法做的事这里不细讲了。
所以我们做接口测试的时候如果遇到https的请求,需要下载数据证书并用代码加载, 或者就直接用代码的方式忽略这个身份认证的风险。
k8s的数字证书认证
k8s在部署时会自己创建一个CA(证书颁发)并产生CA的私钥和数字证书。
k8s其他服务的服务也都会生成自己的私钥并申请给CA,让CA办法服务自己的证书。 所以客户端,比如我们这次将的jenkins要与k8s整合,
要填写的证书的key的配置。其实是CA的证书(也就是跟证书) 而不是api-server的证书。 因为证书的机制是你信任了CA的证书,
那么也就顺带新人了CA颁发的所有其他的证书了。 那么在k8s中怎么查看根证书信息呢?
如果你能得到kubeconfig文件的话,那么它就在kubeconfig文件中的cluster信息里。 如果你不知道kubeconfig文件在哪,
可以使用命令kubectl config view --raw 来查看.