文章目录
- 前言
- 一、资源准备
- 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后的两种使用方式