k8s证书过期处理

证书一共分为

  • 根CA(ca.crt)

  • master各组件的证书(包括etcd、apiserver、front-proxy、controller-manager等各种)

  • kubelet证书

k8s证书有效期说明:

复制代码
1、原生版本有效期

master节点:
/etc/kubernetes/ssl/apiserver.crt                #1年有效期
/etc/kubernetes/ssl/front-proxy-ca.crt           #10年有效期
/etc/kubernetes/ssl/ca.crt                       #10年有效期
/etc/kubernetes/ssl/front-proxy-client.crt       #1年有效期
/etc/kubernetes/ssl/etcd/ca.pem                  #10年有效期
/etc/kubernetes/ssl/apiserver-kubelet-client.crt #1年有效期

node节点:
/var/lib/kubelet/pki/kubelet-client-current.pem  #1年有效期


2、DET K8S版本(注意采用邮件发的新包,20190821及之前版本可能存在node节点kubelet证书等问题)

master节点:
/etc/kubernetes/ssl/apiserver.crt                #10年有效期
/etc/kubernetes/ssl/front-proxy-ca.crt           #100年有效期
/etc/kubernetes/ssl/ca.crt                       #100年有效期
/etc/kubernetes/ssl/front-proxy-client.crt       #10年有效期
/etc/kubernetes/ssl/etcd/ca.pem                  #10年有效期
/etc/kubernetes/ssl/apiserver-kubelet-client.crt #10年有效期

node节点:
/var/lib/kubelet/pki/kubelet-client-current.pem  #10年有效期

3、证书有效期查看命令

master节点:
for i in $(find /etc/kubernetes -type f -name "*.crt");do  echo "crt: $i" &&  openssl x509 -in $i -noout -text|grep Not; done
for i in $(find /etc/kubernetes -type f -name "*.pem");do  echo "crt: $i" &&  openssl x509 -in $i -noout -text|grep Not; done

node节点:
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem   -noout -dates

其中,根CA和master各组件证书默认已经改成了100年,kubelet证书改成了10年且有自动轮换

在一些用老包部署的环境里,可能出现证书过期问题,需要按如下操作解决证书问题。

检查

全部证书过期时间检查命令

复制代码
master节点:
for i in $(find /etc/kubernetes -type f -name "*.crt");do  echo "crt: $i" &&  openssl x509 -in $i -noout -text|grep Not; done
for i in $(find /etc/kubernetes -type f -name "*.pem");do  echo "crt: $i" &&  openssl x509 -in $i -noout -text|grep Not; done
node节点:
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem   -noout -dates

场景1、集群整体证书已经到期

说明:证书更新会影响到K8s和docker服务,业务服务会出现一段时间不对外提供服务

0.替换所有节点的kubeadm二进制,默认是1年的二进制文件

注意,这里是k8s1.12版本的kubeadm,如果需要1.16或者1.18版本的kubeadm自行下载

复制代码
mv /usr/local/bin/kubeadm /usr/local/bin/kubeadm-bak #备份旧的kubeadm
cp kubeadm /usr/local/bin/kubeadm #将新的kubeadm二进制文件放到对应位置
chmod +x /usr/local/bin/kubeadm

1.在第一个master节点更换证书和配置

  • 备份/etc/kubernetes/ssl目录,生成新证书,然后把etcd证书拷贝到此目录

    cp -r /etc/kubernetes/ssl /etc/kubernetes/ssl-bak

    根据不同版本执行不同的证书更新命令

    如默认1.12版本使用如下命令

    kubeadm alpha phase certs all --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml

    如1.16版本执行

    kubeadm alpha certs renew all --config /etc/kubernetes/kubeadm-config.yaml
    cp -r /etc/ssl/etcd/ssl/ /etc/kubernetes/ssl/etcd/

  1. 然后把第一台master节点的证书拷贝到其他的master节点

  2. 在所有master节点操作如下

  • 备份旧.conf文件,重新生成.conf文件,并拷贝到/root/.kube/config

    复制代码
    cd /etc/kubernetes
    ls |grep conf$ | xargs -I{} mv /etc/kubernetes/{} {}.bak
    ## 根据不同版本执行不同的证书更新命令
    ## 如默认1.12版本使用如下命令
    kubeadm alpha phase kubeconfig all --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml
    
    
    ## 如1.16版本执行:
    kubeadm alpha kubeconfig user --client-name=admin
    kubeadm alpha kubeconfig user --org system:masters --client-name kubernetes-admin  > /etc/kubernetes/admin.conf
    kubeadm alpha kubeconfig user --client-name system:kube-controller-manager > /etc/kubernetes/controller-manager.conf
    kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$(hostname) > /etc/kubernetes/kubelet.conf
    kubeadm alpha kubeconfig user --client-name system:kube-scheduler > /etc/kubernetes/scheduler.conf
    
    cp /etc/kubernetes/admin.conf /root/.kube/config
    复制代码
    重启 systemctl restart kubelet &&systemctl restart docker

4.在第一台master节点操作重新生成token(如果集群中只有master节点,或者只有master与node节点混合的节点,则不需要操作第4点)

  • 将ca证书拷贝到node节点,并将node重新加入集群(注意这里的node节点是非master节点,不需要对既是master节点又是node节点进行操作)

    复制代码
    $ scp /etc/kubernetes/ssl/ca.crt root@[node节点]:/etc/kubernetes/ssl/
    $ kubectl delete nodes [worker-nodes]
    $ kubeadm token create --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml
  • 需要更新kubeadm cluster-info

复制代码
  $ kubeadm alpha phase bootstrap-token cluster-info --kubeconfig /etc/kubernetes/admin.conf
  [bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace
  1. 在node节点(非master节点,不需要对既是master节点又是node节点进行操作)

备份bootstrap-kubelet.conf和kubelet.conf

复制代码
cd /etc/kubernetes/
mv kubelet.conf kubelet.conf.bak
mv bootstrap-kubelet.conf bootstrap-kubelet.conf.bak

将新生成的token更新到/etc/kubernetes/kubeadm-client.v1alpha3.conf

复制代码
discoveryToken: 55ovb3.up3t22u5a0c9p1sy
tlsBootstrapToken: 55ovb3.up3t22u5a0c9p1sy
token: 55ovb3.up3t22u5a0c9p1sy

在node节点,重新加入到集群

复制代码
$ kubeadm join --config /etc/kubernetes/kubeadm-client.v1alpha3.conf --ignore-preflight-errors=all

以上所有操作在所有节点完成之后,在master节点确认

kubectl get nodes显示node Ready,然后再进行以下操作

6.在ansible controller节点上操作(需要使用最新的kubespray代码)最新地址:http://10.130.22.17:8000/kubespray/kubespray-code-20200508.tgz

修改hosts.ini和environment.yml(将之前的hosts.ini和environment.yml替换新代码库里的对应文件)-注意老的代码库里的enviroment文件修改为environment.yml文件

更新完成之后,需要更新k8s集群所有的secret,要不然pod会因为token失效连接不到证书

复制代码
tar -zxvf kubespray-code-20200508.tgz
cd kubespray/
ansible-playbook -i inventory/mycluster/hosts.ini recover.yml --become --become-user=root -e @environment.yml -e gpu_share_enabled=false --tags rotate_tokens

默认会把kubespray自带的组件进行更新,业务组件需要业务人员进行手动查看token是否过期,如果过期则进行kubectl delete secret xxx重建

场景2、只node节点kubelet证书到期或者即将到期,其他证书都没问题

加上客户端证书自动轮换的配置,默认情况下客户端的证书是1年的、如下操作之后证书为10年。

更新客户端的证书为证书轮换策略(若没有纯node节点则不需要进行以下操作)

k8s 1.8之后增加客户端证书自动轮换,在有效期70%-90%这个区间,也就是大概剩下37-110天(大致1-3个多月)的有效期之间,kubelet 会使用其初始证书连接到 Kubernetes API ,并发送证书签名的请求

复制代码
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem   -noout -dates  

2、验证所有节点kubelet有无开启证书自动轮换

在所有节点验证如下配置

复制代码
## 执行如下命令,看输出是否有:rotateCertificates: true
cat /var/lib/kubelet/config.yaml |grep rotateCertificates

如果有,则不需要添加如下配置直接进行第三步即可。

如果没有,需要编辑/etc/kubernetes/kubelet.env增加,

复制代码
--feature-gates=RotateKubeletClientCertificate=true \ 
--rotate-certificates=true \

3、选取一个master节点生成永久不失效token

首先生成一个新的token,记录这个token后面会用,生成之前需要配置token有效期为forever

  • 使用客户端证书轮换必须保证配置中token为有效的。

  • 图中1画圈的为添加部分最终效果如图:

    复制代码
    vim  /etc/kubernetes/kubeadm-config.v1alpha3.yaml
    ##  如果没有bootstrapTokens,则需要添加如下内容bootstrapTokens部分;如果有,则修改其中内容ttl: "0"
    apiVersion: kubeadm.k8s.io/v1alpha3
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      ttl: "0"
      usages:
      - signing
      - authentication
    
    ##  生成token
    kubeadm token create --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml
    ##  查看TTL失效为 forever 见图2
    kubeadm token list

    4、在所有node节点替换token

    复制代码
    vim /etc/kubernetes/bootstrap-kubelet.conf  
    ## 前面是旧token   /斜线后面是第一步生成的token替换一下  , 新token失效一定要是永久的要不然没有
    :$s/dpcrb8.xj5ukm9y904kr1nl/3rqf1x.3sdbxo8vein3br2o/g
    
    
    ## 如果不存在/etc/kubernetes/bootstrap-kubelet.conf该文件,则执行cp /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf,然后vim /etc/kubernetes/bootstrap-kubelet.conf修改下面contexts和users部分
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: xxx
        server: xxx
      name: cluster.local
    contexts:
    - context:
        cluster: cluster.local
        user: tls-bootstrap-token-user
      name: tls-bootstrap-token-user@cluster.local
    current-context: tls-bootstrap-token-user@cluster.local
    kind: Config
    preferences: {}
    users:
    - name: tls-bootstrap-token-user
      user:
        token: 3rqf1x.3sdbxo8vein3br2o

    重启kubelet

    复制代码

    systemctl daemon-reload

    systemctl restart kubelet

5、修改controller-manager自动轮换的证书签署时间

在所有master节点操作

编辑/etc/kubernetes/manifests/kube-controller-manager.yaml增加签署时间,默认为8760,这里把签署时间改为10年

复制代码
- --experimental-cluster-signing-duration=87600h0m0s

重启kubelet和controller-manager

复制代码
systemctl daemon-reload
systemctl restart kubelet


## 检查controller-manager有无重启,没有则手动delete或者docker操作下触发重启,操作如下:
kubectl get po -n kube-system|grep controller-manager
kubectl delete po {查询到的所有controller-manager pod name} -n kube-system

6、备份并让controller-manager重新生成kubelet证书

在所有node节点操作

复制代码
cd /var/lib/kubelet/pki && mkdir bak-kubelet-client
mv kubelet-client-* bak-kubelet-client/
systemctl restart kubelet
相关推荐
菜地里的小菜鸟2 天前
kubectl debug
k8s·kubectldebug
腾飞开源4 天前
01_K8s干货笔记之认识K8s
运维·笔记·云原生·容器·kubernetes·k8s·容器化部署
小匠石钧知6 天前
02_在多个RockyLinux10虚拟机上安装k8s集群
云原生·容器·kubernetes·k8s
ShirleyWang01212 天前
让headlamp控制台能访问
linux·服务器·python·k8s·k3s
spider_xcxc12 天前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
ShirleyWang01212 天前
Day02 K3s NGF(Nginx Gateway Fabric)单 Worker 环境网关更新与故障处置 SOP
linux·服务器·python·k8s·k3s
ShirleyWang01212 天前
DAY01 K3s 私有化部署排障复盘与 SOP
linux·服务器·k8s·k3s·企业部署
XUHUOJUN16 天前
AKS 不是安装在 Windows Server 上,而是运行在 Windows Server 之上的 Azure 平台能力
windows·架构·k8s·azure local·azure stack
Geek-Chow16 天前
Connecting kubectl to a Private EKS Cluster Over an Internal Domain
kubernetes·k8s·aws
spider_xcxc18 天前
Docker Compose 容器通信详解:同一个 Compose 文件才能互通吗?
docker·容器·k8s·容器化·容器网络