一、为什么要修改 kubeadm 证书时间

Kubernetes 官方提供了 kubeadm 工具安装 kubernetes 集群,使用这个工具安装集群非常便捷,使部署和升级 Kubernetes 变得简单起来。

不过该工具有点坑的就是,使用其安装的 kubernetes 集群的大部分证书有效期只有一年,需要在证书过期前,使用更新操作更新集群,使证书的有效期再续一年。如果忘记这个操作,那么在使用过程中证书到期将导致集群不可用,应用无法访问,急急忙忙解决也需要半天时间,这个问题是致命的。

不过实际情况下,在现网环境中大部分人追求稳定,一般不会大改 Kubernetes 版本,所以解决 kubeadm 集群证书有效期只有一年的最好办法就是重新编译 kubeadm 源码,将里面的 1 年有效期修改为 10 年或者 100 年,也不会影响使用 kubeadm 后续的升级,所以修改源码能很好的规避这个证书过期风险。

二、如何查看 kubernetes 证书过期时间

在执行修改 Kubeadm 源码且重新编译之前,我们先通观察下使用的官方的 Kubeadm 工具初始化的 Kubernetes 集群,观察在默认情况下证书过期时间,执行的命令如下:

$ kubeadm alpha certs check-expiration
然后可以看到输出的过期时间如下: CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Aug 14, 2022 03:15 UTC 364d no
apiserver Aug 14, 2022 03:15 UTC 364d ca no
apiserver-etcd-client Aug 14, 2022 03:15 UTC 364d etcd-ca no
apiserver-kubelet-client Aug 14, 2022 03:15 UTC 364d ca no
controller-manager.conf Aug 14, 2022 03:15 UTC 364d no
etcd-healthcheck-client Aug 14, 2022 03:15 UTC 364d etcd-ca no
etcd-peer Aug 14, 2022 03:15 UTC 364d etcd-ca no
etcd-server Aug 14, 2022 03:15 UTC 364d etcd-ca no
front-proxy-client Aug 14, 2022 03:15 UTC 364d front-proxy-ca no
scheduler.conf Aug 14, 2022 03:15 UTC 364d no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Aug 14, 2031 03:15 UTC 9y no
etcd-ca Aug 14, 2031 03:15 UTC 9y no
front-proxy-ca Aug 14, 2031 03:15 UTC 9y no

从上面可以了解到,默认情况下 ETCD 证书有效期是 10 年时间,其它证书有效期为 1 年时间,所以如果我们安装集群时没有修改证书过期时间,那么默认 1 年后可能会出现证书过期集群不可用的问题,所以接下来我们进入修改 kubeadm 源码过程。

三、修改 kubeadm 源码并重新编译

3.1 安装 Golang 等编译源码的环境包

由于 Kubeadm 是 Go 语言编写的,所以我们提前安装好编译 Kubeadm 源码的工具,操作过程按下面执行即可:

(1) 安装编译工具

$ yum install -y gcc make rsync jq

(2) 下载并配置 Golang 环境

## 下载 golang 1.15.15
$ wget https://dl.google.com/go/go1.15.15.linux-amd64.tar.gz ## 解压并放置在一个目录中
$ tar zxvf go1.15.15.linux-amd64.tar.gz -C /usr/local ## 编辑 /etc/profile 文件,添加 Go 环境配置内容
$ vi /etc/profile export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin ## 使配置生效
$ source /etc/profile ## 测试 Go 命令是否配置成功,成功则显示如下
$ go version go version go1.15.15 linux/amd64

3.2 下载 kubernetes 源码

下载 Kubernetes 源码,然后切换到指定版本,操作的命令如下:

## 下的 kubernetes 源码
$ git clone https://github.com/kubernetes/kubernetes.git ## 进入 Kubernetes 目录
$ cd kubernetes ## 切换 Kubernetes 版本
$ git checkout v1.20.9

3.3 修改 kubeadm 源码中证书过期时间

接下来我们修改 Kubernetes 代码中与 kubeadm 证书有效期相关的源码,操作的命令如下:

(1) 修改 constants.go 文件,操作如下:

$ vim cmd/kubeadm/app/constants/constants.go
########### 后面追加个 * 100 (注掉部分为源代码,后面跟着的是修改后的代码)
#const duration365d = time.Hour * 24 * 365
const duration365d = time.Hour * 24 * 365 * 100 // Config contains the basic fields required for creating a certificate
type Config struct {
CommonName string
Organization []string
AltNames AltNames
Usages []x509.ExtKeyUsage
}

(2) 修改 cert.go 文件,操作如下:

$ vim staging/src/k8s.io/client-go/util/cert/cert.go
########### 修改10年为100年(注掉部分为源代码,后面跟着的是修改后的代码)
#NotAfter: now.Add(duration365d * 10).UTC(),
NotAfter: now.Add(duration365d * 100).UTC(),
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
BasicConstraintsValid: true,
IsCA: true,
......

3.4 执行 kubeadm 编译

使用 make 命令编译 kubeadm, 执行的命令如下:

$ make all WHAT=cmd/kubeadm GOFLAGS=-v

编译成功后的 kubeadm 会放到当前目录中的 ./_output/local/bin/linux/amd64/ 目录中,我们进入到该文件下,查看是否有对应的文件。

## 进入
$ cd ./_output/local/bin/linux/amd64/ ## 查看文件列表
$ ls -l -rwxr-xr-x 10:03 conversion-gen
-rwxr-xr-x 10:03 deepcopy-gen
-rwxr-xr-x 10:03 defaulter-gen
-rwxr-xr-x 10:03 go2make
-rwxr-xr-x 10:04 go-bindata
-rwxr-xr-x 10:04 kubeadm
-rwxr-xr-x 10:47 kubectl
-rwxr-xr-x 10:34 kubelet
-rwxr-xr-x 10:04 openapi-gen
-rwxr-xr-x 10:03 prerelease-lifecycle-gen

四、续签证书

4.1 备份数据

kubectl -n kube-system get cm kubeadm-config -o yaml > kubeadm-config.yaml
$ cp -rp /etc/kubernetes /root/kubernetes_$(date +%F)
$ ls /etc/kubernetes_2024-08-25/
admin.conf controller-manager.conf kubelet.conf manifests pki scheduler.conf

4.2 续签证书

  • 查看证书到期时间
$ kubeadm alpha certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml' CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Feb 17, 2025 02:26 UTC 175d no
apiserver Feb 17, 2025 02:26 UTC 175d ca no
apiserver-etcd-client Feb 17, 2025 02:26 UTC 175d etcd-ca no
apiserver-kubelet-client Feb 17, 2025 02:26 UTC 175d ca no
controller-manager.conf Feb 17, 2025 02:26 UTC 175d no
etcd-healthcheck-client Feb 17, 2025 02:26 UTC 175d etcd-ca no
etcd-peer Feb 17, 2025 02:26 UTC 175d etcd-ca no
etcd-server Feb 17, 2025 02:26 UTC 175d etcd-ca no
front-proxy-client Feb 17, 2025 02:26 UTC 175d front-proxy-ca no
scheduler.conf Feb 17, 2025 02:26 UTC 175d no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Feb 06, 2033 02:38 UTC 8y no
etcd-ca Feb 06, 2033 02:38 UTC 8y no
front-proxy-ca Feb 06, 2033 02:38 UTC 8y no
  • 续签所有证书
./kubeadm alpha  certs renew all
  • 更新kubeconfig证书
$ mv $HOME/.kube/config $HOME/.kube/config.old
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ chown $(id -u):$(id -g) $HOME/.kube/config
  • 再次查看证书到期时间
$ kubeadm alpha certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml' CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Aug 01, 2124 02:58 UTC 99y no
apiserver Aug 01, 2124 02:58 UTC 99y ca no
apiserver-etcd-client Aug 01, 2124 02:58 UTC 99y etcd-ca no
apiserver-kubelet-client Aug 01, 2124 02:58 UTC 99y ca no
controller-manager.conf Aug 01, 2124 02:58 UTC 99y no
etcd-healthcheck-client Aug 01, 2124 02:58 UTC 99y etcd-ca no
etcd-peer Aug 01, 2124 02:58 UTC 99y etcd-ca no
etcd-server Aug 01, 2124 02:58 UTC 99y etcd-ca no
front-proxy-client Aug 01, 2124 02:58 UTC 99y front-proxy-ca no
scheduler.conf Aug 01, 2124 02:58 UTC 99y no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Feb 06, 2033 02:38 UTC 8y no
etcd-ca Feb 06, 2033 02:38 UTC 8y no
front-proxy-ca Feb 06, 2033 02:38 UTC 8y no

完成后重启 kube-api server、kube-controller、kube-scheduler、etcd 这 4 个容器即可,我们可以查看 apiserver 的证书的有效期来验证是否更新成功:

$ echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
notAfter=Aug 1 02:58:33 2124 GMT

可以看到现在的有效期是100年以后,证明已经更新成功。

  • 也可以直接获取所有证书的过期时间
$ for item in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`;do openssl x509 -in $item -text -noout| grep Not;echo ======================$item===============;done

            Not Before: Feb  9 02:38:42 2023 GMT
Not After : Feb 6 02:38:42 2033 GMT
======================/etc/kubernetes/pki/front-proxy-ca.crt===============
Not Before: Feb 9 02:38:43 2023 GMT
Not After : Aug 1 02:58:33 2124 GMT
======================/etc/kubernetes/pki/apiserver-etcd-client.crt===============
Not Before: Feb 9 02:38:41 2023 GMT
Not After : Feb 6 02:38:41 2033 GMT
======================/etc/kubernetes/pki/ca.crt===============
Not Before: Feb 9 02:38:41 2023 GMT
Not After : Aug 1 02:58:34 2124 GMT
======================/etc/kubernetes/pki/apiserver-kubelet-client.crt===============
Not Before: Feb 9 02:38:41 2023 GMT
Not After : Aug 1 02:58:33 2124 GMT
======================/etc/kubernetes/pki/apiserver.crt===============
Not Before: Feb 9 02:38:42 2023 GMT
Not After : Aug 1 02:58:36 2124 GMT
======================/etc/kubernetes/pki/front-proxy-client.crt===============
Not Before: Feb 9 02:38:43 2023 GMT
Not After : Aug 1 02:58:36 2124 GMT
======================/etc/kubernetes/pki/etcd/server.crt===============
Not Before: Feb 9 02:38:43 2023 GMT
Not After : Aug 1 02:58:35 2124 GMT
======================/etc/kubernetes/pki/etcd/peer.crt===============
Not Before: Feb 9 02:38:43 2023 GMT
Not After : Feb 6 02:38:43 2033 GMT
======================/etc/kubernetes/pki/etcd/ca.crt===============
Not Before: Feb 9 02:38:43 2023 GMT
Not After : Aug 1 02:58:34 2124 GMT
======================/etc/kubernetes/pki/etcd/healthcheck-client.crt===============
  • 高可用k8s master节点需要将以下证书拷贝至其他master节点并重启 kube-api server、kube-controller、kube-scheduler、etcd 4 个容器。
cp  /root/etc/kubernetes/pki/ca.* /etc/kubernetes/pki/
cp /root/etc/kubernetes/pki/sa.* /etc/kubernetes/pki/
cp /root/etc/kubernetes/pki/front-proxy-ca.* /etc/kubernetes/pki/
cp /root/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf
cp /etc/kubernetes/admin.conf /root/.kube/config

部分转载至 http://www.mydlq.club/article/118/

修改kubeadm证书过期时间及更新k8s集群证书的更多相关文章

  1. k8s集群证书过期(kubeadm 1.10.2 )

    1.k8s 集群架构描述 kubeadm v1.10.2创建k8s集群. master节点高可用,三节点(10.18.60.3.10.18.60.4.10.18.60.5). LVS实现master三 ...

  2. 使用kubeadm部署一套高可用k8s集群

    使用kubeadm部署一套高可用k8s集群 有疑问的地方可以看官方文档 准备环境 我的机器如下, 系统为ubuntu20.04, kubernetes版本1.21.0 hostname IP 硬件配置 ...

  3. 基于 kubeadm 部署单控制平面的 k8s 集群

    单控制平面不符合 HA 要求,但用于开发/测试环境不会有任何问题,如果资源足够的话(10台以上服务器,3台用于APIserver.3台用于 etcd 存储.至少3台用于工作节点.1台作为负载均衡),可 ...

  4. K8S 使用Kubeadm搭建高可用Kubernetes(K8S)集群 - 证书有效期100年

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...

  5. K8S集群证书已过期且etcd和apiserver已不能正常使用下的恢复方案

    在这种比较极端的情况下,要小心翼翼的规划和操作,才不会让集群彻底死翘翘.首先,几个ca根证书是10年期,应该还没有过期.我们可以基于这几个根证书,来重新生成一套可用的各组件认证证书. 前期,先制定以下 ...

  6. 关于k8s集群证书1年过期后,使用kubadm重新生成证书及kubeconfig配置文件的变化

    这个证书很重要,不用说. 但手工生成证书,确实工作量大且容易出错. 推荐的方式,是保留/etc/kubernetes/pki目录下的ca.crt,ca.key,sa.crt,sa.key. 这四个文件 ...

  7. 如何处理 Kubeadm 搭建的集群证书过期问题

    Kubeadm 证书过期处理 以下内容参考了如下链接:https://www.cnblogs.com/skymyyang/p/11093686.html 一.处理证书已过期的集群 使用 kubeadm ...

  8. 【Azure 微服务】Service Fabric, 使用ARM Template方式来更新SF集群的证书(Renew SF Certificate)

    问题描述 因证书过期导致Service Fabric集群挂掉(升级无法完成,节点不可用)一文中,描述了因为证书过期而导致了SF集群不可用,并且通过命令dd-AzServiceFabricCluster ...

  9. China Azure中部署Kubernetes(K8S)集群

    目前China Azure还不支持容器服务(ACS),使用名称"az acs create --orchestrator-type Kubernetes -g zymtest -n kube ...

  10. 配置k8s集群context-rbac实践

    说明 在openshift环境中,可以通过oc project {project_name}命令来切换project,那么在k8s中式如何切换namespace的呢?(ocp的project即相当于k ...

随机推荐

  1. CSDN 大规模抓取 GitHub 上的项目到 GitCode,伪造开发者主页引公愤

    事件起因 CSDN旗下的GitCode最近因为一种极其不道德的行为引起了开发者的广泛愤怒和抗议.CSDN在没有通知或征求开发者同意的情况下,悄悄地将大量GitHub上的开源项目搬运到了其自己的GitC ...

  2. 升级到 MySQL 8.4,MySQL 启动报错:io_setup() failed with EAGAIN

    问题 最近碰到一个 case,一台主机上,部署了多个实例.之前使用的是 MySQL 8.0,启动时没有任何问题.但升级到 MySQL 8.4 后,部分实例在启动时出现了以下错误. [Warning]  ...

  3. php常用缓存逻辑

    代码 //行为限频 if (!function_exists('doSomethingLimit')) { function doSomethingLimit($key, $second, Closu ...

  4. 2.3T NPU强势登场!NXP i.MX 8M Plus开启工业新篇章,14纳米!

                    更多产品详情以及购买咨询 可添加如下客服人员微信 (即刻添加,马上咨询) 更多i.MX 8M Plus产品资料 可长按二维码识别下载 如需选购,请登录创龙科技天猫旗舰店 ...

  5. Spring Reactor基本介绍和案例

    1. Reactor 对比 1.1 Reactor 线程模型 Reactor 线程模型就是通过 单个线程 使用 Java NIO 包中的 Selector 的 select()方法,进行监听.当获取到 ...

  6. 傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)

    傻瓜式Java操作MySQL数据库备份(使用mysqldump命令) 注释都是由chatGPT生成,有什么问题可以评论交流 @Value("${backup.sql.database}&qu ...

  7. Log4j日志输出级别详解

    log4j定义了8个级别的log 日志记录器(Logger)的行为是分等级的: 1.分为OFF(关闭所有日志).FATAL(致命错误).ERROR(异常报错).WARN(潜在错误).INFO.DEBU ...

  8. 洛谷P1057

    #include<iostream> #include<utility> using namespace std; typedef long long ll; #define ...

  9. BootstrapTable 行内编辑解决方案:bootstrap-table-editor

    最近开发的一个业务平台,是一个低代码业务平台.其中用到的了bootstrap-table组件.但是bootstrap-table自身不带编辑功能. 通过搜索发现,网上大部分的解决方案都是使用x-edi ...

  10. ctfshow sql-labs(笔记)

    这是当时做题的时候记得笔记有些乱看不懂的可以私我 判断闭合方式: id=1' and 1=1–+ *正常回显* id=1' and 1=2–+ *异常回显* id=1 and 1=1 *正常回显* i ...