cka备考笔记
etcd备份/恢复对于恢复etcd集群,官方建议重启k8s组件,具体说明如下:说明:如果集群中正在运行任何 API 服务器,则不应尝试还原 etcd 的实例。相反,请按照以下步骤还原 etcd:停止所有API 服务实例在所有 etcd 实例中恢复状态重启所有 API 服务实例我们还建议重启所有组件(例如kube-scheduler、kube-controller-manager、kubelet),
目录
备份/恢复
对于恢复etcd集群,官方建议重启k8s组件,具体说明如下:
说明:
如果集群中正在运行任何 API 服务器,则不应尝试还原 etcd 的实例。相反,请按照以下步骤还原 etcd:
- 停止 所有 API 服务实例
- 在所有 etcd 实例中恢复状态
- 重启所有 API 服务实例
我们还建议重启所有组件(例如
kube-scheduler
、kube-controller-manager
、kubelet
),以确保它们不会 依赖一些过时的数据。请注意,实际中还原会花费一些时间。 在还原过程中,关键组件将丢失领导锁并自行重启。
那么需要在恢复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调度
kubectl drain xxx --delete-emptydir-data --ignore-daemonsets --force
以上的 --ignore-daemonsets
往往需要指定的,这是因为 deamonset 会忽略 unschedulable
标签(使用 kubectl drain 时会自动给节点打上不可调度标签),所以daemonsets依旧会往打上污点的节点调度
更多推荐
所有评论(0)