变更记录
| 版本号 | 作者 | 修订内容 | 发布日期 | 
|---|---|---|---|
| 1.0 | … | 发布文档 | 2022-05-17 | 
项目背景
Kubernetes集群中所有资源的访问和变更都是通过Kubernetes APl Server 的RESTAPI来实现的,所以集群安全的关键点就在于如何识别并认证客户端身份(Authentication),以及随后访问权限的授权(Authorization)这两个关键问题。<br />Kubernetes集群提供了3种级别的客户端身份认证方式。
- 最严格的HTTPS证书认证:基于CA根证书签名的双向数字证书认证方式。
 - HTTP Token认证:通过一个Token来识别合法用户。
 - HTTP Base认证:通过用户名+密码的方式认证。这种认证方式被报告有安全问题,在 Kubernetes v1.19版本被删除,问题链接
 
参考资料
- 官网资料:https://kubernetes.io/zh/docs/reference/access-authn-authz/authentication/#users-in-kubernetes
 - Token Point的身份验证:https://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint
 - 参考书籍:Kubernetes权威指南:从Docker到Kubernetes实践全接触(第2版)-2016.10-电工-P519-龚正,吴治辉,王伟 等.pdf
 - 
功能模块
主要涉及到的功能是添加集群以及修改集群,用户可选择不同的添加或修改集群的方式。
 kubeconfig:用户需要获取到集群的kubeconfig文件从而实现添加或修改操作。
- Service Account:用户需要在集群中创建service account账号并绑定角色为其授予权限。
 
具体操作如下:
#获取集群端点kubectl config view#创建一个名称空间,也可在default下kubectl create ns namespace#在kubectl命令行工具中执行create命令创建serviceaccount帐户test。kubectl create serviceaccount test -n default#将serviceaccount帐号加入到绑定的集群角色default-sa-crb中,权限是cluster-adminkubectl create clusterrolebinding default-sa-crb \--clusterrole=cluster-admin \--serviceaccount=default:test# 提取服务帐号token。kubectl describe secret -n default $(kubectl get secret -n default -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='test')].metadata.name}")#访问api测试curl -k -XGET -H "Authorization: Bearer xxx" 'https://x.x.x.x:6443/api'
流程图
时序图
使用http token的验证方式实现访问K8S-APIServer的效果,主要是依赖于kubernetes的自身特性。如下图,该图表示的是用户在获取到身份验证的token之后,即可使用token连接kubectl,在通过JWT认证后,就能成功获取到数据。<br />
API 设计
url(不变)
POST /clouldnative/v1/kubernetes_clustersPUT /clouldnative/v1/kubernetes_cluster/{clusterId}
接口参数修改
| 参数 | 描述 | 备注 | 
|---|---|---|
| authType | kubernetes集群认证类型 | 0:未指定 1:kubeconfig认证  | 
| 用户名 | 删 | |
| 用户密码 | 删 | |
| authServiceAccount | kubernetes服务账号 | 这一项可以删去,因为JWT token中已经包含服务账号的信息 | 
| authServiceToken | kubernetes服务令牌 | 这一项的可以支持两种类型,一是string类型,二是可以使用token文件 | 
| host | kubernetes端点 | 新增 | 
PS:解码JWT token,可以看到其中包含了服务账号信息等。
ok,加一个时序图
以添加集群为例:
编辑集群
类图
在更新集群信息之后,保护服务调了监控集群的方法,资源管理服务通知所有节点删除缓存的客户端,并构建新的客户端,通知cache进程对该集群重新cache,
但是它没有把这个新的客户端给它存到etcd里
而是将集群的clusterId设置租约打上tag放到etcd里,监控集群时先要在集合里查这个clusterId,如果有的话就继续监控,
验证集群连通性
