【问题】
生产环境使用k8s-1.5版本并且使用kubeadm直接安装后,出现证书一年到期,整个集群无法使用的情况。
【解决方案】
生产新的证书替换就的证书
【解决方法与步骤】
1、从github上获取相应版本的k8s源码;
2、修改源码使生成证书的有效期为100年(自己定义);
3、Linux测试服务器上搭建go编译环境,go版本必须是1.9版本;
4、单独只编译kubeadm组件;
5、Linux服务器模拟部署过期环境集群,使用编译好的kubeadm init生成证书;
6、将新生产的证书替换到过期环境master节点下的/etc/kubenetes目录下;
7、将master节点/etc/kubenetes下的kubelet.conf文件拷贝到全部node节点/etc/kubenetes下
8,删除重新全部的sever account服务(default、flannel),重新生成kube-system下的pod
【详细步骤】
1、下载源码
https://codeload.github.com/kubernetes/kubernetes/tar.gz/v1.5.1
2、上传到到测试服务器上并解压
# tar -zxvf XXX.tar.gz -C /root
3、安装go环境
3.1 https://golang.org/dl/
下载最新安装包go1.9.2.Linux-amd64.tar.gz
3.2 解压
# tar -zxvf XX.tar.gz -C /usr/lib
3.3 配置环境变量
# echo “export GOROOT=/usr/lib/golang” >> /etc/profile
# echo “export PATH=
P
A
T
H
:
PATH:
PATH:GOROOT/bin” >> /etc/profile
# source /etc/profile
3.4 配置k8s编辑目录
# mkdir -p /usr/lib/golang/src/k8s.io
# cd /usr/lib/golang/src/
# ln -s /root/kubernetes k8s.io/
3.5 修改源码
# cd /usr/lib/golang/src/k8s.io/kubernetes/pkg/util/cert
# vim cert.go
修改函数列表
NewSelfSignedCACert
NewSignedCert
GenerateSelfSignedCertKey
分别将上面证书时间修改为100年
func NewSelfSignedCACert(cfg Config, key *rsa.PrivateKey) (*x509.Certificate, error) {
now := time.Now()
tmpl := x509.Certificate{
SerialNumber: new(big.Int).SetInt64(0),
Subject: pkix.Name{
CommonName: cfg.CommonName,
Organization: cfg.Organization,
},
NotBefore: now.UTC(),
NotAfter: now.Add(duration365d * 100).UTC(),
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)
}
4、编译kubeadm
# cd /usr/lib/golang/src/k8s.io/kubernetes/cmd/kubeadm
# go build
生成新的kubeadm二进制文件
将编译好的kubeadm文件拷贝到/usr/bin/目录下
# mv kubeadm /usr/bin
5、k8s证书替换
在Linux测试服务器上模拟生产环境搭建,将就的kubeadm二进制文件替换为新生成的二进制文件
模拟部署新环境
会在/etc/kubernetes/pki目录下生成新的证书
# cd /etc/kubernetes/pki
# openssl x509 -in apiserver.pem -noout -text
查看新生成证书的期限是否为100年
5.1 master节点
将新证书拷贝到生产环境master节点上/etc/kubernetes/目录下
重启kubelet、kube-apiserver、kube-controller-manager、kube-schedule、kube-proxy、kube-discovery等服务(或者重启服务器)
5.2 node节点
将node节点上的/etc/kubernetes目录下的kubelet.conf文件替换为master上新的文件,然后直接重启kubelet服务或者服务器
5.3 重新server account(全部名空间下的服务)
# kubectl get sa
# kubectl get sa -n kube-system
例如:
# kubectl delete sa default -n kube-system
# kubectl delete sa default
5.4 删除重新网络ds
# kubectl delete ds kube-flannel-ds -n kube-system --grace-period=0 --force
# kubectl apply -f XXX --namesapace=kube-system