apiserver 权限验证过程
集群中的鉴权方式之一是 RBAC,用户的标识是通过证书设置的 证书验证流程:
- API Server 读取客户端证书
- 从证书中提取 CN (Common Name) 作为用户名
- 从证书中提取 O (Organization) 作为用户所属的组
- 根据用户和组信息进行权限验证 cfssl 证书请求文件示例
{
"CN": "kubernetes",
"hosts": [
"localhost",
"127.0.0.1",
"10.0.30.9"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Guangdong",
"L": "Guangzhou",
"O": "system:masters",
"OU": "technology"
}
]
}
kubernetes 管理员证书
cluster-admin 是 kubernetes 内置的一个角色,这个角色比较特别
- 可以对集群中的所有资源执行所有操作
- 拥有集群级别的完全访问权限
- 可以管理所有命名空间中的所有资源
- 能够创建和管理集群范围的资源
- 通过 RBAC(基于角色的访问控制)系统实现
- 默认与 system:masters 组绑定
- 可以通过 RoleBinding 或 ClusterRoleBinding 绑定到用户
- 具有最高级别的特权访问权限
其中"默认与 system:masters 组绑定"这一个特点是我们创建 kubernetes 管理员证书的关键,创建 O 为 system:masters 的证书,该证书就具有了访问 kubernetes 集群的所有权限,成为了管理员证书 cfssl 证书请求文件示例
{
"CN": "kubernetes",
"hosts": [
"localhost",
"127.0.0.1",
"10.0.30.9"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Guangdong",
"L": "Guangzhou",
"O": "system:masters",
"OU": "technology"
}
]
}
静态 Pod
官方资料: kubernetes.io/zh-cn/docs/…
信任证书
之前二进制部署 apiserver 的时候报错,x509 certificate signed by unknown authority,出现原因是 kubernetes 组件的证书都是使用 cfssl 生成的根证书自签的,不是由权威机构发布,所以计算机系统发出了不信任的信号。我们可以通过将证书拷贝到系统证书目录,并重命名后缀为 .crt,并执行命令进行信任操作。
sudo cp etcd.pem /usr/local/share/ca-certificates/
cd /usr/local/share/ca-certificates && sudo mv etcd.pem etcd.crt
sudo update-ca-certificates
kubelet 证书须知
- 证书的 O (Organization) 字段应该是 "system:nodes",而不是 "system:masters"
- CN (Common Name) 应该使用格式 "system:node:" 用于节点认证
- 确保所有需要的 IP 地址和域名都包含在 SAN 列表中
示例 cfssl 证书请求文件
{
"CN": "system:node:srv-crawler-cn-14",
"hosts": [
"srv-crawler-cn-14",
"localhost",
"127.0.0.1",
"10.0.30.9"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Guangdong",
"L": "Guangzhou",
"O": "system:nodes",
"OU": "technology"
}
]
}
metrics-server
在部署 metrics-server 时,metrics-server pod 启动正常无错误日志,但是 kubectl top nodes 输出 error: Metrics API not available,且 apiserver 报错,具体报错信息为
E0306 11:07:51.127975 1 remote_available_controller.go:448] "Unhandled Error" err="v1beta1.metrics.k8s.io failed with: failing or missing response from https://10.244.1.16:10250/apis/metrics.k8s.io/v1beta1: bad status from https://10.244.1.16:10250/apis/metrics.k8s.io/v1beta1: 403" logger="UnhandledError"
解决方案:apiserver 没有配置聚合器身份认证,进行相关配置就好
通信过程:
Client -> API Server -> 扩展 API Server 的请求流程:
1. 客户端发送请求到 API Server
2. API Server 使用这个证书作为客户端证书
3. 与扩展 API Server 建立 TLS 连接
4. 扩展 API Server 验证此证书
5. 允许 API Server 代理请求