我在部署 Kubernetes 时学到的那些事

98 阅读3分钟

apiserver 权限验证过程

集群中的鉴权方式之一是 RBAC,用户的标识是通过证书设置的 证书验证流程:

  1. API Server 读取客户端证书
  2. 从证书中提取 CN (Common Name) 作为用户名
  3. 从证书中提取 O (Organization) 作为用户所属的组
  4. 根据用户和组信息进行权限验证 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 证书须知

  1. 证书的 O (Organization) 字段应该是 "system:nodes",而不是 "system:masters"
  2. CN (Common Name) 应该使用格式 "system:node:" 用于节点认证
  3. 确保所有需要的 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 没有配置聚合器身份认证,进行相关配置就好

image.png

通信过程:

Client -> API Server -> 扩展 API Server 的请求流程:
1. 客户端发送请求到 API Server
2. API Server 使用这个证书作为客户端证书
3. 与扩展 API Server 建立 TLS 连接
4. 扩展 API Server 验证此证书
5. 允许 API Server 代理请求