Kubernetes实战指南:使用CFSSL创建PKI证书体系详解

Kubernetes实战指南:使用CFSSL创建PKI证书体系详解

kubernetes-handbook Kubernetes Handbook (Kubernetes指南) https://kubernetes.feisky.xyz kubernetes-handbook 项目地址: https://gitcode.com/gh_mirrors/kub/kubernetes-handbook

前言

在构建Kubernetes集群时,安全是首要考虑因素。本文将详细介绍如何使用CFSSL工具为Kubernetes集群创建完整的PKI(公钥基础设施)证书体系。这是Kubernetes集群安全通信的基础,也是集群各组件相互认证的关键。

什么是PKI和CFSSL

PKI(Public Key Infrastructure)是一套创建、管理、分发、使用、存储和撤销数字证书的体系结构。在Kubernetes中,PKI用于确保集群各组件间的安全通信。

CFSSL是一款PKI/TLS工具,它提供了简单易用的命令行工具来生成和管理证书。相比OpenSSL,CFSSL更加现代化,配置更简单。

准备工作

在开始之前,请确保:

  1. 已安装CFSSL工具
  2. 了解基本的证书概念(CA、证书、私钥等)
  3. 规划好Kubernetes集群的节点IP和主机名

创建CA证书

CA(Certificate Authority)证书是整个PKI体系的根证书,所有其他证书都由它签发。

1. 创建CA配置文件

首先创建CA的配置文件ca-config.json

{
  "signing": {
    "default": {
      "expiry": "8760h"  // 证书有效期1年
    },
    "profiles": {
      "kubernetes": {
        "usages": ["signing", "key encipherment", "server auth", "client auth"],
        "expiry": "8760h"
      }
    }
  }
}

这个配置文件定义了:

  • 默认证书有效期
  • 专门为Kubernetes定制的证书profile
  • 证书的用途(签名、密钥加密、服务器认证、客户端认证)

2. 创建CA证书签名请求(CSR)

接下来创建CA的CSR文件ca-csr.json

{
  "CN": "Kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "Portland",
      "O": "Kubernetes",
      "OU": "CA",
      "ST": "Oregon"
    }
  ]
}

这个文件定义了:

  • 通用名称(CN):Kubernetes
  • 密钥算法:RSA 2048位
  • 组织信息

3. 生成CA证书和私钥

执行以下命令生成CA证书和私钥:

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

这将生成两个关键文件:

  • ca-key.pem:CA的私钥,必须严格保密
  • ca.pem:CA的根证书,将分发给所有节点

创建各类组件证书

有了CA后,我们可以为Kubernetes各组件创建证书。

1. Admin管理员证书

管理员证书用于集群管理操作:

cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "Portland",
      "O": "system:masters",
      "OU": "Kubernetes The Hard Way",
      "ST": "Oregon"
    }
  ]
}
EOF

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=kubernetes \
  admin-csr.json | cfssljson -bare admin

关键点:

  • O: system:masters:赋予管理员最高权限
  • 生成admin-key.pemadmin.pem

2. Kubelet证书

Kubelet证书需要遵循Node Authorizer的要求:

for instance in worker-0 worker-1 worker-2; do
cat > ${instance}-csr.json <<EOF
{
  "CN": "system:node:${instance}",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "Portland",
      "O": "system:nodes",
      "OU": "Kubernetes The Hard Way",
      "ST": "Oregon"
    }
  ]
}
EOF

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -hostname=${instance},${EXTERNAL_IP},${INTERNAL_IP} \
  -profile=kubernetes \
  ${instance}-csr.json | cfssljson -bare ${instance}
done

关键点:

  • CN: system:node:<nodeName>:符合Node Authorizer要求
  • O: system:nodes:加入nodes组
  • 包含节点的主机名和IP地址

3. 控制平面组件证书

控制平面组件包括:

  • kube-controller-manager
  • kube-scheduler
  • kube-proxy

它们的证书创建方式类似,以kube-controller-manager为例:

cat > kube-controller-manager-csr.json <<EOF
{
  "CN": "system:kube-controller-manager",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "Portland",
      "O": "system:kube-controller-manager",
      "OU": "Kubernetes The Hard Way",
      "ST": "Oregon"
    }
  ]
}
EOF

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=kubernetes \
  kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager

4. Kubernetes API Server证书

API Server证书是最复杂的,需要包含所有可能的访问地址:

cat > kubernetes-csr.json <<EOF
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "Portland",
      "O": "Kubernetes",
      "OU": "Kubernetes The Hard Way",
      "ST": "Oregon"
    }
  ]
}
EOF

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -hostname=10.32.0.1,10.240.0.10,10.240.0.11,10.240.0.12,${KUBERNETES_PUBLIC_ADDRESS},127.0.0.1,${KUBERNETES_HOSTNAMES} \
  -profile=kubernetes \
  kubernetes-csr.json | cfssljson -bare kubernetes

关键点:

  • 包含Service Cluster IP(通常是10.32.0.1)
  • 包含所有控制节点的IP
  • 包含公共IP
  • 包含本地回环地址
  • 包含Kubernetes服务DNS名称

5. Service Account证书

Service Account用于Pod身份认证:

cat > service-account-csr.json <<EOF
{
  "CN": "service-accounts",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "Portland",
      "O": "Kubernetes",
      "OU": "Kubernetes The Hard Way",
      "ST": "Oregon"
    }
  ]
}
EOF

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=kubernetes \
  service-account-csr.json | cfssljson -bare service-account

分发证书

创建完所有证书后,需要将它们分发到对应节点:

# 分发到工作节点
for instance in worker-0 worker-1 worker-2; do
  scp ca.pem ${instance}-key.pem ${instance}.pem ${instance}:~/
done

# 分发到控制节点
for instance in controller-0 controller-1 controller-2; do
  scp ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem \
    service-account-key.pem service-account.pem ${instance}:~/
done

安全建议

  1. CA私钥(ca-key.pem)必须严格保护,最好存储在离线环境中
  2. 定期轮换证书(虽然我们设置了1年有效期)
  3. 使用RBAC严格控制证书权限
  4. 考虑使用证书管理工具(如Vault)进行自动化管理

总结

通过本文,我们完成了Kubernetes集群PKI体系的建立,包括:

  1. 创建根CA证书
  2. 为各组件创建专用证书
  3. 为管理员创建管理证书
  4. 为Kubelet创建符合Node Authorizer要求的证书
  5. 为Service Account创建证书
  6. 将证书分发到各节点

这为Kubernetes集群建立了完整的安全通信基础,下一步将基于这些证书配置Kubernetes各组件。

kubernetes-handbook Kubernetes Handbook (Kubernetes指南) https://kubernetes.feisky.xyz kubernetes-handbook 项目地址: https://gitcode.com/gh_mirrors/kub/kubernetes-handbook

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邱纳巧Gillian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值