Kubeadm证书过期时间调整

kubeadm 默认证书为一年,一年过期后,会导致api service不可用,使用过程中会出现:x509: certificate has expired or is not yet valid.

方案一 通过修改kubeadm 调整证书过期时间

修改代码,调整过期时间

克隆代码:git clone https://github.com/kubernetes/kubernetes.git, 切换到指定的tag或者版本修改vendor/k8s.io/client-go/util/cert/cert.go文件,git diff 对比如下:

diff --git a/staging/src/k8s.io/client-go/util/cert/cert.go b/staging/src/k8s.io/client-go/util/cert/cert.go
index fb7f5fa..e800962 100644
--- a/staging/src/k8s.io/client-go/util/cert/cert.go
+++ b/staging/src/k8s.io/client-go/util/cert/cert.go
@@ -104,7 +104,7 @@ func NewSignedCert(cfg Config, key *rsa.PrivateKey, caCert *x509.Certificate, ca
                IPAddresses:  cfg.AltNames.IPs,
                SerialNumber: serial,
                NotBefore:    caCert.NotBefore,
-               NotAfter:     time.Now().Add(duration365d).UTC(),
+               NotAfter:     time.Now().Add(duration365d * 10).UTC(),
                KeyUsage:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
                ExtKeyUsage:  cfg.Usages,
        }
@@ -149,7 +149,7 @@ func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS
                        CommonName: fmt.Sprintf("%[email protected]%d", host, time.Now().Unix()),
                },
                NotBefore: time.Now(),
-               NotAfter:  time.Now().Add(time.Hour * 24 * 365),
+               NotAfter:  time.Now().Add(time.Hour * 24 * 3650),

                KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
                BasicConstraintsValid: true,

编译代码

这里我们可以使用官方容器对代码进行编译。

k8s.gcr.io/kube-cross:v1.12.5-1,如果不能FQ的用户,可以拉取我个人下的镜像skymyyang/kube-cross:v1.12.5-1

docker pull skymyyang/kube-cross:v1.12.5-1

编译

docker run --rm -v 你修改后的代码目录:/go/src/k8s.io/kubernetes -it skymyyang/kube-cross:v1.12.5-1 bash

cd /go/src/k8s.io/kubernetes

# 编译kubeadm, 这里主要编译kubeadm 即可
make all WHAT=cmd/kubeadm GOFLAGS=-v

# 编译kubelet
# make all WHAT=cmd/kubelet GOFLAGS=-v

# 编译kubectl
# make all WHAT=cmd/kubectl GOFLAGS=-v

#编译完产物在 _output/bin/kubeadm 目录下
#将kubeadm 文件拷贝出来,替换系统中的kubeadm

替换证书

#用新的kubeadm 替换官方的kubeadm
chmod +x kubeadm && \cp -f kubeadm /usr/bin

#备份原有的证书
mv /etc/kubernetes/pki /etc/kubernetes/pki.old

#生成新的证书,kubeadm.yaml 指定你自己服务器上的
kubeadm alpha phase certs all --config  ~/kubeadm.yaml

#备份原有的conf文件
mv /etc/kubernetes/*conf /etc/kubernetes/*conf-old

#根据新证书重新生成新的配置文件
kubeadm alpha phase kubeconfig all --config ~/kubeadm.yaml

#替换老的config文件
\cp -f /etc/kubernetes/admin.conf ~/.kube/config

方案二 启用自动轮换kubelet 证书

kubelet证书分为server和client两种, k8s 1.9默认启用了client证书的自动轮换,但server证书自动轮换需要用户开启

增加 kubelet 参数

# 在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 增加如下参数
Environment="KUBELET_EXTRA_ARGS=--feature-gates=RotateKubeletServerCertificate=true"

增加 controller-manager 参数

# 在/etc/kubernetes/manifests/kube-controller-manager.yaml 添加如下参数
  - command:
    - kube-controller-manager
    - --experimental-cluster-signing-duration=87600h0m0s
    - --feature-gates=RotateKubeletServerCertificate=true
    - ....

创建 rbac 对象

创建rbac对象,允许节点轮换kubelet server证书:

cat > ca-update.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
rules:
- apiGroups:
  - certificates.k8s.io
  resources:
  - certificatesigningrequests/selfnodeserver
  verbs:
  - create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubeadm:node-autoapprove-certificate-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:nodes
EOF

kubectl create –f ca-update.yaml

如果证书已经过期,如何进行重新签发证书

针对kubeadm 1.13.x 及以上处理

准备kubeadm.conf 配置文件一份
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.14.1 #-->这里改成你集群对应的版本
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
#这里使用国内的镜像仓库,否则在重新签发的时候会报错:could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt"
重新签发命令
kubeadm alpha certs renew all --config=/root/kubeadm.conf

运行如上命令会重新生成以下证书
#-- /etc/kubernetes/pki/apiserver.key
#-- /etc/kubernetes/pki/apiserver.crt

#-- /etc/kubernetes/pki/apiserver-etcd-client.key
#-- /etc/kubernetes/pki/apiserver-etcd-client.crt

#-- /etc/kubernetes/pki/apiserver-kubelet-client.key
#-- /etc/kubernetes/pki/apiserver-kubelet-client.crt

#-- /etc/kubernetes/pki/front-proxy-client.key
#-- /etc/kubernetes/pki/front-proxy-client.crt

#-- /etc/kubernetes/pki/etcd/healthcheck-client.key
#-- /etc/kubernetes/pki/etcd/healthcheck-client.crt

#-- /etc/kubernetes/pki/etcd/peer.key
#-- /etc/kubernetes/pki/etcd/peer.crt

#-- /etc/kubernetes/pki/etcd/server.key
#-- /etc/kubernetes/pki/etcd/server.crt
完成后重启kube-apiserver,kube-controller,kube-scheduler,etcd这4个容器

针对kubeadm 1.13.0(不包含1.13.0) 以下处理

移动证书和配置【注意!必须移动,不然会使用现有的证书,不会重新生成】
cd /etc/kubernetes
mkdir ./pki_bak
mkdir ./pki_bak/etcd
mkdir ./conf_bak
mv pki/apiserver* ./pki_bak/
mv pki/front-proxy-client.* ./pki_bak/
mv pki/etcd/healthcheck-client.* ./pki_bak/etcd/
mv pki/etcd/peer.* ./pki_bak/etcd/
mv pki/etcd/server.* ./pki_bak/etcd/
mv ./admin.conf ./conf_bak/
mv ./kubelet.conf ./conf_bak/
mv ./controller-manager.conf ./conf_bak/
mv ./scheduler.conf ./conf_bak/
创建证书
kubeadm alpha phase certs all --apiserver-advertise-address=${MASTER_API_SERVER_IP} --apiserver-cert-extra-sans=主机内网ip,主机公网ip

运行如上命令会重新生成以下证书
#-- /etc/kubernetes/pki/apiserver.key
#-- /etc/kubernetes/pki/apiserver.crt

#-- /etc/kubernetes/pki/apiserver-etcd-client.key
#-- /etc/kubernetes/pki/apiserver-etcd-client.crt

#-- /etc/kubernetes/pki/apiserver-kubelet-client.key
#-- /etc/kubernetes/pki/apiserver-kubelet-client.crt

#-- /etc/kubernetes/pki/front-proxy-client.key
#-- /etc/kubernetes/pki/front-proxy-client.crt

#-- /etc/kubernetes/pki/etcd/healthcheck-client.key
#-- /etc/kubernetes/pki/etcd/healthcheck-client.crt

#-- /etc/kubernetes/pki/etcd/peer.key
#-- /etc/kubernetes/pki/etcd/peer.crt

#-- /etc/kubernetes/pki/etcd/server.key
#-- /etc/kubernetes/pki/etcd/server.crt

不移动证书会有如下提示
#[certificates] Using the existing apiserver certificate and key.
#[certificates] Using the existing apiserver-kubelet-client certificate and key.
#[certificates] Using the existing front-proxy-client certificate and key.
#[certificates] Using the existing etcd/server certificate and key.
#[certificates] Using the existing etcd/peer certificate and key.
#[certificates] Using the existing etcd/healthcheck-client certificate and key.
#[certificates] Using the existing apiserver-etcd-client certificate and key.
#[certificates] valid certificates and keys now exist in "/etc/kubernetes/pki"
#[certificates] Using the existing sa key.
生成新配置文件
kubeadm alpha phase kubeconfig all --apiserver-advertise-address=${MASTER_API_SERVER_IP}
将新生成的admin配置文件覆盖掉原本的admin文件
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
sudo chmod 777 $HOME/.kube/config
完成后重启kube-apiserver,kube-controller,kube-scheduler,etcd这4个容器
如果有多台master,则将第一台生成的相关证书拷贝到其余master即可。

kubeadm 1.14 证书调整教程

kubeadm部署的kubernets证书一直都是个诟病,默认都只有一年有效期,kubeadm 1.14.x安装后有部分证书还是一年有效期,但个别证书已修改为10年有效期,但对我们使用来说,一年有效期还是一个比较的坑,需要进行调整。

修改kubeadm 1.14.x源码,调整证书过期时间

kubeadm1.14.x 安装过后crt证书如下所示

/etc/kubernetes/pki/apiserver.crt
/etc/kubernetes/pki/front-proxy-ca.crt         #10年有效期
/etc/kubernetes/pki/ca.crt                     #10年有效期
/etc/kubernetes/pki/apiserver-etcd-client.crt
/etc/kubernetes/pki/front-proxy-client.crt     #10年有效期
/etc/kubernetes/pki/etcd/server.crt
/etc/kubernetes/pki/etcd/ca.crt                #10年有效期
/etc/kubernetes/pki/etcd/peer.crt              #10年有效期
/etc/kubernetes/pki/etcd/healthcheck-client.crt
/etc/kubernetes/pki/apiserver-kubelet-client.crt

如上所示,除了标注说明的证书为10年有效期,其余都是1年有效期,我们查看下原先调整证书有效期的源码,克隆kubernetes 源码,切换到1.14.1 tag 查看:
代码目录: staging/src/k8s.io/client-go/util/cert/cert.go

const duration365d = time.Hour * 24 * 365

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,
        },
        NotBefore:             now.UTC(),
        //这里已经调整为10年有效期
        NotAfter:              now.Add(duration365d * 10).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)
}

如上所示,通过NewSelfSignedCACert这个方法签发的证书都默认为10年有效期了,但这个只影响部分证书,但这样还没满足我们的需求,个别证书的有效期调整,在经过对源码的分析后,找到了如下的逻辑:

发现部分证书是通过NewSignedCert这个方法签发,而这个方法签发的证书默认只有一年有效期,查看代码逻辑:
代码: cmd/kubeadm/app/util/pkiutil/pki_helpers.go

const duration365d = time.Hour * 24 * 365

func NewSignedCert(cfg *certutil.Config, key crypto.Signer, caCert *x509.Certificate, caKey crypto.Signer) (*x509.Certificate, error) {
    serial, err := rand.Int(rand.Reader, new(big.Int).SetInt64(math.MaxInt64))
    if err != nil {
        return nil, err
    }
    if len(cfg.CommonName) == 0 {
        return nil, errors.New("must specify a CommonName")
    }
    if len(cfg.Usages) == 0 {
        return nil, errors.New("must specify at least one ExtKeyUsage")
    }

    certTmpl := x509.Certificate{
        Subject: pkix.Name{
            CommonName:   cfg.CommonName,
            Organization: cfg.Organization,
        },
        DNSNames:     cfg.AltNames.DNSNames,
        IPAddresses:  cfg.AltNames.IPs,
        SerialNumber: serial,
        NotBefore:    caCert.NotBefore,
        // 只有一年有效期
        NotAfter:     time.Now().Add(duration365d).UTC(),
        KeyUsage:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
        ExtKeyUsage:  cfg.Usages,
    }
    certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &certTmpl, caCert, key.Public(), caKey)
    if err != nil {
        return nil, err
    }
    return x509.ParseCertificate(certDERBytes)
}

至此,调整NewSignedCert这个方法,重新进行编译,将证书有效期调整为你想要的任何时间。

原文链接:

http://icyxp.github.io/blog/2019/05/k8s-kubeadm14-ca-upgrade.html

原文地址:https://www.cnblogs.com/skymyyang/p/11093686.html

时间: 2024-10-09 03:13:37

Kubeadm证书过期时间调整的相关文章

修改kubeadm证书过期时间

kubernetes集群三步安装 修改kubeadm证书过期时间 本文通过修改kubeadm源码让kubeadm默认的一年证书过期时间修改为99年 我已经编译好了一个放在了github上,有需要的可以直接下 代码编译 编译环境镜像我已经放到dockerhub上了:fanux/kubernetes-build:v1.0.0 首先clone k8s 代码: git clone https://github.com/kubernetes/kubernetes 挂载到镜像中编译 docker run -

k8s 证书过期时间调整

检查证书有限期 kubeadm 部署集群默认证书有效期为一年 cd /etc/kubernetes/pki openssl x509 -in apiserver.crt -text -noout Validity Not Before: Jun 12 04:41:18 2019 GMT Not After : Jun 12 04:41:18 2020 GMT go 环境部署 wget https://dl.google.com/go/go1.12.7.linux-amd64.tar.gz tar

kubeadm修改证书过期时间

因为我是安装用kubeadm自动安装的,目前最新版本1.63 但是限于证书过期时间问题,需要去做更改,特此记录! 一.安装go语言. 现在新版本的k8s重新编译都需要高版本的go语言了.我这边安装的是V1.13.5 先下载:rm -rf go1.135.linux-amd64.tar.gz tar -zxvf  go1.135.linux-amd64.tar.gz mv go /usr/local/ 添加环境变量: export PATH=$PATH:/usr/local/go/bin sour

zabbix企业应用之监控域名过期时间与ssl证书过期时间

如果各位维护过n多个域名,可能会对备案与续费有所了解,备案是十分麻烦,各种流程,而续费的话,虽然比较简单,但如果你没有提前续费,可能导致域名不可用,甚至被他人给恶意注册,为了解决这样的问他,我今天给各位分享一下,如何使用zabbix监控域名过期时间与ssl证书过期时间,默认的触发器是在域名或ssl证书要过期前60天通知. 下面是监控域名过期时间的效果图 下面是监控ssl证书过期时间效果图 如何实现: 一.客户端 1.修改zabbix_agentd.conf文件 在zabbix_agentd.co

ssl证书过期时间监控

前几天,因为网易邮箱有部分域名的ssl证书过期,导致很多苹果用户的手机遇到疯狂弹窗,提示无法验证服务器身份.在我看来,这肯定是运维的锅了. 即使ssl厂商有续费提示,但是有可能因为人为的原因或者沟通的原因导致部分域名会忘记更换.所以每个https的域名都有必要添加上证书过期的提醒.(网易邮箱这次好像就是因为更换证书出现了遗漏). 如果你正在使用prometheus的作为监控工具,那么做ssl证书过期的监控就很简单了.prometheus是使用blackbox_exporter来监控http的.而

003_监测域名证书过期时间

由于因为线上证书过期,出过比较大的事故,所以就有了如下的监测证书过期的脚本 一. #!/bin/sh ### SSL Certificate Expire Day Check Script ### if [ "$1" = '' ];then echo "Need URL." exit 1;fi TARGET_URL=$1 EXP_DAY=`openssl s_client -connect ${TARGET_URL}:443 < /dev/null 2>

zabbix-监控ssl证书过期时间

脚本: [[email protected] shell]# cat cert_check.sh  #!/bin/sh ### SSL Certificate Expire Day Check Script ### if [ "$1" = '' ];then     echo "Need URL."     exit 1;fi TARGET_URL=$1 EXP_DAY=`openssl s_client -connect ${TARGET_URL}:443 <

关于 ICTCLAS 2015 / NLPIR 出现的证书过期以及Cannot open Configure file 问题

今天使用的时候出现了证书过期,修改了过后出现的是Cannot open Configure file 之类的问题,但是如果项目里存在Data文件夹,这个错误是不应该存在的 搞了一个晚上,目前就找到了一个解决方案 就是调整本机的时间,这个问题是我在8月1号出现的,我调回了7月30,但是还是用不了,原来是一旦执行过后显示了证书过期Data文件就会进行相应的修改并且保存 所以解决方案就是下个新的NLPIR/ICTCLAS 2015 ,在运行程序之前把本机时间修改了 已经发邮件给张教授,不知道多久才能解

网站https安全证书过期怎么办?https安全证书过期什么原因?

一.网站https安全证书过期原因分析: 1.当前电脑系统时间错误,所有的http安全证书都有颁发日期和截止日期,电脑系统时间在证书有效时间区间之外有可能导致浏览器提示网站https安全证书已过期或还未生效. 2.网站的https安全证书确实已经过期,根据https安全证书签发国际标准,https安全证书颁发不能超过39个月. 3.站点引用其它部署了https安全证书的外链,如果这个外链的证书过期了也会提示相应的错误. 能检测出外链有证书错误的终端设备有:手机浏览器.PC端IE6 (IE6以上的