PKI证书

kubernetes是需要PKI才能执行多数操作:

  1. kubelet的客户端证书:用于API服务器身份验证
  2. kubelet服务证书:用于API服务器与Kubelet的会话
  3. API服务器端点证书:用于HTTPS加密,确保通信加密
  4. 集群管理员的客户端证书:管理员(我)的工作证明
  5. API 服务器的客户端证书:用于和 Kubelet 的会话
  6. API 服务器的客户端证书:用于和 etcd 的会话
  7. 控制器管理器的客户端证书或 kubeconfig:用于和 API 服务器的会话
  8. 调度器的客户端证书或 kubeconfig:用于和 API 服务器的会话
  9. 前端代理的客户端及服务端证书

image-20240731153548422

自定义证书

  • 首先用kubeadm创建的kubernetes会生成集群所需地全部证书。
  • 其次你可以自定义,通过--cert-dir来指定不同的目录
  • 默认位置/etc/kubernetes/pki里面
  • kubeadm init --cert-dir /自定义目录/或者在kubeadm自定义的config的certificatesDir字段进行目录指定

外部CA

指在 Kubernetes 集群中使用由外部证书颁发机构(CA)签发的证书,而不是由 kubeadm 自行生成和管理 CA 证书。这种模式下,所有的证书和密钥都是由外部的 CA 签发的,提供更高的安全性和信任度,尤其在有严格合规性要求的环境中。

使用外部 CA 模式配置 Kubernetes 集群

  1. 准备外部 CA 签发的证书和密钥

    • 你需要从外部 CA 获取以下证书和密钥:
      • CA 证书 (ca.crt)
      • kube-apiserver 证书及其密钥 (apiserver.crtapiserver.key)
      • kube-controller-manager 证书及其密钥(可选,如果需要)
      • kube-scheduler 证书及其密钥(可选,如果需要)
      • 其他组件所需的证书及其密钥(如 etcd 等)
  2. 创建并配置 Kubernetes 配置文件

    • 创建一个 kubeadm 配置文件,如 kubeadm-config.yaml,并在其中指定 certificatesDirClusterConfiguration。示例如下:
      apiVersion: kubeadm.k8s.io/v1beta2
      kind: ClusterConfiguration
      kubernetesVersion: stable-1.21
      certificatesDir: /etc/kubernetes/pki
      apiServer:
      certSANs:
      - "your.domain.com"
      extraArgs:
      "tls-cert-file": "/etc/kubernetes/pki/apiserver.crt"
      "tls-private-key-file": "/etc/kubernetes/pki/apiserver.key"
  3. 将外部 CA 签发的证书和密钥放置在指定目录

    • 复制外部 CA 签发的证书和密钥到 /etc/kubernetes/pki 目录或你在配置文件中指定
sudo cp /path/to/ca.crt /etc/kubernetes/pki/ca.crt
sudo cp /path/to/apiserver.crt /etc/kubernetes/pki/apiserver.crt
sudo cp /path/to/apiserver.key /etc/kubernetes/pki/apiserver.key
  1. 运行 kubeadm 初始化命令
  • 使用 kubeadm 初始化命令并指定配置文件来初始化 Kubernetes 集群:
    sudo kubeadm init --config kubeadm-config.yaml

检查证书

kubeadm certs check-expiration

image-20240731161509499

ps:

  1. kubeadm不能管理外部ca

  2. 没有kubelet.conf的原因是kubeadm会将kubelet配置为自动更新证书,轮换在/var/lib/kubelet/pki

自动更新证书

kubeadm 提供了一种机制,在集群控制面(control plane)升级时自动更新所有证书。这种方式简化了证书管理,并确保在定期升级 Kubernetes 版本时保持集群的安全性。下面是详细的操作步骤和相关说明。

自动更新证书的机制

当你使用 kubeadm upgrade apply 命令升级控制面节点时,kubeadm 会自动更新所有的证书。

进。

禁用自动证书更新

如果你有更复杂的证书管理需求,可以选择在升级时禁用自动证书更新。可以通过传递 --certificate-renewal=false 参数来实现。

  1. 升级控制面节点时禁用证书更新

    sudo kubeadm upgrade apply v1.xx.x --certificate-renewal=false

    其中 v1.xx.x 为目标 Kubernetes 版本。

  2. 升级 worker 节点时禁用证书更新

    sudo kubeadm upgrade node --certificate-renewal=false

手动启用证书更新

在 Kubernetes 1.17 版本之前,kubeadm upgrade node 命令的 --certificate-renewal 参数默认值为 false,需要显式地设置为 true

显式启用证书更新的操作步骤
  1. 升级控制面节点时显式启用证书更新

    sudo kubeadm upgrade apply v1.xx.x --certificate-renewal=true
  2. 升级 worker 节点时显式启用证书更新

    sudo kubeadm upgrade node --certificate-renewal=true

手动更新证书

# 执行完此命令之后你需要重启控制面 Pod,运行了一个 HA 集群,这个命令需要在所有控制面板节点上执行。
kubeadm certs renew (all)

ps:kubeadm通常会把admin.conf 证书复制到 $HOME/.kube/config 中,在这样的系统中,为了在更新 admin.conf 后更新 $HOME/.kube/config 的内容, 你必须运行以下命令:

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config