Contents

升级 k8s 集群 docker

背景

最近需要给 k8s 集群升级 docker, 预期升到 19.03.x.

遇到一些问题, 记录下

调试期间遇到的问题:

集群中的 ingress 是以 daemonsets 方式部署, 通过 node-selector 选择节点定死.

而 kubectl drain node 并不 evict daemonset pods. 故在升级/重启 dockerd 期间会造成 ingress 短暂不可用. 而现有的 lb 的 health check 不能 cover 这一点, 仍会有流量打入.会导致升级期间 ingress 流量黑洞问题.

并且 dockerd 拉起来后, 有些 daemonsets 由于 ingress 自身 livenessProbe 等原因在 dockerd 升级期间持续 crashLoopbackoff 了, 一个原因是仍然 mount 一份旧的 docker overlay. 在 delete pod 重启后恢复. 故需要一个手段在升级后重启 ingress pods.

Ref https://github.com/kubernetes/kubernetes/issues/75482#issuecomment-511476698

但目前我没找到一个优雅的方式 restart all daemonsets pods on node, 只能通过脚本逐个杀

ingress qcloud lb health check 问题

由于目前我们 ingress 外部还接了 qcloud lb 做一层负载均衡, 从而引入了新问题.

遇到了没有重启 kubeproxy/calico 时网络问题(具体原因未知)导致 lb -> ingress 异常, 从而导致 http 504

结论: 需要对所有 pod 进行重启最保险.

重启命令:

1
kubectl get pods --all-namespaces -owide|awk -v host=$HOSTNAME '{if ($8 == host) system ("kubectl -n " $1 " delete pods " $2 " --grace-period=0 " " --force ")}'