跳转到主要内容

k3s证书过期&ks8证书过期&rancher 轮换证书

  • 参考网址

    • https://mp.weixin.qq.com/s?__biz=MzkyNzM4Nzk1NQ==&mid=2247500723&idx=1&sn=64def8cd6ec7fd874440690f1f589a3a
    • http://kingsd.top/2020/07/01/k3s-cert-rotary/
    • https://www.cnblogs.com/databank/p/16334715.html

重要:本文提到要备份的地方,请老老实实的备份,否则集群损坏启动不了只能重装

【推荐】使用10年证书一键脚本

仅适用适用kubeadm安装的集群

相关脚本: https://github.com/yuyicai/update-kube-cert

# 查看证书过期情况
kubeadm certs check-expiration

# 赋予执行权限
chmod 777 update-kubeadm-cert.sh

# 一键更新所有证书
./update-kubeadm-cert.sh all

# 一键更新master证书(既排除etcd证书)
./update-kubeadm-cert.sh master

rancher证书过期

# 查看rancher证书是否过期状态
curl -vvv https://ip:port

# 删除rancher证书目录,或者移动备份
/data/vpclub/rancher-2.0/data/k3s/server/tls
# 两次重启rancher,第一次为重新生成证书,第二次为加载证书


# 查看rancher-agent的集群代理容器状态
kubectl get po -n cattle-system

# 查看ranche agent容器状态,具体根据rancher版本查看对应的容器
docker ps -a|grep cattle

# 查看cattle-agent日志以获得更多信息
docker logs -f <cattle-agent-container-name>

  • 集群不可用恢复

# 删除 agent,具体的名称要使用kubectl get ns
kubectl -n cattle-system delete daemonset.apps/cattle-node-agent deployment.apps/cattle-cluster-agent

# 更新集群,全局,系统设置,server-url;非必要步骤


# 设置环境变量
RANCHERURL="https://192.168.0.10:8000"

# 集群ID
CLUSTERID="c-8dlc7"

# 在当前登录用户菜单下创建新的toke,用户,api&&keys。把Bearer Token记录下来
# Token
TOKEN="token-8kdfz:f4kgn4ptrq92wxkmqlzjhf9wntbxc4jpnnwq6spnv6mlhm76259wl6"

# 安装jq
yum install -y epel-release
yum install -y  jq

# 验证证书
curl -s -H "Authorization: Bearer ${TOKEN}" "${RANCHERURL}/v3/clusterregistrationtokens?clusterId=${CLUSTERID}" | jq -r '.data[] | select(.name != "system") | .command'


# 此时返回新的导入连接
curl -s -k -H "Authorization: Bearer ${TOKEN}" "${RANCHERURL}/v3/clusterregistrationtokens?clusterId=${CLUSTERID}" | jq -r '.data[] | select(.name != "system") | .insecureCommand'


# 重新导入集群
curl --insecure -sfL https://192.168.0.10:8000/v3/import/sztcbkgpcffdvmrd8rn9qvd9flp595np5zcss6xljqk89jqkdx8rhf.yaml |k3s kubectl apply -f -

  • k3s证书过期

提示:k8s简化了安装过程,后续基础环境不在使用k3s而是已使用k8s

# 如果是k3s(k8s)提示证书过期,则先执行如下操作
# 如果集群证书没过期可以不用加 --insecure-skip-tls-verify=true 这个参数标识指不验证TLS

k3s kubectl  --insecure-skip-tls-verify=true  delete secret k3s-serving -n kube-system


# 删除k3s集群内的证书

kubectl delete secret k3s-serving -n kube-system



# 备份原文件

mkdir -p  tlsbak
cp /var/lib/rancher/k3s/server/tls/**  ./tlsbak -rf
rm /var/lib/rancher/k3s/server/tls/dynamic-cert.json

# 查看证书是否过期,或者直接从浏览器点击证书查看
openssl x509 -noout -dates -in server-ca.crt

手动续期k8s证书过期(很大几率导致集群无法启动,不推荐,有诸多排错过程)

# 备份配置文件

mkdir -p /data/vpclub/kubernetes-bak/kubernetes-20240620
cp /etc/kubernetes/** /data/vpclub/kubernetes-bak/kubernetes-20240620 -r

# 在主master执行,查看证书过期情况
kubeadm certs check-expiration

# 重新生成证书,如果你是单机,可以用这个命令
# 如果你是集群,不要用这个命令
# 如果你是集群,不要用这个命令
kubeadm certs renew all

# 如果你是集群,需要逐个更新证书,否则回导致ETCD集群不可用
kubeadm certs renew apiserver
kubeadm certs renew apiserver-etcd-client
kubeadm certs renew apiserver-kubelet-client
kubeadm certs renew etcd-healthcheck-client
kubeadm certs renew etcd-peer
kubeadm certs renew etcd-server
kubeadm certs renew front-proxy-client
kubeadm certs renew scheduler.conf
kubeadm certs renew admin.conf


# 在其他master另外的主机执行如上三步。

# 重启kubelet
systemctl restart kubelet
# 重启docker
systemctl restart docker

# 重新部署4个容器(删除POD即可)
# etcd 、 kube-apiserver 、 kube-scheduler 、	kube-controlle

网上有文章说是把主master的pki文件夹覆盖到其他机器,但是经过实践,有一定的概率导致etcd启动不了,etcd报tls错误。 这是因为etcd使用tls进行连接,每一个etcd实例都有单独的tls证书。如果因为复制覆盖了pki目录、而没有备份文件导致集群无法启动的情况下,此时需要重新生成新的证书

# 重新生成证书
kubeadm init phase certs all

# 将重新生成的pki目录中的etcd改名为etcd2
mv etcd/ etcd2/

# 复制主master证书pki目录的所有文件到目标主机
scp -r /etc/kubernetes/pki/** 172.18.41.4:/etc/kubernetes/pki/

# 将ectd2目录的 **peer.crt**  **server.crt** 覆盖到etcd目录
cp etcd2/*peer.crt ./etcd/
cp etcd2/*server.crt ./etcd/

# 使用 kubeadm certs renew all 重新生成证书
  • K3S其他注意事项

    • 更换机器后,主机名重复不能加入集群解决办法
# 在node主机

cat /etc/rancher/node/password

# 在 control panel (master)

cat /var/lib/rancher/k3s/server/cred/node-passwd

# 将两边的密码保持一致,或者把某行删除


# 可能需要修改k3s.services的token


# 查看集群加入token
cat /var/lib/rancher/k3s/server/node-token

# 替换noded加入token

sed -i  "s/<old-token>/<new-token>/g" /usr/lib/systemd/system/k3s.service

# 重新加载服务配置
systemctl daemon-reload

# 重启服务
systemctl restart k3s