目录

备份/恢复

集群升级

集群故障排查

Sidecar

storageclass

Taint

dns

selector 

节点维护——手动进行pod调度


备份/恢复

对于恢复etcd集群,官方建议重启k8s组件,具体说明如下:

说明:

如果集群中正在运行任何 API 服务器,则不应尝试还原 etcd 的实例。相反,请按照以下步骤还原 etcd:

  • 停止 所有 API 服务实例
  • 在所有 etcd 实例中恢复状态
  • 重启所有 API 服务实例

我们还建议重启所有组件(例如 kube-schedulerkube-controller-managerkubelet),以确保它们不会 依赖一些过时的数据。请注意,实际中还原会花费一些时间。 在还原过程中,关键组件将丢失领导锁并自行重启。

那么需要在恢复etcd集群前移动k8s静态pod目录(默认是/etc/kubernetes/manifests)下的kube-*文件到backup文件夹

如果不在此目录下,通过systemctl status kubelet获取配置文件路径,查看配置文件中的--config-file,再查看对应文件下的staticPodPath。

完成恢复后将上述文件移动回来并重启kubelet即可

恢复备份的命令etcdctl snapshot restore需要加上--data-dir指定新的数据目录,以防集群以来一些过时的数据

然后修改/etc/kubernetes/manifests/etcd.yaml里面的volume挂载目录,默认的数据目录是/var/lib/etcd

恢复备份会校验snapshot文件哈希值,有对应参数加上可以忽略这个校验

etcd恢复的流程为

1.移动manifests对应文件

2.执行restore命令并指定新目录

3.修改etcd.yaml

4.复原manifests文件以恢复k8s组件并重启kubelet

集群升级

先在control-plane节点cordon和drain要升级的节点,再ssh到指定要升级的节点

注意kubectl upgrade apply有不升级etcd的参数选项

集群故障排查

Node节点notReady一般是kubelet的问题,注意需要重启并且enable

Sidecar

考察sidecar容器与volume挂载

pod updates may not add or remove containers

kubectl edit更新pod无法增删容器,所以sidecar考题需要导出原pod的yaml在其上进行sidecar容器的增加

storageclass

创建pvc并且创建使用该pvc的pod,通过kubectl edit或者kubectl path修改pvc大小,并且记录修改记录

记录pvc大小更新的方法(edit)是在annotations上加kubernetes.io/change-cause: resize(value自定义)

kubectl patch pvc pv-volume -p '{"spec":{"resources":{"requests":{"storage": "70Mi"}}}}' --record

--record同样可以记录这条命令到这个注解中

Taint

检查集群中有多少节点为Ready状态,并且去除包含NoSchedule污点的节点。

--show-lables的参数选项看不到noschedule的污点,只能看到包含了node-role.kubernetes.io/master的label,需要用kubectl describe才能查看到

top

找出具有name=cpu-user的Pod,并过滤出使用CPU最高的Pod

根据 -l(--label)去筛选包含对应label的pod

kubectl top po -A -l name=cpu-user

dns

将deployment my-nginx绑定nodeport类型service,并且输出service和pod解析的dns日志

#dns解析使用nslookup,需要启动一个pod来协助
wget http://kubernetes.io/examples/admin/dns/busybox.yaml
kubectl apply -f busybox.yaml
#使用nslookup解析service
kubectl exec -it busybox nslookup my-nginx

selector 

列出service my-app对应的pod,写入到对应文件中

#查看service的label

kubectl get service -o wide

#根据label去获取pod

kubectl get pods --selector=查出来的label

节点维护——手动进行pod调度

xxx  节点设置为不可用,然后重新调度该节点上的所有 Pod
kubectl drain xxx  --delete-emptydir-data --ignore-daemonsets --force

以上的 --ignore-daemonsets 往往需要指定的,这是因为 deamonset 会忽略 unschedulable 标签(使用 kubectl drain 时会自动给节点打上不可调度标签),所以daemonsets依旧会往打上污点的节点调度

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐