K8S集群证书已过期且etcd和apiserver已不能正常使用下的恢复方案

在这种比较极端的情况下,要小心翼翼的规划和操作,才不会让集群彻底死翘翘。首先,几个ca根证书是10年期,应该还没有过期。我们可以基于这几个根证书,来重新生成一套可用的各组件认证证书。

前期,先制定以下方案步骤,能否实现,待验证。

一,制作证书的基本文件。

Ca-csr.json(因为根证书是OK的,所以这个文件,可是列在这里,不会用上)

{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "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",
        "size": 2048
    },
    "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",
        "size": 2048
    },
    "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",
        "size": 2048
    },
    "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",
        "size": 2048
    }
}
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",
        "size": 2048
    },
    "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",
        "size": 2048
    }
}
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",
        "size": 2048
    },
    "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",
        "size": 2048
    },
    "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",
    "size": 2048
  },
  "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",
    "size": 2048
  },
  "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-[email protected]     --cluster=kubernetes     --user=kubernetes-admin     --kubeconfig=${K8S_DIR}/admin.conf

kubectl config use-context kubernetes-[email protected]     --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,应该就可以重新启动好集群了。

原文地址:https://www.cnblogs.com/aguncn/p/10937636.html

时间: 2024-08-01 05:20:01

K8S集群证书已过期且etcd和apiserver已不能正常使用下的恢复方案的相关文章

基于k8s集群部署prometheus监控etcd

目录 基于k8s集群部署prometheus监控etcd 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署prometheus监控etcd 1.背景和环境概述 本文中涉及到的环境中.prometheus监控和grafana基本环境已部署好.etcd内置了metrics接口供收集数据,在etcd集群任意一台节点上可通过ip:2379/metrics检查是否能正常收集数据. curl -L http://localhost:237

使用kubeadm部署k8s集群02-配置etcd高可用

使用kubeadm部署k8s集群02-配置etcd高可用 2018/1/4 配置 etcd 高可用 新建一个 2 节点的 etcd cluster 查看 etcd 的状态 迁移原来 master 节点上的 etcd 数据到上面新建的 etcd cluster 中 切换 kube-apiserver 使用新的 etcd endpoint 地址 清理掉原来的单节点 etcd 服务 重建一个 etcd 服务,加入新集群 部署新的 etcd 节点 更新另外2个节点的 etcd.yaml 配置 新建一个

K8S集群安装

主要参考 https://github.com/opsnull/follow-me-install-kubernetes-cluster 01.系统初始化和全局变量 添加 k8s 和 docker 账户 在每台机器上添加 k8s 账户,可以无密码 sudo: $ sudo useradd -m k8s $ sudo visudo $ sudo grep '%wheel.*NOPASSWD: ALL' /etc/sudoers %wheel ALL=(ALL) NOPASSWD: ALL $ su

使用Kubeadm创建k8s集群之节点部署(三十一)

前言 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不过基于部署环境和k8s的复杂性,我们需要对k8s集群部署过程中的一些步骤都有所了解,尤其是“kubeadm init”命令. 目录 主节点部署  Kubeadm以及相关工具包的安装 批量拉取k8s相关镜像 使用“kubeadm init”启动k8s主节点 启动k8s主节点 kubectl认证 安装f

Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 master 服务器的组件有:kube-apiserver.kube-controller-manager.kube-scheduler 因此需要下载k8s master,下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGE

K8S集群tls证书管理

在前文介绍的k8s master高可用实践方案中,需要对kube-apiserver的证书进行更新,加入VIP和从节点的IP,然后重新下发证书.回顾K8S集群整个搭建过程中,最容易让人懵圈的也就是配置证书环节,因此本文对K8S集群所用到的证书进行梳理一下. 一.根证书 ca.pem 根证书公钥文件ca-key.pem 根证书私钥文件ca.csr 证书签名请求,用于交叉签名或重新签名ca-config.json 使用cfssl工具生成其他类型证书需要引用的配置文件ca.pem用于签发后续其他的证书

kubeadm部署高可用K8S集群(v1.14.0)

一. 集群规划 主机名 IP 角色 主要插件 VIP 172.16.1.10 实现master高可用和负载均衡 k8s-master01 172.16.1.11 master kube-apiserver.kube-controller.kube-scheduler.kubelet.kube-proxy.kube-flannel.etcd k8s-master02 172.16.1.12 master kube-apiserver.kube-controller.kube-scheduler.k

(二)搭建一个完成的Kubernetes/K8s集群v.1.16

单节点集群多节点集群 注意node通过连接loadbalancer 转发到mateter 的apiserver来进行运作的 集群规划: 角色 ip 组件 K8S-master1 192.168.0.101 kube-apiserver kube-controller-manager kube-scheduleretcd K8S-master2 192.168.0.102 kube-apiserver kube-controller-manager kube-scheduleretcd K8S-n

使用kubeadm部署k8s集群01-初始化

使用kubeadm部署k8s集群01-初始化 2018/1/3 节点配置 master x3 OS version: centos7 swapoff ### 阿里云默认:off hosts ### 每个节点上配置: [[email protected] ~]# cat /etc/hosts ### k8s master @envDev 10.10.9.67 tvm-00 10.10.9.68 tvm-01 10.10.9.69 tvm-02 Docker version: latest(17.0