资讯详情

资讯详情

Kubernetes四大节点组件原理与故障排查指南

1. 什么是Kubernetes节点组件它到底在解决什么问题你可能已经听过“K8s是云原生时代的操作系统”这种说法但真正用过的人会发现这句话不是比喻而是事实——只不过这个“操作系统”不装在你的笔记本里而是运行在成百上千台服务器组成的集群上。而k8s重要节点组件就是这套分布式操作系统的“四肢与神经末梢”它们不负责全局调度决策那是控制平面的事却实实在在地扛起每一份业务负载的落地执行。没有它们再精妙的调度算法也只是纸上谈兵有了它们哪怕控制平面短暂失联已运行的Pod也能继续呼吸。我第一次在某电商大促压测中亲眼看到节点组件的价值当时API Server因流量突增出现毫秒级延迟但所有Worker节点上的kubelet仍在按上次同步的PodSpec稳定拉起容器、上报状态、重启失败进程——整个用户下单链路零感知。这背后不是魔法而是kubelet、kube-proxy、containerd或docker、CNI插件这四大节点组件构成的“自治闭环”。它们共同回答了一个最朴素的问题当一个Pod被分配到某台机器上这台机器究竟要做什么、怎么做、怎么证明自己做对了这个话题适合三类人深度阅读一是刚通过kubeadm init搭起第一个集群、却对/var/lib/kubelet/config.yaml里每个字段都心存疑虑的运维新人二是写完Deployment YAML却总卡在Service不通、Ingress 503的开发同学三是正在设计混合云架构、需要精确评估节点资源开销与安全边界的SRE工程师。你不需要背下所有源码路径但必须清楚每个组件在数据流中的位置、它信任谁、又被谁信任、出错时日志往哪看——这才是“懂K8s”的分水岭。核心关键词“k8s重要节点组件”不是泛指而是特指那些必须部署在每个工作节点Worker Node上、直接参与Pod生命周期管理与网络通信的不可替代模块。它们和控制平面组件如etcd、scheduler有本质区别后者可以高可用部署、跨节点冗余而节点组件是单机强绑定的一台机器上少一个那台机器就等于“半身不遂”。接下来我会像拆解一台发动机那样把kubelet如何启动容器、kube-proxy怎样改写iptables、CNI插件如何给容器插上网线、containerd为何取代Docker这些关键动作全部摊开在你面前。2. 四大核心节点组件深度拆解职责、交互与不可替代性2.1 kubelet节点上的“总包工头”一切Pod操作的最终执行者kubelet不是调度器也不是容器运行时它是Kubernetes在每个节点上的“现场项目经理”。它的核心使命只有一条确保本机上运行的Pod状态与API Server中存储的期望状态Desired State完全一致。这个看似简单的承诺背后是极其精密的状态机驱动和容错设计。它的工作流程高度结构化首先通过--kubeconfig参数连接API Server以TLS双向认证建立长连接然后周期性默认10秒调用/pods端点拉取本节点应运行的Pod列表接着逐个比对本地实际容器状态通过CRI接口查询containerd与PodSpec声明的镜像、端口、健康检查等字段一旦发现偏差比如容器崩溃、镜像拉取失败、Liveness Probe超时立即触发修复动作——拉起新容器、删除旧容器、上报事件。整个过程不依赖任何中间协调者完全自主决策。这里有个关键细节常被忽略kubelet自身不直接调用Docker或containerd的CLI命令而是通过标准化的Container Runtime InterfaceCRIgRPC协议通信。这意味着只要运行时实现了CRI接口如containerd的cri-plugin、CRI-Okubelet就能无缝对接。这也是为什么K8s 1.24版本能平滑移除Docker作为默认运行时——对kubelet而言Docker只是CRI协议的一个具体实现就像HTTP协议不关心你用Chrome还是Firefox。提示当你遇到“Pod一直处于ContainerCreating状态”时第一反应不该是查网络而是立刻执行kubectl describe node node-name重点看Events区域是否有FailedCreatePodSandBox或ImagePullBackOff。这类错误90%源于kubelet与CRI运行时的通信失败而非镜像仓库问题。2.2 containerd轻量可靠的“容器引擎”从Docker Daemon手中接棒如果说kubelet是项目经理containerd就是它手下的“施工队队长”。它不处理K8s语义比如Service、Ingress只专注做好一件事安全、高效、可扩展地管理容器的全生命周期。其架构采用经典的客户端-服务端模型后台守护进程containerd监听/run/containerd/containerd.sockUnix域套接字前端ctr命令行工具或kubelet通过CRI插件向其发起创建容器、拉取镜像、执行命令等请求。containerd的核心优势在于“解耦”它将镜像管理containerd-shim、运行时管理runc或crun、网络配置委托给CNI彻底分离。例如当kubelet要求启动一个Pod时containerd会调用containerd-shim进程为该Pod创建独立的命名空间隔离环境通过runc在shim进程中启动init容器和主容器将容器PID、网络命名空间路径等元数据持久化到/var/run/containerd/io.containerd.runtime.v2.task/目录向kubelet返回容器ID和状态全程不涉及Docker Daemon的复杂图层管理逻辑。实测数据显示在同等硬件条件下containerd的内存占用比Docker Engine低35%Pod启动延迟减少22%。这不是玄学——Docker Daemon需维护完整的镜像仓库、构建缓存、网络驱动、卷插件等庞杂子系统而containerd只保留容器运行必需的最小内核。某金融客户在迁移至containerd后单节点可承载的Pod密度从120提升至165直接节省了3台物理服务器。注意containerd配置文件/etc/containerd/config.toml中[plugins.io.containerd.grpc.v1.cri.registry]区块必须正确配置镜像仓库地址和认证信息。若使用私有Harbor此处遗漏configs配置会导致所有Pod卡在ImagePullBackOff且kubectl describe pod仅显示“failed to pull image”根本不会提示认证失败——这是新手踩坑率最高的配置点。2.3 kube-proxy集群内部的“流量调度员”Service背后的隐形推手很多人误以为Service是“虚拟IP”其实它更像一张动态路由表。而kube-proxy就是这张表的实时编译器与下发器。它的核心任务只有一个确保集群内任意节点上的Pod都能通过Service的ClusterIP或DNS名称访问到后端真实Pod的IPPort。为达成此目标它提供了三种代理模式每种都是针对不同场景的精密权衡。iptables模式默认且最常用kube-proxy监听Service和Endpoint变更事件将每条Service规则编译为多条iptables链如KUBE-SERVICES、KUBE-SEP-XXXX。当流量抵达ClusterIP:Port时iptables通过随机数或哈希算法选择一个Endpoint IP:Port进行DNAT转发。优点是性能极高内核态转发缺点是规则数量随Service增长呈O(n²)爆炸万级Service时可能导致iptables规则加载超时。IPVS模式推荐用于大规模集群将iptables替换为Linux内核的IP Virtual Server模块。它使用哈希表存储Service映射关系查找时间复杂度为O(1)支持更丰富的负载均衡算法rr/wlc/sh/dh和健康检查机制。启用只需在kube-proxy配置中设置mode: ipvs并确保节点内核加载ip_vs模块。某视频平台在5000 Service规模下IPVS模式使Service更新延迟从12秒降至0.3秒。userspace模式已废弃纯用户态代理性能差且无实际价值仅作历史了解。实操心得当遇到“Service能通但响应极慢”时优先检查kube-proxy日志中是否出现cant find service警告。这通常意味着Endpoint未生成——根源往往是Pod的label selector与Service定义不匹配或Pod尚未通过Readiness Probe。此时kubectl get endpoints service-name会返回空列表而非iptables规则错误。2.4 CNI插件容器的“网络布线工”让Pod真正接入集群网络如果把Pod比作一栋新建的公寓楼那么CNIContainer Network Interface插件就是负责铺设光纤、安装路由器、配置门禁系统的工程队。它不定义网络拓扑只提供一套标准接口ADD/DEL/CHECK让不同网络方案Calico、Flannel、Cilium能统一接入K8s。没有CNIPod只能获得127.0.0.1回环地址彻底成为网络孤岛。CNI插件的工作发生在containerd创建容器之后、kubelet上报Pod状态之前。典型流程如下kubelet调用CRI创建容器获取容器网络命名空间路径如/proc/12345/ns/netkubelet调用CNI插件二进制如/opt/cni/bin/calico传入网络配置JSON和容器网络命名空间路径CNI插件在容器netns内创建veth pair一端如eth0另一端挂载到宿主机如cali12345为eth0分配IP来自CNI配置中指定的IPAM插件配置默认路由将宿主机端口加入CNI定义的网桥或BGP路由表完成跨节点通信准备。这里的关键认知是CNI插件本身不处理跨节点流量转发它只负责“最后一公里”接入。Flannel通过flanneld守护进程在各节点间建立UDP/VXLAN隧道Calico利用BGP协议将各节点视为路由器宣告Pod网段Cilium则基于eBPF在内核态实现高性能转发。选择哪种方案本质是在“配置简单性”、“网络性能”、“策略灵活性”三者间做取舍。常见误区认为“安装了Calico就自动解决所有网络问题”。实际上若节点防火墙如firewalld未放行BGP端口179或VXLAN端口8472Calico的felix组件会持续报failed to connect to BGP peer导致节点间Pod无法通信。此时journalctl -u calico-node | grep -i connection refused是最快定位手段。3. 节点组件协同工作全流程从kubectl apply到Pod Ready的7个关键阶段3.1 阶段一API Server接收与校验毫秒级当你执行kubectl apply -f nginx-deployment.yaml请求首先进入API Server。它做的第一件事不是存入etcd而是准入控制Admission Control。这一阶段会触发多个插件NamespaceExists检查命名空间是否存在LimitRanger验证容器requests/limits是否超出命名空间配额ResourceQuota确认本次创建不突破总量限制。只有全部校验通过API Server才将Deployment对象序列化为JSON写入etcd。这个过程看似与节点无关却是后续所有节点动作的起点。我曾见过一个案例某团队为测试故意在Deployment中设置resources.limits.memory: 100Gi结果API Server在准入阶段直接拒绝返回Forbidden: exceeded quota。他们困惑于“为什么Pod都没创建”却忽略了准入控制才是K8s的第一道闸门。3.2 阶段二Scheduler调度与绑定100ms~2setcd写入成功后Scheduler通过informer机制监听到新Deployment。它立即开始调度遍历所有Node执行预选Predicates过滤掉不满足条件的节点如资源不足、taint不匹配、nodeSelector不符再对剩余节点打分Priorities综合CPU/内存使用率、亲和性权重等计算得分最终选择最高分节点向API Server发送Binding对象将Pod“绑定”到该节点。这里有个隐藏细节Scheduler的调度结果不保证100%被执行。因为Binding对象只是告诉API Server“建议去哪”真正执行的是kubelet。如果该节点kubelet异常或网络中断Pod会卡在Pending状态直到其他Scheduler实例重新调度。这也是为什么生产环境必须部署多副本Scheduler并启用Leader Election。3.3 阶段三kubelet同步PodSpec与初始化2~5s被选中的节点上kubelet通过watch机制收到Pod事件。它首先将PodSpec保存到本地/var/lib/kubelet/pods/pod-uid/volumes/目录然后调用CRI接口要求containerd拉取nginx镜像。此时containerd会检查本地镜像缓存命中则跳过下载未命中则从Registry拉取layer并校验sha256摘要解压layer到/var/lib/containerd/io.containerd.content.v1.content/blobs/构建镜像rootfs并生成image-id。整个过程在千兆内网下通常2~3秒完成。若镜像过大如AI训练镜像超5GB可提前用ctr images pull预热避免Pod启动时阻塞。3.4 阶段四CNI网络配置与IP分配500ms~2s镜像就绪后kubelet调用CNI插件。以Flannel host-gw模式为例CNI插件读取/etc/cni/net.d/10-flannel.conflist确认网络配置调用IPAM插件如host-local从10.244.0.0/16网段分配一个未使用的IP如10.244.1.10在容器netns内创建eth0配置IP和路由ip addr add 10.244.1.10/24 dev eth0ip route add default via 10.244.1.1在宿主机创建cni0网桥将veth另一端vethxxxx加入网桥配置宿主机路由ip route add 10.244.2.0/24 via 192.168.1.102 dev eth0指向Node2的IP。此时Pod已获得集群内可达IP但还不能对外提供服务——因为Service的ClusterIP尚未生效。3.5 阶段五kube-proxy更新iptables/IPVS规则200ms~1s几乎与CNI配置同时kube-proxy监听到新Endpoint即该Pod的IPPort。它立即编译规则iptables模式在KUBE-SERVICES链插入-A KUBE-SERVICES -d 10.96.0.1/32 -p tcp --dport 80 -j KUBE-SVC-XXXXXX在KUBE-SVC-XXXXXX链插入-A KUBE-SVC-XXXXXX -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-YYYYYY在KUBE-SEP-YYYYYY链执行DNAT-A KUBE-SEP-YYYYYY -p tcp -j DNAT --to-destination 10.244.1.10:80。执行完毕后任何发往10.96.0.1:80kubernetes.default.svc.cluster.local的流量都会被内核重定向到10.244.1.10:80。整个过程无需重启kube-proxy规则热更新。3.6 阶段六容器启动与健康检查3~10scontainerd调用runc启动nginx容器。此时发生关键动作runc在容器netns内执行nginx -g daemon off;容器进程PID被记录到/run/containerd/io.containerd.runtime.v2.task/k8s.io/pod-uid/init/kubelet检测到容器PID存在将Pod Phase更新为Running开始执行Readiness Probe每10秒向/healthz发送HTTP GET请求若连续3次失败failureThreshold3kubelet将该Pod从Endpoint列表中移除Service流量不再转发至此。这就是为什么kubectl get pod显示Running但Service却503——Readiness Probe未通过Pod虽活着却不被纳入服务发现。3.7 阶段七节点状态上报与闭环10s周期kubelet以10秒为周期将本节点状态NodeCondition、NodeAddress、NodeDaemonEndpoints和所有Pod状态Phase、Conditions、ContainerStatuses打包通过/api/v1/nodes/node-name/status端点上报API Server。API Server校验后更新etcd中Node对象的status字段。Scheduler、HPA等组件正是依赖这些实时状态做决策。一次完整的闭环就此完成从kubectl apply到Pod Ready提供服务耗时通常在15~30秒。其中网络配置阶段四和健康检查阶段六是最大变量。某在线教育平台曾将Readiness Probe的initialDelaySeconds从5秒调至30秒使大流量涌入时Pod启动成功率从78%提升至99.6%——因为Java应用JVM预热需要时间过早探测必然失败。4. 生产环境高频故障排查手册12个真实问题与根因分析4.1 故障一Pod卡在ContainerCreatingdescribe显示FailedCreatePodSandBox现象kubectl get pod长期显示ContainerCreatingkubectl describe podEvents中出现FailedCreatePodSandBox。根因分析sandbox沙箱是K8s对Pod底层隔离环境的抽象由containerd创建。此错误表明containerd无法为Pod初始化网络命名空间或挂载卷。排查步骤登录对应节点执行sudo crictl ps -a | grep pod-uid确认sandbox容器是否存在若无输出执行sudo journalctl -u containerd -n 100 --no-pager | grep -i sandbox查看containerd日志常见原因/var/lib/containerd磁盘满df -h /var/lib/containerd、SELinux阻止挂载sudo ausearch -m avc -ts recent、CNI配置文件语法错误sudo cat /etc/cni/net.d/*.conf | jq .验证JSON。解决方案清理/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/临时快照或临时禁用SELinux测试sudo setenforce 0。4.2 故障二Service ClusterIP无法访问但Pod IP直连正常现象curl http://pod-ip:80成功curl http://cluster-ip:80超时或拒绝连接。根因分析kube-proxy规则未生效或iptables/ipvs规则损坏。排查步骤在Pod所在节点执行sudo iptables -t nat -L KUBE-SERVICES | grep cluster-ip确认规则存在若不存在检查kube-proxy Pod日志kubectl logs -n kube-system kube-proxy-pod搜索syncProxyRules常见原因kube-proxy配置中--proxy-mode与实际内核模块不匹配如设为ipvs但未加载ip_vs模块或节点防火墙拦截了127.0.0.1:10249kube-proxy健康检查端口。解决方案modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wlc加载模块或修改kube-proxy ConfigMap将mode改为iptables。4.3 故障三Pod能访问外网但无法解析集群内Service域名现象nslookup kubernetes.default.svc.cluster.local返回server cant find ...: NXDOMAIN。根因分析CoreDNS未正确配置或kubelet未将/etc/resolv.conf指向CoreDNS。排查步骤进入Pod执行cat /etc/resolv.conf确认nameserver指向10.96.0.10CoreDNS ClusterIP若指向10.0.0.1等错误地址检查kubelet启动参数--resolv-conf/run/systemd/resolve/resolv.conf是否覆盖了默认值检查CoreDNS Pod日志kubectl logs -n kube-system -l k8s-appkube-dns搜索plugin/errors。解决方案编辑kubelet配置移除--resolv-conf参数或确保其指向正确的resolv.conf路径。4.4 故障四节点NotReady但kubelet进程正常运行现象kubectl get nodes显示NotReadysystemctl status kubelet显示active (running)。根因分析kubelet虽存活但无法与API Server通信或上报状态失败。排查步骤在节点执行sudo journalctl -u kubelet -n 50 --no-pager | grep -i not ready\|failed to post常见原因节点时间不同步timedatectl status检查NTP状态kubelet证书过期sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text -noout | grep Not AfterAPI Server地址配置错误cat /var/lib/kubelet/kubeconfig。解决方案sudo timedatectl set-ntp true启用NTP若证书过期需轮换kubelet证书sudo kubeadm certs renew kubelet。4.5 故障五CNI网络插件报错failed to acquire lease: context deadline exceeded现象Calico或Flannel Pod日志持续输出failed to acquire lease节点间Pod无法通信。根因分析CNI插件需从etcd获取分布式锁lease此错误表明etcd连接超时或压力过大。排查步骤检查etcd健康kubectl exec -n kube-system etcd-node -- etcdctl endpoint health查看etcd指标kubectl get --raw /metrics | grep etcd_disk_wal_fsync_duration_seconds若P99 10s说明磁盘I/O瓶颈检查网络telnet etcd-ip 2379确认端口可达。解决方案升级etcd至3.5版本优化lease性能为etcd节点挂载SSD调整CNI插件leader-elect配置降低竞争频率。4.6 故障六Pod内存使用率100%但kubectl top pod显示仅200Mi现象kubectl top pod内存用量远低于docker stats或ps aux显示值。根因分析kubectl top读取cAdvisor指标而cAdvisor默认只监控/sys/fs/cgroup/memory/kubepods/路径若容器使用--memory-swap或未正确挂载cgroup v2指标将丢失。排查步骤在节点执行find /sys/fs/cgroup/memory -name *pod-uid* | head -5确认cgroup路径存在检查kubelet参数ps aux | grep kubelet | grep cgroup确认--cgroup-driver与containerd配置一致systemd或cgroupfs手动查询cAdvisorcurl http://localhost:10255/metrics | grep container_memory_usage_bytes。解决方案统一cgroup drivercontainerd配置/etc/containerd/config.toml中[plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true重启containerd和kubelet。4.7 故障七kube-proxy日志频繁报cant find service for endpoint现象kube-proxy日志滚动出现大量cant find service for endpoint但Service功能正常。根因分析Endpoint对象被创建但对应的Service对象尚未同步到kube-proxy的informer缓存。排查步骤检查API Server日志kubectl logs -n kube-system api-server-pod | grep -i watch timeout常见原因API Server与etcd网络延迟高100mskube-proxy watch参数--min-resync-period设置过长默认12h。解决方案优化API Server与etcd网络同机房部署在kube-proxy ConfigMap中添加minResyncPeriod: 5m0s缩短同步间隔。4.8 故障八containerd拉取私有镜像失败报unauthorized: authentication required现象kubectl describe pod显示Failed to pull image harbor.example.com/proj/app:v1错误unauthorized。根因分析kubelet未将Secret中的镜像仓库凭证传递给containerd。排查步骤确认Pod YAML中imagePullSecrets正确引用SecretimagePullSecrets: [{name: regcred}]检查Secret内容kubectl get secret regcred -o yaml确认.dockerconfigjson字段base64解码后包含正确auths检查containerd配置/etc/containerd/config.toml中[plugins.io.containerd.grpc.v1.cri.registry]是否启用了config_path。解决方案在containerd配置中添加config_path /var/lib/kubelet/config.json并将Secret内容写入该路径需kubelet自动注入。4.9 故障九节点CPU使用率飙升至90%top显示kubelet进程占30%现象top中kubelet CPU占比异常高但Pod负载正常。根因分析kubelet正密集执行垃圾回收GC如删除大量终止容器或清理镜像。排查步骤查看kubelet日志journalctl -u kubelet | grep -i garbage collection检查GC参数ps aux | grep kubelet | grep eviction\|gc确认--image-gc-high-threshold默认85%和--minimum-image-ttl-duration默认2m执行sudo crictl images查看镜像数量是否超万。解决方案调高--image-gc-high-threshold90增加--minimum-image-ttl-duration12h减少频繁GC定期清理无用镜像sudo crictl rmi $(sudo crictl images -q --filter danglingtrue)。4.10 故障十Pod内ping其他节点Pod IP不通但curlService ClusterIP正常现象跨节点Pod直连失败但通过Service访问成功。根因分析CNI插件未正确配置跨节点路由或节点防火墙拦截ICMP。排查步骤在源Pod执行ip route确认默认网关指向CNI网桥如10.244.1.1在目标节点执行ip route | grep source-pod-cidr确认存在指向源节点的路由检查节点防火墙sudo iptables -L INPUT | grep icmp确认ICMP未被DROP。解决方案若使用Flannel检查flanneld日志中Wrote subnet file是否成功开放防火墙ICMPsudo iptables -I INPUT -p icmp --icmp-type echo-request -j ACCEPT。4.11 故障十一kubelet启动报错failed to run Kubelet: unable to load bootstrap kubeconfig现象systemctl status kubelet显示failed to run Kubelet日志中unable to load bootstrap kubeconfig。根因分析kubelet首次启动需bootstrap token从API Server获取client certificate但/etc/kubernetes/bootstrap-kubelet.conf文件缺失或权限错误。排查步骤检查文件存在性ls -l /etc/kubernetes/bootstrap-kubelet.conf确认文件权限sudo chmod 600 /etc/kubernetes/bootstrap-kubelet.conf检查token有效性kubectl get secrets -n kube-system | grep bootstrap。解决方案重新生成bootstrap tokenkubeadm token create --description bootstrap-kubelet更新bootstrap-kubelet.conf中token字段。4.12 故障十二containerd日志刷屏failed to delete container: failed to unmount...磁盘IO 100%现象containerd日志持续报unmount失败iostat -x 1显示%util100%。根因分析容器进程残留导致文件系统无法卸载常见于僵尸进程或NFS挂载。排查步骤执行sudo lsof D /var/lib/containerd/查找被占用的路径检查僵尸进程ps aux | grep Z查看mount信息mount | grep containerd。解决方案杀死僵尸进程父进程强制卸载sudo umount -f /var/lib/containerd/io.containerd.runtime.v2.task/k8s.io/pod-uid/rootfs重启containerd。5. 节点组件性能调优与安全加固实战指南5.1 kubelet调优从默认配置到生产就绪kubelet的默认参数面向通用场景生产环境需针对性调整。以下是我经某支付平台千万级QPS验证的调优清单资源限制与GC策略# 避免OOM Killer误杀kubelet --system-reservedmemory1Gi,cpu500m \ --kube-reservedmemory500Mi,cpu200m \ # 图像GC更激进防止磁盘爆满 --image-gc-high-threshold85 \ --image-gc-low-threshold75 \ --minimum-image-ttl-duration2h0m0s \ # 容器GC及时清理退出容器 --eviction-hardmemory.available500Mi,nodefs.available10%,imagefs.available10% \ --eviction-minimum-reclaimmemory.available500Mi,nodefs.available1Gi,imagefs.available1Gi性能与稳定性增强# 减少API Server压力延长同步周期 --sync-frequency1m \ --node-status-update-frequency10s \ # 启用PLEG优化加速容器状态检测 --housekeeping-interval30s \ # 关闭非必要功能降低CPU占用 --streaming-connection-idle-timeout4h0m0s \ --read-only-port0 \ # 彻底禁用只读端口消除安全隐患 --anonymous-authfalse \ # 禁用匿名访问 --authorization-modeWebhook # 强制走RBAC鉴权实操心得--sync-frequency从默认10s调至1m后某节点kubelet CPU占用从12%降至3.5%但需确保--node-status-update-frequency仍为10s否则节点状态上报延迟影响HPA。二者配合才能兼顾性能与可观测性。5.2 containerd深度配置安全与效率的平衡术containerd的安全加固不是简单关闭功能而是构建纵深防御。关键配置位于/etc/containerd/config.toml镜像安全与可信执行[plugins.io.containerd.grpc.v1.cri.registry] [plugins.io.containerd.grpc.v1.cri.registry.mirrors] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [https://mirror.gcr.io] # 使用可信镜像代理 [plugins.io.containerd.grpc.v1.cri.registry.configs] [plugins.io.containerd.grpc.v1.cri.registry.configs.harbor.example.com.tls] ca_file /etc/containerd/certs.d/harbor.example.com/ca.crt [plugins.io.containerd.grpc.v1.cri.registry.configs.harbor.example.com.auth] username admin password xxx [plugins.io.containerd.grpc.v1.cri.containerd] default_runtime_name runc [plugins.io.containerd.grpc.v1.cri.containerd.runtimes] [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc] runtime_type io.containerd.runc.v2 [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true # 必须开启否则cgroup v2指标失效 NoNewPrivileges true # 禁止容器获取新特权性能关键参数[plugins.io.containerd.grpc.v1.cri.containerd] # 启用快照器优化加速镜像拉取 snapshotter overlayfs # 限制并发
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →