当前位置:   article > 正文

Kubernetes 集群疑难杂症排障:服务器 IP 变更后集群故障了,我该如何修复?

无法访问/etc/ssl/etcd/ssl

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

f799ab090ba3b95b8ce5a23ca5e06998.png

记录一次因为 IP 变更导致集群故障的修复过程。有两个集群,一个是单节点(allinone),另一个是四节点(3 master 1 node)的集群。

1. 更新 Etcd 证书

  • 【在每个 Etcd 节点】备份 Etcd 证书

cp -R /etc/ssl/etcd/ssl /etc/ssl/etcd/ssl-bak
  • 查看 Etcd 证书中的域

  1. openssl x509 -in /etc/ssl/etcd/ssl/node-node1.pem -noout -text|grep DNS
  2.                 DNS:etcd, DNS:etcd.kube-system, DNS:etcd.kube-system.svc, DNS:etcd.kube-system.svc.cluster.local, DNS:localhost, DNS:node1, IP Address:127.0.0.1, IP Address:0:0:0:0:0:0:0:1, IP Address:x.x.x.1

需要记录下全部的 DNS、IP 值,用于生成新的证书。

  • 【在每个 Etcd 节点】清理旧的 Etcd 证书

rm -f /etc/ssl/etcd/ssl/*
  • 【在一个 Etcd 节点】生成 Etcd 证书配置

  1. vim /etc/ssl/etcd/ssl/openssl.conf
  2. [req]
  3. req_extensions = v3_req
  4. distinguished_name = req_distinguished_name
  5. [req_distinguished_name]
  6. [ v3_req ]
  7. basicConstraints = CA:FALSE
  8. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  9. subjectAltName = @alt_names
  10. [ ssl_client ]
  11. extendedKeyUsage = clientAuth, serverAuth
  12. basicConstraints = CA:FALSE
  13. subjectKeyIdentifier=hash
  14. authorityKeyIdentifier=keyid,issuer
  15. subjectAltName = @alt_names
  16. [ v3_ca ]
  17. basicConstraints = CA:TRUE
  18. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  19. subjectAltName = @alt_names
  20. authorityKeyIdentifier=keyid:always,issuer
  21. [alt_names]
  22. DNS.1 = localhost
  23. DNS.2 = etcd.kube-system.svc.cluster.local
  24. DNS.3 = etcd.kube-system.svc
  25. DNS.4 = etcd.kube-system
  26. DNS.5 = etcd
  27. DNS.6 = xxx
  28. IP.1 = 127.0.0.1
  29. IP.2 = x.x.x.x

需要包含所有部署 Etcd 节点的主机名和 IP 地址。

  • 【在一个 Etcd 节点】生成 Etcd 的 CA 证书

  1. cd /etc/ssl/etcd/ssl
  2. openssl genrsa -out ca-key.pem 2048
  3. openssl req -x509 -new -nodes -key ca-key.pem -days 3650 -out ca.pem -subj "/CN=etcd-ca"
  • 【在一个 Etcd 节点】给每个节点生成 Etcd 的 Admin 证书

通过 export host=node1 设置不同环境变量,给每一个节点生成证书。这里的 node1 是主机名,保持与之前一致,避免因改名找不到证书。

  1. openssl genrsa -out admin-${host}-key.pem 2048
  2. openssl req -new -key admin-${host}-key.pem -out admin-${host}.csr -subj "/CN=etcd-admin-${host}"
  3. openssl x509 -req -in admin-${host}.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out admin-${host}.pem -days 3650 -extensions ssl_client  -extfile openssl.conf
  • 【在一个 Etcd 节点】给每个节点生成 Etcd 的 Member 证书

通过 export host=node1 切换节点,给每一个节点生成证书。

  1. openssl genrsa -out member-${host}-key.pem 2048
  2. openssl req -new -key member-${host}-key.pem -out member-${host}.csr -subj "/CN=etcd-member-${host}" -config openssl.conf
  3. openssl x509 -req -in member-${host}.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out member-${host}.pem -days 3650 -extensions ssl_client -extfile openssl.conf
  • 【在一个 Etcd 节点】给每个节点生成 Etcd 的 Node 证书

通过 export host=node1 切换节点,给每一个节点生成证书。

  1. openssl genrsa -out node-${host}-key.pem 2048
  2. openssl req -new -key node-${host}-key.pem -out node-${host}.csr -subj "/CN=etcd-node-${host}"
  3. openssl x509 -req -in node-${host}.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out node-${host}.pem -days 3650 -extensions ssl_client  -extfile openssl.conf
  • 【在一个 Etcd 节点】分发生成的证书

需要将 /etc/ssl/etcd/ssl/ 下的证书,分发到各个 Etcd 节点上。

  • 【在一个 Etcd 节点】查看 etcd 配置

这里 Etcd 是以二进制启动的,在 systemd 中可以找到 etcd 配置文件的存放位置。

  1. cat /etc/systemd/system/etcd.service
  2. ...
  3. EnvironmentFile=/etc/etcd.env
  • 【每个 Etcd 节点】替换 IP

由于有多个 Etcd 节点,因此需要替换多组 IP,这里以三节点为例。

  1. export oldip1=x.x.x.1 
  2. export newip1=x.x.10.1 
  3. export oldip2=x.x.x.2
  4. export newip2=x.x.10.2 
  5. export oldip3=x.x.x.3 
  6. export newip3=x.x.10.3
  1. sed -i "s/$oldip1/$newip1/" /etc/etcd.env
  2. sed -i "s/$oldip2/$newip2/" /etc/etcd.env
  3. sed -i "s/$oldip3/$newip3/" /etc/etcd.env

/etc/hosts 也需要替换 IP,因为有时配置文件中使用的是主机名。

  1. sed -i "s/$oldip1/$newip1/" /etc/hosts
  2. sed -i "s/$oldip2/$newip2/" /etc/hosts
  3. sed -i "s/$oldip3/$newip3/" /etc/hosts

如果有定时备份任务,也需要替换下相关 IP。

  1. sed -i "s/$oldip1/$newip1/" /usr/local/bin/kube-scripts/etcd-backup.sh
  2. sed -i "s/$oldip2/$newip2/" /usr/local/bin/kube-scripts/etcd-backup.sh
  3. sed -i "s/$oldip3/$newip3/" /usr/local/bin/kube-scripts/etcd-backup.sh
  • 【每个 Etcd 节点】从备份中恢复 Etcd 数据

如果是单节点的 Etcd 可以跳过此步骤。由于节点 IP 发生变化,Etcd 集群已经无法运行。多节点 Etcd 需要使用备份数据才能够恢复,这是因为 Etcd 的节点信息被存在磁盘数据中,仅修改配置文件并没有用。

将 Etcd 备份文件 snapshot.db 分发到每个 Etcd 节点上。

在每个节点上执行如下命令:

rm -rf /var/lib/etcd
  1. etcdctl snapshot restore snapshot.db --name etcd-node1 \
  2.         --initial-cluster "etcd-node1=https://x.x.10.1:2380,etcd-node2=https://x.x.10.2:2380,etcd-node3=https://x.x.10.3:2380" \
  3.         --initial-cluster-token k8s_etcd \
  4.         --initial-advertise-peer-urls https://x.x.10.1:2380 \
  5.         --data-dir=/var/lib/etcd

需要注意,每个节点上的 etcd-node1 名字, --initial-advertise-peer-urls 参数会有差异。

  • 【每个 Etcd 节点】重启 etcd

systemctl restart etcd
  • 【每个 Etcd 节点】查看 etcd 状态

systemctl status etcd

2. 更新 K8s 证书

  • 备份证书

cp -R /etc/kubernetes/ /etc/kubernetes-bak
  • 【每个 Kubernetes 节点】替换相关文件中的 IP 地址

  1. # master 节点
  2. export oldip1=x.x.x.1 
  3. export newip1=x.x.10.1 
  4. export oldip2=x.x.x.2
  5. export newip2=x.x.10.2 
  6. export oldip3=x.x.x.3 
  7. export newip3=x.x.10.3 
  8. # node 节点
  9. export oldip4=x.x.x.4
  10. export newip4=x.x.10.4
  1. find /etc/kubernetes -type f | xargs sed -i "s/$oldip1/$newip1/"
  2. find /etc/kubernetes -type f | xargs sed -i "s/$oldip2/$newip2/"
  3. find /etc/kubernetes -type f | xargs sed -i "s/$oldip3/$newip3/"
  4. find /etc/kubernetes -type f | xargs sed -i "s/$oldip4/$newip4/"
  1. sed -i "s/$oldip1/$newip1/" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  2. sed -i "s/$oldip2/$newip2/" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  3. sed -i "s/$oldip3/$newip3/" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  4. sed -i "s/$oldip4/$newip4/" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  1. sed -i "s/$oldip1/$newip1/" /etc/kubernetes/kubeadm-config.yaml
  2. sed -i "s/$oldip2/$newip2/" /etc/kubernetes/kubeadm-config.yaml
  3. sed -i "s/$oldip3/$newip3/" /etc/kubernetes/kubeadm-config.yaml
  4. sed -i "s/$oldip4/$newip4/" /etc/kubernetes/kubeadm-config.yaml
  1. sed -i "s/$oldip1/$newip1/" /etc/hosts
  2. sed -i "s/$oldip2/$newip2/" /etc/hosts
  3. sed -i "s/$oldip3/$newip3/" /etc/hosts
  4. sed -i "s/$oldip4/$newip4/" /etc/hosts
  • 【在一个 master 节点】生成证书

rm -f /etc/kubernetes/pki/apiserver*
kubeadm init phase certs all --config /etc/kubernetes/kubeadm-config.yaml
  • 【每个 Kubernetes 节点】将生成的证书分发到节点上

node 节点不需要 key,只需要 crt。

3. 更新集群组件的 Conf 文件

  • 【在一个 master 节点】生成新的配置文件

  1. cd /etc/kubernetes
  2. rm -f admin.conf kubelet.conf controller-manager.conf scheduler.conf
kubeadm init phase kubeconfig all --config /etc/kubernetes/kubeadm-config.yaml
  • 【每个 Kubernetes 节点】将新的配置文件分发到每个节点

每个节点都需要 /etc/kubernetes/kubelet.conf,每个 master 节点都需要 /etc/kubernetes/controller-manager.conf/etc/kubernetes/scheduler.conf

  • 【在需要使用 kubectl 的节点】 配置用户访问凭证

cp /etc/kubernetes/admin.conf $HOME/.kube/config
  • 【每个 Kubernetes 节点】重启 kubelet

  1. systemctl daemon-reload
  2. systemctl restart kubelet
  • 【每个 Kubernetes 节点】查看 kubelet 状态

systemctl status kubelet

4. 修复 ConfigMap

  • 使用新 IP 替换新 IP

kubectl -n kube-system edit cm kube-proxy

kube-proxy 会影响节点通信。如果使用的 LB 或者域名作为 Apiserver 入口,也可以不进行替换。至于 kubeadm-config 在上面步骤中,已经自动替换,因此也不需要额外处理。

5. 总结

强烈建议,不要修改集群主机的 IP 地址。如果是预期内的主机 IP 变更,可以提前通过备份-恢复的方式重建集群。

如果是非预期的主机 IP 变更,建议按照上述顺序进行修复:

  1. Etcd

  2. K8s 证书

  3. K8s Master 节点、Node 节点核心组件

  4. 集群 ConfigMap 配置

上述内容虽然记录了修复过程。但多 master 节点修复时,现场很复杂。容器在不断重启,期间还一直报错端口冲突,为此我还重启了一次机器。修复过程记录可能有不完善的地方,但是只需要按照顺序,一个组件一个组件修复应该问题不大。

本文转载自:「陈少文」,原文:https://url.hi-linux.com/Qz1fS,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

35513a420d65ac60743273a44b296684.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

7c6c16984a4cee1ed87c51ee8bcc9624.png

你可能还喜欢

点击下方图片即可阅读

12e0b77bdc112b993b21306891a844b2.png

如何使用 Headscale ( Tailscale 开源版 ) 快速搭建一个私有专属的 P2P 内网穿透网络

c90ab7b2a36de6618dd3eee714e31fb9.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

b4027e8e0254da597bfd7af0cea357dd.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/211254
推荐阅读
相关标签
  

闽ICP备14008679号