Kubernetes1.28 编译 kubeadm修改证书有效期到 100年.并更新k8s集群证书

news/2025/1/15 1:34:06 标签: kubernetes, 容器, 云原生

文章目录

  • 前言
  • 一、资源准备
    • 1. 下载对应源码
    • 2.安装编译工具
    • 3.安装并设置golang
  • 二、修改证书有效期
    • 1.修改证书有效期
    • 2.修改 CA 证书有效期
  • 三、编译kubeadm
  • 四、使用新kubeadm方式
    • 1.当部署新集群时,使用该kubeadm进行初始化
    • 2.替换现有集群kubeadm操作


前言

kubeadm 默认证书为一年,一年过期后会导致 api service 不可用,使用过程中会出现:x509: certificate has expired or is not yet valid.错误。为了防止过期后未及时替换证书的情况出现,建议在部署k8s集群前就编译好100年的kubeadm组件,避免后续重复替换证书步骤


已经测试适用于1.28版本,编译机器是麒麟V10 SP2 x86_64架构

一、资源准备

1. 下载对应源码

[root@ops ~]# git clone https://github.com/kubernetes/kubernetes.git
[root@ops ~]# cd kubernetes
[root@ops ~]# git checkout -b remotes/origin/release-1.28 v1.28.2

2.安装编译工具

[root@ops ~]# yum install -y gcc make rsync jq

3.安装并设置golang

[root@ops ~]#  wget https://dl.google.com/go/go1.20.8.linux-amd64.tar.gz
## 解压并放置在一个目录中
[root@ops ~]#  tar zxvf go1.20.8.linux-amd64.tar.gz  -C /usr/local

## 编辑 /etc/profile 文件,添加 Go 环境配置内容
[root@ops ~]# vi /etc/profile
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin

## 使配置生效
[root@ops ~]# source /etc/profile

## 测试 Go 命令是否配置成功,成功则显示如下
[root@ops ~]# go version
go version go1.20.2 linux/amd64

二、修改证书有效期

主要是以下两个地方进行修改即可

1.修改证书有效期

代码如下(示例):

[root@ops ~]# vim cmd/kubeadm/app/constants/constants.go

const (
        // KubernetesDir is the directory Kubernetes owns for storing various configuration files
        KubernetesDir = "/etc/kubernetes"
        // ManifestsSubDirName defines directory name to store manifests
        ManifestsSubDirName = "manifests"
        // TempDirForKubeadm defines temporary directory for kubeadm
        // should be joined with KubernetesDir.
        TempDirForKubeadm = "tmp"

        // CertificateValidity defines the validity for all the signed certificates generated by kubeadm
        // CertificateValidity = time.Hour * 24 * 365 #默认为1年
        CertificateValidity = time.Hour * 24 * 365 * 100  #设置此处 

        // CACertAndKeyBaseName defines certificate authority base name
        CACertAndKeyBaseName = "ca"
        // CACertName defines certificate name
        CACertName = "ca.crt"
        // CAKeyName defines certificate name
        CAKeyName = "ca.key"
        ...
       )

2.修改 CA 证书有效期

代码如下(示例):

[root@ops ~]# vim staging/src/k8s.io/client-go/util/cert/cert.go

func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) {
        now := time.Now()
        tmpl := x509.Certificate{
                SerialNumber: new(big.Int).SetInt64(0),
                Subject: pkix.Name{
                        CommonName:   cfg.CommonName,
                        Organization: cfg.Organization,
                },
                DNSNames:              []string{cfg.CommonName},
                NotBefore:             now.UTC(),
                NotAfter:              now.Add(duration365d * 100).UTC(),     ##### 这里改成 100 年
                KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
                BasicConstraintsValid: true,
                IsCA:                  true,
        }

        certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &tmpl, &tmpl, key.Public(), key)
        if err != nil {
                return nil, err
        }
        return x509.ParseCertificate(certDERBytes)
}

三、编译kubeadm

耐心等待

 [root@ops kubernetes]# make WHAT=cmd/kubeadm GOFLAGS=-v

编译成功后的 kubeadm 会放到当前目录中的 ./_output/local/bin/linux/amd64/ 目录中

## 进入
 [root@ops kubernetes]# cd ./_output/local/bin/linux/amd64/

## 查看文件列表
 [root@ops amd64]# ls -l
....
-rwxr-xr-x 10:04 kubeadm ---->新编译好的二进制文件
....

四、使用新kubeadm方式

1.当部署新集群时,使用该kubeadm进行初始化

## 备份已有的 kubeadm 工具
[root@ops ~]# mv /usr/bin/kubeadm  /usr/bin/kubeadm_backup

## 使用自己编译的 kubeadm 替换现有的 kubeadm 工具
[root@ops ~]# cp ./_output/local/bin/linux/amd64/kubeadm  /usr/bin/kubeadm

## 修改文件的执行权限
[root@ops ~]# chmod +x /usr/bin/kubeadm

## 执行初始化命令、添加节点到集群中的命令等

当部署完成后,查看集群证书时间
在这里插入图片描述

2.替换现有集群kubeadm操作

当集群已存在且证书有效期是1年时,更新集群证书有效期

## 备份已有的 kubeadm 工具
[root@ops ~]# mv /usr/bin/kubeadm  /usr/bin/kubeadm_backup

## 使用自己编译的 kubeadm 替换现有的 kubeadm 工具
[root@ops ~]# cp ./_output/local/bin/linux/amd64/kubeadm  /usr/bin/kubeadm

## 修改文件的执行权限
[root@ops ~]# chmod +x /usr/bin/kubeadm

## 更新证书
[root@ops ~]# kubeadm alpha  certs renew all

## 更新节点kubectl配置文件
[root@ops ~]# cp /etc/kubernetes/admin.conf /root/.kube/config

## 备份apiserver、controller manager、schedule配置文件
[root@ops ~]# cp -r /etc/kubernetes/manifests/ /etc/kubernetes/manifests-bak

## 重启apiserver、controller manager、schedule
[root@ops ~]# cd /etc/kubernetes/manifests
[root@ops manifests]# mv kube-* ../

## 查看apiserver、controller manager、schedule pod,等待当前节点相关pod删除后,还原配置文件
[root@ops manifests]# cp ../kube*.yaml .

## 检查当前节点apiserver、controller manager、schedule无异常后,操作下一节点。
[root@ops ~]# kubectl get pods -n kube-system -o wide |grep kube-apiserver
[root@ops ~]# kubectl get pods -n kube-system -o wide |grep kube-controller-manager
[root@ops ~]# kubectl get pods -n kube-system -o wide |grep kube-scheduler

## 再次查看证书状态
[root@ops ~]# kubeadm  certs check-expiration

在这里插入图片描述
至此,就是编译好kubeadm后的两种使用方式



http://www.niftyadmin.cn/n/5823331.html

相关文章

面试加分项:Android Framework AMS 全面概述和知识要点

第一章:AMS 的架构与组件 1.1 AMS 整体架构 在 Android 系统的庞大体系中,AMS(Activity Manager Service)就如同一个中枢神经系统,是整个系统的核心服务之一,对应用的性能和用户体验有着直接且关键的影响 。它的整体架构由 Client 端和 Service 端两大部分组成,这两端相…

《零基础Go语言算法实战》【题目 2-8】defer 和 return 语句

《零基础Go语言算法实战》 【题目 2-8】defer 和 return 语句 下面代码的输出是什么?请说明原因。 package main import "fmt" func main() { fmt.Println("result:", def()) } func def() int { var i int defer func() { i fmt.Printl…

探秘 JMeter (Interleave Controller)交错控制器:解锁性能测试的隐藏密码

嘿,小伙伴们!今天咱们要把 JMeter 里超厉害的 Interleave Controller(交错控制器)研究个透,让你从新手直接进阶成高手,轻松拿捏各种性能测试难题! 一、Interleave Controller 深度剖析 所属家族…

改进萤火虫算法之八:量子萤火虫算法(Quantum-behaved Firfly Algorithm,QFA)

量子萤火虫算法(Quantum-behaved Firfly Algorithm,QFA)是对萤火虫算法的一种改进,旨在提升萤火虫个体的搜索能力。以下是对量子萤火虫算法的详细介绍: 一、萤火虫算法基础 萤火虫算法(Firefly Algorithm,FA)是一种基于群体智能的优化算法,由剑桥大学的Xin-She Yang在…

【数据分析】一、初探 Numpy

目录 前言1. 一维 array 的生成2. 一维 array 的基本操作2.1. 查看属性2.2. 花式索引2.3. 条件筛查2.4. 数据统计 3. n 维 array 的生成4. n 维 array 的基本操作4.1. 查看属性4.2. 查询和切片4.3. 花式索引4.4. 矩阵 前言 Numpy是Python的常用开源数值计算扩展库,用…

SpringCloud微服务:基于Nacos组件,整合Dubbo框架

dubbo和fegin的差异 一、Feign与Dubbo概述 Feign是一个声明式的Web服务客户端,使得编写HTTP客户端变得更简单。通过简单的注解,Feign将自动生成HTTP请求,使得服务调用更加便捷。而Dubbo是一个高性能、轻量级的Java RPC框架,提供了…

【AI游戏】基于OpenAI打造自动生成剧情的 Python 游戏

引言 你是否曾经梦想过成为一名游戏设计师,创造出引人入胜的冒险故事?今天,我将带你使用 OpenAI 的 GPT 模型和 Python 编写一个简单的自动生成剧情游戏。通过这个项目,你可以体验到人工智能在创意写作中的强大能力,并…

【算法】将单链表按值划分

问: 将单链表按某值划分成左边小、中间相等、右边大的形式 答: 笔试:初始化一个Node类型的数组,对数组进行partition,然后把数组中的节点元素串成链表 public static Node listPartition1(Node head, int pivot) {…