
1、PV回收策略(存储卷模块)PV配置文件/persistentVolumeReclaimPolicy...persistentVolumeReclaimPolicy: Retain##所bind的pvc被删除时,pv不会随之被删除,他的状态为released,管理员可以手动回收pv(使其状态变为aviliable或bound[在此之前最好先确认PV数据被备份,如这里需要备份nfs资源目录])1,如果数据已备份且现阶段不需要此PV里的数据了使用kubectl delete pv 将pv状态重置为avilable(其配置文件mypv.yaml里配置是retain)与RS同理(kubectl detele pod以更新服务)2创建一个新的PVC来bound这个pod2、pod 探针1.1、启动探针判定容器内应用是否启动优先级高于就绪探针和存活探针实现方式:exec(对容器执行命令若$?为0则表示容器健康)tcpsocket(若与Pod成功创建一个tcp连接[创建tcp连接:py为例:1确认serverip:tcpport;2.创建socket对象import socket ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);3.连接server host,port s.connect(host,port);4.对server发起数据交互(二进制)server端对路由的处理参数的解析处理略过(参考nodeJS),server处理入库返回;5.client脚本接受返回值datas.receive(1024) print(received: ,data.decode())关闭连接s.close]则表示Pod健康) httpget:对server发起http 请求通过返回的状态码判断业务容器是否健康1.2、就绪探针判断容器是否就绪实现方式上3就绪探针失败时k8s会把对应POD的ip从endpoint列表中delete防止新的流量到达该POD1.3、存活探针判断POD是否存活5种属性 探测延时:pod启动多少s后开始探测探测频率:间隔多少s发起一次存活探测默认为10s探测延时:多少s内为响应表示pod挂掉默认为1探测成功/失败条件(连续探测成功/失败几次表示pod存活/挂掉,默认为1/3次)3、pod 处于pending 状态怎么排查1) pod一直pending原因是没有被调度到节点上, describle pod 查看日志有可能是调度节点资源不足;2可能是pod启动资源限制给得太小导致业务无法正常运行3可能是pod中存储卷挂载错误挂载了错误的存储卷名pvc错误检查pvc状态4pod中容器及定义了hostPort(同docker run -p端口隐射实际就是代替了kube-porxy/docker-proxy的工作将对宿主机的http请求代理到pod),假如你是3node,那么POD的副本数最大为3多出的POD将显示为pending!4、节点正常,但是pod一调度就not ready 了可能是哪些原因(#)4.1 kubectl describle node 查看node节点错误日志信息已排查问题4.2 节点kubelet问题,kubelet负责与apiserver通信完成节点注册若kubelet崩掉那么与apiserver无法通信, jounalctl -u kubelet --since查看kubelet错误日志信息已排查问题4.3 节点kube-proxy问题kube-proxy负责节点网略规则的维护和请求的代理转发,若kube-proxy崩掉那么会导致与节点的网络通信异常systemctl status kube-proxy journalctl /var/log/查看kubeproxy错误日志信息以排查问题所在4.4 kublet证书问题证书过期会导致与apiserver无法通信,各节点 改kubelet配置文件**/var/lib/kubelet/config.yaml** 尾部添加“**serverTLSBootstrap: true**” 重启服务SYSTEMCTL RESTART KUBELET 查看申请证书状态 “**kubectl get certificatesigningrequests**” 最后在控制节点(MASTER) 批准证书(**kubectl certificate approve** 证书名 ) 批准后节点会将证书从集群中下载回 本机 而后集群 会删除 批准的证书(防止被攻击 下载证书 )*4.5 pod问题pod资源配置不合理请求了过量节点资源 kubectl logs -f pod4.6 内核以及系统级问题: journalctl -k dmsg top 公共日志等查看是否有异常输出;4.7 软件冲突该节点上安装了与当前版本的k8s不兼容的软件 等。5、mysql数据库突然连接不上了0、查看mysql日志异常输出以定位问题所在; #日志是任何工具任何服务排故的第一着手点,重启是没有思路下的第一选择1、redis脏数据(在接口中更新了dbsource,但服务读取时优先读取了redis中dbsource的脏数据,)2、网络环境变更如目的主机被防火墙规则过滤3、数据库用户select权限被禁止4、数据库数据目录fs文件系统写满6、Centos7下Prometheus配置alertmanager告警前提是prometheus监控系统正常运行1安装alertmanager,写配置起服务2)在prometheus配置文件中打开alertmanager配置(am地址,rule_files地址);3prometheus安装目录下创建mkdir -p rules统一托管alertmanager告警规则文件*alert.yaml;4)写一个类型alert.yaml测试达到告警阀值,prometheus是否调用alertmanager告警可参见https://blog.csdn.net/weixin_47387140/article/details/134999383?spm1001.2014.3001.55017、路由汇总定义与场景: 路由汇总又称为路由聚合是将一组有规律的路由汇聚成一条路由从而达到减小路由表规模以及优化设备资源利用率的目的如: R1有254条路由, 192.168.{1..254}.0 24 10.1.12.2(出口/下一跳) 可做路由汇总配置如下:ip route-static 192.168.0.0 16 10.1.12.2##数据转发路径若出现环路产生的危害是非常大的针对本案例的解决办法很简单, 在Router上增加一条黑洞路由,如下:ip route-static 192.168.0.0 22 Null0#利用Null 0 路由来解决路由汇总场景中的数据转发环路问题是一种有效并且常见的解决方案8、交换机隔离什么域路由器隔离什么域1、交换机隔离冲突域而不隔离广播域: 交换机是通过自学学习到端口和MAC映射并且ARP协议使用的就是广播所以交换机绝对不能屏蔽广播2 、路由器不但能隔离广播域默认也是可以隔离冲突域的3 、路由器每个端口是一个广播域(R--VLAN); 交换机每个端口是一个冲突域先通过广播获得路由信息用户请求时到交换机级再通过隔离域隔离【对4.10的请求不会到4.20】9、使用overlay网络通信的容器挂载到宿主机的目录解释在/var/lib/docker/overlay2/目录中每个子目录通常代表一个 Docker 镜像或容器的文件系统层。这些子目录包含以下关键内容lower包含所有基础镜像层的路径。这些基础镜像层是只读的并且被叠加在一起以构建容器的文件系统。upper包含所有叠加的读写层。这些读写层位于基础镜像层之上并包含容器的修改和新增内容例如配置文件、日志等。然而在 Overlay2 的实际实现中可能并不会直接看到一个名为 upper 的目录而是通过 diff 目录和合并文件系统技术来实现读写层的功能。diff实际上存储了当前层对文件系统的修改。当容器从其基础镜像运行并产生改变时如添加、删除、修改文件这些改变都会记录在 diff 目录中。merged是一个虚拟的文件系统层它通过合并下层的只读镜像和顶层的可写 diff 目录提供一个统一视图的文件系统。这是 Docker 容器实际看到的文件系统。work是 Overlay 文件系统所需要的技术性目录用于存储 Overlay 文件系统的临时文件。它帮助管理和组织文件系统层次但不直接存储文件数据。##DIFF是容器的修改信息包括代码更新日志文件和其他输出这个目录占用磁盘FS空间应该是比较大的。diff目录打满宿主机系统盘解决方案:为了管理diff目录占用的磁盘空间可以采取以下措施限制日志文件大小通过配置 Docker 的日志选项可以限制日志文件的大小和数量从而防止日志文件无限制地增长。例如可以在 Docker 的配置文件中设置log-opts选项限制日志文件的最大大小和最大文件数。eg:mkdir -p /etc/dockercat /etc/docker/daemon.json EOF{log-driver: json-file,log-opts: {max-size: 100m,max-file: 5}}EOF注意,正确的做法应该是清除挂载出来的大量数据的位置如/opt/sansec而不是去清理/var/lib/docker/overlay/*目录本身一是这个目录下存在docker的一些元数据如镜像数据等,二是/var/**实质是挂载出来的数据目录连接而来应该清除目录本身定期清理未使用的容器和镜像使用 Docker 提供的清理命令如docker image prune会清理所有Stoped容器 和docker container prune(会清理所有无标签/无用的镜像)可以删除未使用的镜像和容器从而释放占用的磁盘空间。监控磁盘使用情况定期监控 Docker 使用的磁盘空间情况可以使用docker system df命令查看 Docker 镜像、容器、数据卷和构建缓存的磁盘使用情况。调整存储路径如果默认的存储路径在磁盘空间有限的分区可以考虑将 Docker 的默认存储路径调整到有更多可用空间的分区。10、K8s初始化、集群认证(证书与token)10.1 初始化阶段Kubeadm init --configkubeadm-init.yml : 使用kubeadm部署k8s 首次安装或者执行kubeadm reset 后 执行他会初始化k8s master节点 :1 )创建k8s集群证书CA证书和组件证书apiserver kubelet scheduler等 2)生成master组件配置文件,重定向到静态pod配置文件目录下/etc/kubernetes/manifests ; 3) 运行k8s master节点组件集群初始化后,使用以下命令将集群管理员配置(包括apiserver地址,管理员公私钥(apiserver使用管理员用户ssh到节点获取数据时认证用),客户端证书/CA证书对[https通信时验证客户端(kubectl)和服务端(apiserver)身份信息使用])同步到当前系统用户使当前用户具有集群管理员权限mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config10.2 证书与token10.2.1 证书,管理命令 kubeadm certs args 如kubeadm certs renew all集群组件请求apiserver访问集群资源时需要从证书获取认证信息,/etc/kubenetes/pki/*\.crt文件。证书更新后,节点会向master发起证书审批申请,csr审批一般由controller-manage自动完成流程卡住即csr penddig时需要人工介入 kubectl certificate approve 证书名10.2.2 token,管理命令 kubeadm token args 如 kubeadm token list当新节点要加入集群时临时认证方式认证后即可加入集群。 如果token过期, 使用kubeadm token create --ttl0 --print-join-command创建token 使用此token加入集群。10.3 权限相关命令#查看当前用户集群权限kubectl auth can-i --list#查看配置kubectl config view11、调度条件11.1 标签(node/pod)k8s中重要的元数据, 常见场景基于环境(eg envproduction)版本(eg versionv1.xx)项目(projectassets-system) 层级(tierdatabase)等打标签 svc,污点,亲和/反亲和 等资源 都可以通过标签来判断是否调度。kubectl label pod -l appwebnginx envproductionkubectl get node,pod -o wide --show-labels11.2 污点node根据机器资源使用情况机器用途给节点打污点: NoSchedule不调度新 Pod、PreferNoSchedule尽量不调度、NoExecute驱逐已有 Pod决定是否调度#打for node in {node1..node3}doif kubectl taint node ${node} k1v1:NoSchedule /dev/nullthenecho ${node} taint ok.fidone#看kubectl describle node $node |grep -i taint11.3 容忍(pod)写在 Pod 规格里的属性配置pod可以容忍哪些污点11.4亲和/反亲和(pod/node) 定向调度将3副本的业务pod调度到不同的node节点上保证单节点DOWN掉业务高可用, 服务发布后, service仍可通过匹配后端标签来获取后端endpoints列表(PS: 只有pod readinessProbe检查成功时,podip才会被添加到service的endpoint列表中)就绪探针探测失败后podip会从endpoint列表中摘流。