kubernets 证书过期的问题
.问题起源
kubeadm 是 kubernetes 提供的一个初始化集群的工具,使用起来非常方便。但是它创建的apiserver、controller-manager等证书默认只有一年的有效期,同时kubelet 证书也只有一年有效期,一年之后 kubernetes 将停止服务。
官方推荐一年之内至少用 kubeadm upgrade 更新一次 kubernetes 系统,更新时也会自动更新证书。不过,在产线环境或者无法连接外网的环境频繁更新 kubernetes 不太现实。
我们可以在过期之前或之后,使用kubeadm alpha phase里的certs和kubeconfig命令,同时配合kubelet证书自动轮换机制来解决这个问题。
.认识认书
使用kubeadm创建完Kubernetes集群后, 默认会在/etc/kubernetes/pki目录下存放集群中需要用到的证书文件, 整体结构如下图所示:

Kubernetes 集群根证书
/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/ca.key
由此根证书签发的证书有:
1,kube-apiserver 组件持有的服务端证书
/etc/kubernetes/pki/apiserver.crt
/etc/kubernetes/pki/apiserver.key
2,kubelet 组件持有的客户端证书
/etc/kubernetes/pki/apiserver-kubelet-client.crt
/etc/kubernetes/pki/apiserver-kubelet-client.key
kubelet 上一般不会明确指定服务端证书, 而是只指定 ca 根证书, 让 kubelet 根据本地主机信息自动生成服务端证书并保存到配置的cert-dir文件夹中。
汇聚层(aggregator)证书
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-ca.key
由此根证书签发的证书只有一组:
1,代理端使用的客户端证书, 用作代用户与 kube-apiserver 认证
/etc/kubernetes/pki/front-proxy-client.crt
/etc/kubernetes/pki/front-proxy-client.key
etcd 集群根证书
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
由此根证书签发机构签发的证书有:
1,etcd server 持有的服务端证书
/etc/kubernetes/pki/etcd/server.crt
/etc/kubernetes/pki/etcd/server.key
2,peer 集群中节点互相通信使用的客户端证书
/etc/kubernetes/pki/etcd/peer.crt
/etc/kubernetes/pki/etcd/peer.key
3,pod 中定义 Liveness 探针使用的客户端证书
/etc/kubernetes/pki/etcd/healthcheck-client.crt
/etc/kubernetes/pki/etcd/healthcheck-client.key
4,配置在 kube-apiserver 中用来与 etcd server 做双向认证的客户端证书
/etc/kubernetes/pki/apiserver-etcd-client.crt
/etc/kubernetes/pki/apiserver-etcd-client.key
Serveice Account秘钥
这组的密钥对儿仅提供给 kube-controller-manager 使用. kube-controller-manager 通过 sa.key 对 token 进行签名, master 节点通过公钥 sa.pub 进行签名的验证.
API Server的authenticating环节支持多种身份校验方式:client cert、bearer token、static password auth等,这些方式中有一种方式通过authenticating(Kubernetes API Server会逐个方式尝试),那么身份校验就会通过。一旦API Server发现client发起的request使用的是service account token的方式,API Server就会自动采用signed bearer token方式进行身份校验。而request就会使用携带的service account token参与验证。该token是API Server在创建service account时用API server启动参数:–service-account-key-file的值签署(sign)生成的。如果–service-account-key-file未传入任何值,那么将默认使用–tls-private-key-file的值,即API Server的私钥(server.key)。
通过authenticating后,API Server将根据Pod username所在的group:system:serviceaccounts和system:serviceaccounts:(NAMESPACE)的权限对其进行authority 和admission control两个环节的处理。在这两个环节中,cluster管理员可以对service account的权限进行细化设置。
/etc/kubernetes/pki/sa.key
/etc/kubernetes/pki/sa.pub
kubeadm 创建的集群, kube-proxy ,flannel,coreDNS是以 pod 形式运行的, 在 pod 中, 直接使用 service account 与 kube-apiserver 进行认证, 此时就不需要再单独为 kube-proxy 创建证书
.Kubeadm本地读取集群配置
正如默认的kubeadm 安装k8s集群时,会从外网拉取镜像。在kubeadm命令升级master证书时,它也会默认从网上读取一个stable.txt的文件。由于公司实际情况,这个问题得解决掉。
解决这个问题的办法,就是生成一个集群配置的yaml文件,然后,在运行命令时指定这个Yaml文件即可。
如何生居一个集群配置的yaml文件呢?命令如下:
kubeadm config view > cluster.yaml
其内容如下:
.重新生成master证书
一旦证书过期,使用kubectl时会出现如下提示:
Unable to connect to the server: x509: certificate has expired or is not yet valid
在此,我们使用kubeadm alpha phase certs系统命令,重新生成证书。

建议不要重新生成ca证书,因为更新了ca证书,集群节点就需要手工操作,才能让集群正常(会涉及重新join)。
操作之前,先将/etc/kubernetes/pki下的证书文件,mv到其它文件夹,作个临时备份,不要删除。
kubeadm alpha phase certs etcd-healthcheck-client --config cluster.yaml
kubeadm alpha phase certs etcd-peer --config cluster.yaml
kubeadm alpha phase certs etcd-server --config cluster.yaml
kubeadm alpha phase certs front-proxy-client--config cluster.yaml
kubeadm alpha phase certs apiserver-etcd-client --config cluster.yaml
kubeadm alpha phase certs apiserver-kubelet-client --config cluster.yaml
kubeadm alpha phase certs apiserver --config cluster.yaml
kubeadm alpha phase certs sa --config cluster.yaml
.重新生成kubeconfig配置文件
在生成这些新的证书文件之后,再需要kubeadm alpha phase config命令,重新生成新的kubeconfig文件。

操作之前,先将/etc/kubernetes/下的kubeconfig,mv到其它文件夹,作个临时备份,不要删除。
kubeadm alpha phase kubeconfig all --config cluster.yaml
所有的kubeconfig重新生成以后,替换到kubectl使用的config文件之后(默认位置为~.kube/config),即可正常操作kubectl命令了。
.Kubelet证书自动轮换
kubelet证书分为server和client两种, k8s 1.10默认启用了client证书的自动轮换,但server证书自动轮换需要用户开启。
.Service Account密钥更新
由于service account的密钥是以rsa密钥对形式生成,所以没有过期时间。
如无必要,千万不要生成重新生成sa密钥。因为sa密钥关联到一切系统pod内的进程访问api server时的认证。
如果更新了sa,则需要先重新生成这些pod加截的token,再删除这些pod之后,重新加载token文件。
经过测试,这些系统级pod包括但不限于kube-proxy,flannel,kubenetes-dashboard, kube-stat-metricst等所有用到sa认证的pod。
kubernets 证书过期的问题的更多相关文章
- Kubeadm证书过期时间调整
		kubeadm 默认证书为一年,一年过期后,会导致api service不可用,使用过程中会出现:x509: certificate has expired or is not yet valid. ... 
- 证书过期-->app审核提示90034证书错误
		1.证书过期问题,去钥匙串中删除过期证书,然后新下载一个证书,重新添加,注:一定要把所有过期证书全部删除,如果不显示则点击钥匙串-->显示过期证书 然后下载新证书:https://develop ... 
- (苹果AppleWWDRCA.cer证书过期)Failed to locate or generate matching signing assets
		从2月14号开始,上传AppStore会碰到:Failed to locate or generate matching signing assets 字数462 阅读13571 评论16 喜欢61 ... 
- ASP - MSXML2.ServerXMLHTTP & HTTPS & 证书过期 — msxml3.dll '80072f05'
		Error: msxml3.dll '80072f05' The date in the certificate is invalid or has expired Dim xmlhttp Set ... 
- CA证书过期
		CA证书问题请教!最近在客户这里做Exchange2010及RMS项目,对当前Ca证书颁发机构的环境做了下勘察和调研,发现有些地方出现警号显示过期,不知道会不会影响Exchange和Adrms的集成部 ... 
- Splunk < 6.3 版本 SSL 证书过期事宜
		最近Splunk发出邮件提醒客户SSL证书过期事宜. 问题看起来比较严重,因为所有的实例,包括 forwarder\peernode\indexer\master node 等等都受影响,而且Depl ... 
- 012_py之证书过期监测及域名使用的py列表的并集差集交集
		一.由于线上域名证书快要过期,需要进行监测,顾写了一个方法用于线上证书过期监测,如下: import ssl,socket,pprint def check_domain_sslexpired(dom ... 
- centos7内核升级及curl访问https证书过期处理
		centos7内核升级及curl访问https证书过期处理 先看下当前系统的linux内核版本 uname -r 3.10.0-229.el7.x86_64 升级步骤 1.rpm --import h ... 
- ssl证书过期问题
		问题:linux服务器ssl证书过期,申请新证书后,也更换了服务器的证书,但是网页一直提示证书过期 解决:经分析后,发现服务器架构为waf->slb->esc,域名并未直接解析到slb,解 ... 
随机推荐
- openresty开发系列11--openresty的api入门
			openresty开发系列11--openresty的api入门 1)ngx_lua模块的hello world编辑nginx下conf配置文件nginx.conf# vi nginx.conf在se ... 
- 【Dart学习】--Dart之数字(num)相关方法总结
			一,部分属性 用法一(figureA) int figureA = -93; 是否为负数 print(figureA.isNegative); figureA是否是有限的 print(figureA. ... 
- 算法习题---4-7RAID技术(UV509)
			一:题目 (一)基础知识补充(RAID和奇偶校验) 磁盘管理—磁盘阵列(RAID)实例详解(本题目常用RAID 5技术实现) 奇偶校验(同行数据中同位上的1的个数,偶校验时:1的个数为偶数则校验结果为 ... 
- 【Java】Junit快速入门
			Junit介绍 JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个. JUnit ... 
- 1264 - Out of range value for column
			现象:新建数据库,字段类型是tinyint,然后插入数据,数值为128,报标题错误 原因:如果在新建数据库的时候没有指定为unsigned,那么就是有符号的,所以tinyint的范围是-128~127 ... 
- 转  ORA-13541: system moving window baseline size (691200) greater than retention (432000)
			修改awr生成报告时间间隔和保存时间时报错,由默认的每小时生成,保存8天修改为每半个小时生成一次,保存5天: SQL> exec dbms_workload_repository.modify_ ... 
- 04点睛Spring MVC 4.1-拦截器
			转发地址:https://www.iteye.com/blog/wiselyman-2214292 4.1 拦截器 拦截器实现了对每一个请求处理之前和之后进行相关的处理,类似于Servlet的filt ... 
- java查询图片显示无图片显示项目默认图片
			/** * 读取图片 * @param request * @param record * @return */ @RequestMapping(params ="method=queryW ... 
- win10 linux Ubuntu 18.04更换国内源
			安装了win10的linux bash 版本为ubuntu 18.04 首先查询自己的linux版本信息 cat /etc/issue 然后对系统的镜像源文件进行备份,再修改镜像源文件/etc/a ... 
- dotnet core use RabbitMQ
			安装RabbitMQ 自从使用了Docker之后,发现Docker真的是比虚拟机好用啊, 因此我这里在Docker里面创建一个RabbitMQ容器. 这里注意获取镜像的时候要获取management版 ... 
