【 Kubernetes 风云录 】- Cert证书更新

Cert证书更新

文章目录

  • Cert证书更新
    • [生成新的 CA 证书和私钥](#生成新的 CA 证书和私钥)
      • [生成 CA 配置文件(可选)](#生成 CA 配置文件(可选))
      • [使用 `cfssl` 生成 CA 证书](#使用 cfssl 生成 CA 证书)
    • [生成 Kubernetes 组件证书和私钥](#生成 Kubernetes 组件证书和私钥)
      • [准备 JSON 配置文件](#准备 JSON 配置文件)
      • [生成私钥和 CSR(证书签名请求)](#生成私钥和 CSR(证书签名请求))
    • [使用 CA 签署组件证书**](#使用 CA 签署组件证书**)
      • [`ca-config.json` 示例](#ca-config.json 示例)
      • 文件说明
      • [使用 `ca-config.json` 签发证书](#使用 ca-config.json 签发证书)
    • 替换现有证书
    • [重启 Kubernetes 组件](#重启 Kubernetes 组件)
    • 验证证书更新
    • 总结

⚡️: 在安装K8S 节点的时候,使用的是手动签发 1年后Kubernetes 集群日志中出现 certificate has expired or is not yet valid 错误信息时,表明证书过期。

如果你没有现有的 CA 证书(如 ca.pemca-key.pem),你需要先创建一个新的 CA(Certificate Authority)来签署 Kubernetes 组件的证书。以下是如何在没有 CA 证书的情况下生成新的 CA 证书并更新集群中其他组件证书的步骤。

生成新的 CA 证书和私钥

首先,生成新的 CA 证书和私钥。这将为你创建用于签署其他 Kubernetes 组件证书的根 CA。

生成 CA 配置文件(可选)

你可以创建一个 CA 的配置 JSON 文件来定义 CA 证书的内容,比如 ca-csr.json

json 复制代码
{
  "CN": "Kubernetes-CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
        "C": "CN",
        "ST": "SuZhou",
        "L": "SuZhou",
        "O": "k8s",
        "OU": "System"
    }
  ]
}

使用 cfssl 生成 CA 证书

使用 cfssl 工具生成新的 CA 证书和私钥:

bash 复制代码
[root@ycloud proxy-client]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca

此命令将生成两个文件:

  • ca.pem: CA 根证书。
  • ca-key.pem: CA 私钥。

这些文件将用于签署 Kubernetes 组件的证书。

生成 Kubernetes 组件证书和私钥

现在你可以使用新生成的 CA 来为 Kubernetes 组件(如 API server、controller manager、scheduler 等)创建证书。

准备 JSON 配置文件

为每个组件创建一个 JSON 文件来定义证书请求参数。例如,kube-apiserver-csr.json

json 复制代码
{
  "CN": "kube-apiserver",
  "hosts": [
    "127.0.0.1",
    "kubernetes.default.svc",
    "10.96.0.1"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "San Francisco",
      "O": "Kubernetes",
      "OU": "Kubernetes The Hard Way"
    }
  ]
}

生成私钥和 CSR(证书签名请求)

使用 cfssl 生成私钥和 CSR 文件:

bash 复制代码
[root@ycloud proxy-client]#  cfssl genkey kube-apiserver-csr.json | cfssljson -bare kube-apiserver

此命令将生成:

  • kube-apiserver-key.pem: 私钥。
  • kube-apiserver.csr: 证书签名请求文件。

使用 CA 签署组件证书**

使用新生成的 CA 证书和私钥来签署 Kubernetes 组件证书,例如签署 kube-apiserver 证书:

bash 复制代码
[root@ycloud proxy-client]# cfssl sign -ca ca.pem -ca-key ca-key.pem -config ca-config.json -profile kubernetes kube-apiserver.csr | cfssljson -bare kube-apiserver

生成的 kube-apiserver.pem 是新的 API server 证书。

ca-config.json 是 CA(Certificate Authority)配置文件,它定义了 CA 签发证书时的一些全局配置和策略,比如有效期、不同证书类型的 profile 等。通常在使用 cfssl 工具时,这个文件用来指定 CA 签发证书的行为。

如果你还没有 ca-config.json 文件,你可以创建一个。例如,这里是一个典型的 ca-config.json 文件的示例:

ca-config.json 示例

bash 复制代码
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "expiry": "87600h",
        "usages": ["signing", "key encipherment", "server auth", "client auth"]
      }
    }
  }
}

文件说明

  • signing: 定义 CA 可以用来签发证书。

  • default : 设置默认的证书有效期,这里 87600h 表示十年。

  • :
    定义不同的证书类型。这里我们定义了 kubernetes 这个 profile。

    • expiry : 设置该 profile 下生成的证书有效期,87600h 同样表示十年。

    • :
      定义证书的使用场景,常见的有:

      • signing: 表示证书可以用来签署其他证书。
      • key encipherment: 表示证书用于密钥加密。
      • server auth: 表示证书用于服务器认证(如 Kubernetes API Server)。
      • client auth: 表示证书用于客户端认证(如 kubelet、kubectl)。

使用 ca-config.json 签发证书

有了 ca-config.json 文件后,你可以在签发证书时指定它。例如:

bash 复制代码
[root@ycloud proxy-client]# cfssl sign -ca ca.pem -ca-key ca-key.pem -config ca-config.json -profile kubernetes kube-apiserver.csr | cfssljson -bare kube-apiserver
  • -ca: 指定 CA 证书。
  • -ca-key: 指定 CA 私钥。
  • -config: 指定 ca-config.json 文件,用于签发证书时的配置。
  • -profile: 使用 kubernetes profile 来签发证书,这个 profile 是我们在 ca-config.json 中定义的。

这样,你的 CA 就会根据配置文件中指定的有效期和用途来签发符合 Kubernetes 需求的证书。

替换现有证书

将新生成的证书和私钥替换过期的证书。例如:

bash 复制代码
[root@ycloud proxy-client]# mv /etc/kubernetes/pki/kube-apiserver.pem /etc/kubernetes/pki/kube-apiserver.pem.bak
[root@ycloud proxy-client]# cp kube-apiserver.pem /etc/kubernetes/pki/kube-apiserver.pem

[root@ycloud proxy-client]# mv /etc/kubernetes/pki/kube-apiserver-key.pem /etc/kubernetes/pki/kube-apiserver-key.pem.bak
[root@ycloud proxy-client]# cp kube-apiserver-key.pem /etc/kubernetes/pki/kube-apiserver-key.pem

重启 Kubernetes 组件

替换证书后,重启相关的 Kubernetes 组件:

bash 复制代码
[root@ycloud proxy-client]# sudo systemctl restart kube-apiserver
[root@ycloud proxy-client]# sudo systemctl restart kube-controller-manager
[root@ycloud proxy-client]# sudo systemctl restart kube-scheduler
[root@ycloud proxy-client]# sudo systemctl restart kubelet

验证证书更新

验证 Kubernetes 集群是否正常工作:

bash 复制代码
[root@ycloud proxy-client]# kubectl get nodes

验证证书过期时间:

bash 复制代码
[root@ycloud proxy-client]# openssl x509 -in /etc/kubernetes/proxy-client/kube-apiserver.pem -noout -dates
notBefore=Sep 14 05:12:00 2024 GMT
notAfter=Sep 12 05:12:00 2034 GMT

总结

在没有 CA 证书的情况下,你需要先创建一个新的 CA 证书,并使用它签署 Kubernetes 组件的证书。通过 cfssl 工具,你可以生成新的 CA 和组件证书,然后替换集群中过期的证书并重启服务。这可以恢复集群的正常功能。

相关推荐
爱吃龙利鱼6 小时前
nginx实现https安全访问的详细配置过程
运维·nginx·安全·云原生·https
大白菜和MySQL7 小时前
rockylinux9.4单master节点k8s1.28集群部署
云原生·容器·kubernetes
玖石书7 小时前
Docker 容器网络技术
运维·docker·容器
向往风的男子7 小时前
【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(三十)
学习·容器·kubernetes
爱吃番茄的小狐狸13 小时前
Docker镜像下载-使用github action- 解决无法下载docker镜像的问题
docker·容器·github
andy7_14 小时前
运行在docker环境下的图片压缩小工具
运维·docker·容器
七夜zippoe15 小时前
nacos和eureka的区别详解
云原生·eureka
唐大爹15 小时前
kubeadm方式安装k8s续:
云原生·容器·kubernetes
陈小肚15 小时前
openeuler 22.03 lts sp4 使用 kubeadm 部署 k8s-v1.28.2 高可用集群
kubernetes
ly143567861915 小时前
94 、k8s之rbac
云原生·容器·kubernetes