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

文章目录


前言

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


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

一、资源准备

1. 下载对应源码

shell 复制代码
[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.安装编译工具

shell 复制代码
[root@ops ~]# yum install -y gcc make rsync jq

3.安装并设置golang

shell 复制代码
[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

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

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

耐心等待

shell 复制代码
 [root@ops kubernetes]# make WHAT=cmd/kubeadm GOFLAGS=-v

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

shell 复制代码
## 进入
 [root@ops kubernetes]# cd ./_output/local/bin/linux/amd64/

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

四、使用新kubeadm方式

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

shell 复制代码
## 备份已有的 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年时,更新集群证书有效期

shell 复制代码
## 备份已有的 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后的两种使用方式


相关推荐
努力的小T16 分钟前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
东风微鸣2 小时前
TTRSS 迁移实战
docker·云原生·kubernetes·可观察性
Smile_Gently4 小时前
Docker
云原生·eureka
转身後 默落4 小时前
04.Docker 镜像命令
docker·容器·eureka
IT_张三4 小时前
Docker+Kubernetes_第一章_Docker入门
java·docker·kubernetes
Diligent_lvan4 小时前
聊聊istio服务网格
云原生·istio
企鹅侠客5 小时前
kube-proxy怎么修改ipvs规则?
云原生·kubernetes·kubelet
仇辉攻防5 小时前
【云安全】云原生- K8S 污点横移
web安全·网络安全·云原生·容器·kubernetes·k8s·安全威胁分析
人工干智能7 小时前
科普:“docker”与“docker compose”
运维·docker·容器
神马都会亿点点的毛毛张7 小时前
【Docker教程】万字长文详解Docker命令
java·运维·后端·docker·容器