K8S集群证书已过期且etcd和apiserver已不能正常使用下的恢复方案
在这种比较极端的情况下,要小心翼翼的规划和操作,才不会让集群彻底死翘翘。首先,几个ca根证书是10年期,应该还没有过期。我们可以基于这几个根证书,来重新生成一套可用的各组件认证证书。
前期,先制定以下方案步骤,能否实现,待验证。
一,制作证书的基本文件。
Ca-csr.json(因为根证书是OK的,所以这个文件,可是列在这里,不会用上)
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
},
"ca": {
"expiry": "438000h"
}
}
Ca-config.json(它用来从自签名根ca.crt和ca.key生成新的证书,可以共用)
{
"signing": {
"default": {
"expiry": "43800h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "43800h"
}
}
}
}
二,重新生成etcd系列证书((注意,这是依据/etc/kubernetes/pki/etcd/目录下的ca证书)
Etcd-server.json
{
"CN": "etcdServer",
"key": {
"algo": "rsa",
},
"names": [
{
"O": "etcd",
"OU": "etcd Security",
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai"
}
]
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -hostname=127.0.0.1,localhost,本机ip,小写主机名 \ -profile=kubernetes \ etcd-server.json|cfssljson -bare server
etcd-peer.json
{
"CN": "etcdPeer",
"key": {
"algo": "rsa",
},
"names": [
{
"O": "etcd",
"OU": "etcd Security",
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai"
}
]
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -hostname=127.0.0.1,localhost,本机ip,小写主机名 \ -profile=kubernetes \ etcd-peer.json|cfssljson -bare peer
etcd-client.json
{
"CN": "etcdClient",
"key": {
"algo": "rsa",
},
"names": [
{
"O": "etcd",
"OU": "etcd Security",
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai"
}
]
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -profile=kubernetes \ etcd-client.json |cfssljson -bare client
三,重新制作apiserver证书(注意,这是依据/etc/kubernetes/pki目录下的ca证书)
Apiserver.json
{
"CN": "kube-apiserver",
"key": {
"algo": "rsa",
}
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -hostname=127.0.0.1, kubernetes , kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster.local,本机ip,小写主机名 \ -profile=kubernetes \ apiserver.json |cfssljson -bare apiserver
apiserver-kubelet-client.json
{
"CN": "kube-apiserver-kubelet-client",
"key": {
"algo": "rsa",
},
"names": [
{
"O": "system:masters"
}
]
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -profile=kubernetes \ apiserver-kubelet-client.json |cfssljson -bare apiserver-kubelet-client
三,重新制作front-proxy证书(注意,这是依据/etc/kubernetes/pki目录下的front-proxy-ca证书,它必须和apiserver的ca不一样,牵扯到apiserver的认证顺序,切记)
Front-proxy-client.json
{
"CN": "front-proxy-client",
"key": {
"algo": "rsa",
}
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -profile=kubernetes \ front-proxy-client.json |cfssljson -bare front-proxy-client
四,制作scheduler,controller-manager,admin,kubelet,bootstrap证书,此证书只存在于主节点。此证书主要用来生成controller-manager.conf, scheduler.conf, admin.conf, kubelet.conf bootstrap-kubelet.conf。
如果/etc/kubernetes/pki目录下的sa.key,sa.pub存在,则无须更新,因为它没有过期概念。
kube-scheduler-csr.json
{
"CN": "system:kube-scheduler",
"key": {
"algo": "rsa",
},
"names": [
{
"O": "system:kube-scheduler",
}
]
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -hostname=127.0.0.1,localhost,本机ip,小写主机名 \ -profile=kubernetes \ kube-scheduler-csr.json|cfssljson -bare kube-scheduler
kube-controller-manager-csr.json
{
"CN": "system:kube-controller-manager",
"key": {
"algo": "rsa",
},
"names": [
{
"O": "system:kube-controller-manager",
}
]
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -hostname=127.0.0.1,localhost,本机ip,小写主机名 \ -profile=kubernetes \ kube-controller-manager-csr.json |cfssljson -bare kube-controller-manager
admin-csr.json
{
"CN": "admin",
"key": {
"algo": "rsa",
},
"names": [
{
"O": "system:masters",
}
]
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -profile=kubernetes \ admin-csr.json |cfssljson -bare kube- admin
kubelet-csr.json(这个方法,只适合master上的kubelet运行,不用bootstrap的情况)
{
"CN": "system:node: 小写主机名",
"key": {
"algo": "rsa",
},
"names": [
{
"O": "system:nodes",
}
]
}
cfssl gencert \ -ca=ca.crt \ -ca-key=ca.key \ -config=ca-config.json \ -hostname=127.0.0.1,localhost,本机ip,小写主机名 \ -profile=kubernetes \ kubelet-csr.json |cfssljson -bare kubelet
如果还需要bootstrap,可以参考下面的url:
https://k2r2bai.com/2018/07/17/kubernetes/deploy/manual-install/
https://www.jianshu.com/p/6650954fa973?tdsourcetag=s_pctim_aiomsg
五,以上文件作好之后,需要根据现在的k8s命令规则改名,还要根据不同的文件,存放于不同的目录。
六,这时,k8s master应该可以启动了。接下来,制作kubeconfig文件,参考url
https://www.cnblogs.com/netsa/p/8134000.html(配置bootstrap及kubelet认证)
https://www.cnblogs.com/charlieroro/p/8489515.html(配置.kube/config文件)
# 设置集群参数
kubectl config set-cluster
# 设置客户端认证参数
kubectl config set-credentials
# 设置上下文参数
kubectl config set-context
# 设置默认上下文
kubectl config use-context
kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/cert/ca.pem \ --embed-certs=true \ --server=https://ip:port \ --kubeconfig=kube-controller-manager.kubeconfig kubectl config set-credentials system:kube-controller-manager \ --client-certificate=kube-controller-manager.pem \ --client-key=kube-controller-manager-key.pem \ --embed-certs=true \ --kubeconfig=kube-controller-manager.kubeconfig kubectl config set-context system:kube-controller-manager \ --cluster=kubernetes \ --user=system:kube-controller-manager \ --kubeconfig=kube-controller-manager.kubeconfig kubectl config use-context system:kube-controller-manager --kubeconfig=kube-controller-manager.kubeconfig
kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/cert/ca.pem \ --embed-certs=true \ --server=https://ip:port \ --kubeconfig=kube-scheduler.kubeconfig kubectl config set-credentials system:kube-scheduler \ --client-certificate=kube-scheduler.pem \ --client-key=kube-scheduler-key.pem \ --embed-certs=true \ --kubeconfig=kube-scheduler.kubeconfig kubectl config set-context system:kube-scheduler \ --cluster=kubernetes \ --user=system:kube-scheduler \ --kubeconfig=kube-scheduler.kubeconfig kubectl config use-context system:kube-scheduler --kubeconfig=kube-scheduler.kubeconfig
kubectl config set-cluster kubernetes \
--certificate-authority=${PKI_DIR}/ca.pem \
--embed-certs=true \
--server=https://ip:port \
--kubeconfig=${K8S_DIR}/admin.conf
kubectl config set-credentials kubernetes-admin \
--client-certificate=${PKI_DIR}/admin.pem \
--client-key=${PKI_DIR}/admin-key.pem \
--embed-certs=true \
--kubeconfig=${K8S_DIR}/admin.conf
kubectl config set-context kubernetes-admin@kubernetes \
--cluster=kubernetes \
--user=kubernetes-admin \
--kubeconfig=${K8S_DIR}/admin.conf
kubectl config use-context kubernetes-admin@kubernetes \
--kubeconfig=${K8S_DIR}/admin.conf
kubectl config set-cluster kubernetes \
--certificate-authority=${PKI_DIR}/ca.pem \
--embed-certs=true \
--server=https://ip:port \
--kubeconfig=${K8S_DIR}/kubelet.conf && \
kubectl config set-credentials system:node:小写主机名 \
--client-certificate=${PKI_DIR}/kubelet.pem \
--client-key=${PKI_DIR}/kubelet-key.pem \
--embed-certs=true \
--kubeconfig=${K8S_DIR}/kubelet.conf && \
kubectl config set-context system:node:小写主机名@kubernetes \
--cluster=kubernetes \
--user=system:node:小写主机名 \
--kubeconfig=${K8S_DIR}/kubelet.conf && \
kubectl config use-context system:node:小写主机名@kubernetes \
--kubeconfig=${K8S_DIR}/kubelet.conf
七,当制作好这些文件之后,按k8s安装的位置,分发文件,重启kubelet,应该就可以重新启动好集群了。
K8S集群证书已过期且etcd和apiserver已不能正常使用下的恢复方案的更多相关文章
- k8s集群证书过期(kubeadm 1.10.2 )
1.k8s 集群架构描述 kubeadm v1.10.2创建k8s集群. master节点高可用,三节点(10.18.60.3.10.18.60.4.10.18.60.5). LVS实现master三 ...
- k8s集群搭建之二:etcd集群的搭建
一 介绍 Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现. 简单:支持 curl 方式的用户 API (HTTP+JSON) 安全:可选 SSL 客户端证书认证 快速 ...
- K8S 使用Kubeadm搭建高可用Kubernetes(K8S)集群 - 证书有效期100年
1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...
- K8s集群部署(一)------ETCD集群部署
环境说明 三台主机: k8s-master 10.0.3.225 k8s-node1 10.0.3.226 k8s-node2 10.0.3.227 配置主机名解析 [root@k8s- ...
- 部署k8s集群之环境搭建和etcd单节点安装
环境搭建以及etcd 单节点安装过程 安装之前的环境搭建 在进行k8s安装之前先把虚拟机准备好,这里准备的是三台虚拟机 主机名 ip地址 角色 master 172.16.163.131 master ...
- 关于k8s集群证书1年过期后,使用kubadm重新生成证书及kubeconfig配置文件的变化
这个证书很重要,不用说. 但手工生成证书,确实工作量大且容易出错. 推荐的方式,是保留/etc/kubernetes/pki目录下的ca.crt,ca.key,sa.crt,sa.key. 这四个文件 ...
- 万级K8s集群背后etcd稳定性及性能优化实践
背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...
- 万级K8s集群背后 etcd 稳定性及性能优化实践
1背景与挑战随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...
- k8s 集群中的etcd故障解决
一次在k8s集群中创建实例发现etcd集群状态出现连接失败状况,导致创建实例失败.于是排查了一下原因. 问题来源 下面是etcd集群健康状态: [root@docker01 ~]# cd /opt/k ...
随机推荐
- 【Python学习之九】模块
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.模块的使用和安装模块和C语言中的头文件以及Ja ...
- consul集群搭建以及ACL配置
由于时间匆忙,要是有什么地方没有写对的,请大佬指正,谢谢.文章有点水,大佬勿喷这篇博客不回去深度的讲解consul中的一些知识,主要分享的我在使用的时候的一些操作和遇见的问题以及解决办法.当然有些东西 ...
- 面试之leetcode链表
1 数组 (1)数组的插入 如果是插入到最后,那么不用移动O(1),如果插入位置在中间为O(n).所以最好O(1),最坏O(N),平均O(N),为了插入能达到O(1),插入O(1).引入了链表 2 链 ...
- (CSDN迁移) 输入一个链表,从尾到头打印链表每个节点的值
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 思路1. 翻转链表,使用java自带的翻转函数或者从头到尾依次改变链表的节点指针 /** * public class ListNode { * ...
- POJ 1458 Common Subsequence(最长公共子序列)
题目链接Time Limit: 1000MS Memory Limit: 10000K Total Submissions: Accepted: Description A subsequence o ...
- java常见集合
集合与数组区别 1-从长度来讲: 数组:需要固定长度. 集合:长度可以改变,可以根据保存的数据进行扩容. 2-从存储内容上: 数组:可以存储基本类型数据,还可以存储引用类型的数据(比如:String ...
- mysql 按照两个字段之和进行排序
SELECT *,zan_num+fake_zan_num show_zan FROM `tf_news` order by show_zan desc TP实现 $news = M('news'); ...
- Markdown Html高级功能 测试用例
插入音频 后台样式代码: #cnblogs_post_body .music { height: 140px; /*padding-bottom: 14.39%;*/ /* 16:9 */ posit ...
- HDFS面试题
hadoop节点动态上线下线怎么操作? )节点上线操作: 当要新上线数据节点的时候,需要把数据节点的名字追加在 dfs.hosts 文件中 ()关闭新增节点的防火墙 ()在 NameNode 节点的 ...
- Linux 中的 ~/. 表示的意思
在Linux中, ~ 表示用户的目录, 如用户名是Gavin, 那么~/表示 /home/Gavin 所以~/. 表示 用户目录下的隐藏文件. 扩展: 若以用户身份登录 ~ 表示 /home 目录 ...