资讯动态

生产环境Kubernetes集群安装:kubeadm、kubelet、kubectl完整指南

发布时间:2026/10/20 17:09:41 来源:尧图企业网站定制
1. 安装前的整体规划生产环境不是把文档抄一遍很多人拿到 kubeadm 的安装文档第一反应就是复制粘贴然后kubeadm init一把梭。做测试环境这么干没问题但生产环境如果还这么玩后面大概率会在某个深夜被集群故障叫醒。我在这篇笔记里想聊的重点不是命令本身而是从“生产环境”这个角度把安装 kubeadm、kubelet、kubectl 这条链路真正理清楚。先说结论生产环境安装 k8s本质上是三件事的组合——版本选型、系统准备、运行时对齐。kubeadm、kubelet、kubectl 这三个二进制安装本身很快真正花时间的反而是安装之前和安装之后那些看起来不起眼的配置。这篇文章我会把整个过程拆开讲包括为什么这么选、哪些参数必须改、哪些坑我踩过尽量让你照着做就能少走弯路。这套笔记适合什么人群一种是刚接触 k8s、想在生产环境搭建第一套集群的运维或后端开发另一种是在测试环境装过但没搞明白参数含义、想系统理一遍的人。默认情况下我以三节点集群为基线来写一个控制平面节点加两个工作节点操作系统以 Ubuntu 22.04 LTS 为例Kubernetes 版本用 1.28 系列。如果你用的是 CentOS/RHEL 或国产化系统差异点我会单独标注。1.1 版本选型给人用新不装新给机器用稳不稳Kubernetes 的版本迭代节奏大约是每三个月一个大版本每个大版本大概支持一年。生产环境选版本我个人的原则是不要追最新选当前处于稳定期且社区支持还在窗口内的版本最好往前数一到两个大版本。举个例子如果当前社区主线已经到 1.31那么 1.28、1.29、1.30 都属于合理选择。选新不选旧但不能选“最新”因为最新版刚发布时部分插件网络插件、存储插件、Ingress Controller的兼容性矩阵还没完全跟上遇到问题的概率会高一些。我在实际项目里一直倾向选择偶数版本号附近的小版本比如 1.28.x因为这类版本通常经过了较长时间的 Bugfix 迭代生态适配也最齐全。还有一个细节很多人容易忽略kubeadm、kubelet、kubectl 这三个组件的版本必须保持在同一大版本内甚至最好完全一致。kubelet 的版本可以略低于 kube-apiserver官方支持 kubelet 比 apiserver 低一个版本但反过来不行而且生产环境没必要给自己制造这种差异。所以最稳的做法就是三个工具装同一个版本号后面升级再用专门的流程处理。1.2 节点规划与硬件评估控制平面节点和工作节点的角色区分要提前想清楚。小规模集群比如几十个 Pod 以内可以把控制平面和工作节点混部但生产环境我强烈建议分离开。控制平面节点承载的是 etcd、kube-apiserver、kube-controller-manager、kube-scheduler 这四个核心组件任何一个抖动都会影响整个集群的稳定性不值得为了省两台机器把它们和工作负载放在一起抢资源。硬件上有一个粗略的估算方式控制平面节点建议 4 核 8G 起步etcd 所在节点对磁盘 IO 敏感最好用 SSD工作节点按业务 Pod 的资源需求来算一般 8 核 16G 是比较常见的中等规格。内存和 CPU 可以后续扩容但磁盘分区一定要在安装前规划好因为 etcd 的数据目录、容器镜像目录、kubelet 的 pod 目录一旦跑起来迁移成本很高。我这里给出的建议是基于常见部署场景的通用经验你可以根据实际业务规模调整。需要记住的核心原则是生产集群宁可资源冗余也不要卡着最低要求上线。1.3 网络与基础服务规划Kubernetes 的网络模型有三个网段需要规划Pod 网段、Service 网段、节点通信网段。这三个网段必须提前想清楚尽量不要和公司已有的内网网段冲突。比如 Pod 网段用 10.244.0.0/16Service 网段用 10.96.0.0/12节点网段用 192.168.x.0/24这三个网段互相之间不要有交集否则后面路由会很混乱。另外生产环境的 DNS、NTP、镜像仓库这些基础设施最好在安装集群之前就确认可用。集群内部组件之间大量依赖域名解析如果 DNS 配置有问题后面排查起来非常痛苦。我见过一个案例集群装完一切正常但 Pod 访问外部服务老超时最后定位到是节点上/etc/resolv.conf被 DHCP 覆盖导致的这种问题在安装阶段顺手确认一下就能避免。2. 操作系统基础配置一切从系统层面开始在装 kubeadm 之前操作系统层面的准备决定了集群能跑多稳。这一段的内容虽然看起来琐碎但如果哪一步漏了后面kubeadm init会在预检阶段直接报错或者装完集群之后出现一些很诡异的问题。2.1 主机名、hosts 与时间同步每个节点的主机名必须是唯一的不能出现重复。主机名也不建议用带下划线或特殊字符的名称Kubernetes 对节点名称的要求比较严格主机名里面有特殊字符会导致 kubelet 注册失败。我在实践中通常把主机名设置成带有角色标识的名称比如 k8s-master-01、k8s-node-01方便后期识别。所有节点的/etc/hosts建议手动写入集群内所有节点的 IP 和主机名映射。虽然内部 DNS 也能解决这个问题但/etc/hosts是最简单、最不容易出错的方案特别是控制平面节点之间通信时很多组件依赖稳定的主机名解析。写完 hosts 之后可以用ping命令在节点之间互相验证一下确保解析正常。时钟同步这块容易被忽略但特别重要。Kubernetes 组件之间的很多交互依赖时间戳比如证书校验、日志排序、etcd 的一致性协议。节点之间如果时间偏差超过一定阈值etcd 可能会报 leader 选举异常。生产环境一定要配置 NTP 或 chrony并且监控所有节点的时间偏差建议误差控制在 50 毫秒以内。2.2 内核模块、系统参数与 SwapKubernetes 的运行依赖两个内核模块overlay和br_netfilter。overlay是容器文件系统 OverlayFS 的基础br_netfilter让节点上的 iptables 规则能够处理桥接流量是 kube-proxy 正常工作、Pod 之间通信的关键。这两个模块在大多数现代内核里都已经内置但要确认它们被加载最简单的做法是写一个/etc/modules-load.d/k8s.conf文件然后重启或手动modprobe。系统参数里最重要的一组是cat EOF /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sysctl --systemnet.ipv4.ip_forward必须开启否则 Pod 无法访问集群外部网络。bridge-nf-call-iptables不开启的话集群内部通过 NodePort 或 ClusterIP 访问服务时会出现间歇性超时。这几个参数先写进 sysctl 配置文件再执行sysctl --system这样重启后配置依然保留。Swap 是生产环境安装时官方明确要求关闭的。Kubernetes 在 kubelet 层面默认不支持启用 swap 的节点kubeadm init的预检阶段会直接报错。关闭方式根据发行版不同有所差异Ubuntu 上通常是注释掉/etc/fstab里的 swap 行然后执行swapoff -a。这里有个细节如果只执行swapoff -a而不修改/etc/fstab重启后 swap 会重新挂载预检依然会失败所以要两步都做。内存充足的话也可以给 kubelet 配置允许 swap 的开关但生产环境我不推荐这么做关闭 swap 本身就是一种稳定性保障避免内存压力下进程被换出导致长延迟。2.3 防火墙与端口清单生产环境一般有防火墙安装前要么关闭防火墙要么放行 Kubernetes 需要的端口。出于安全考虑我不建议直接关闭防火墙而是精确放行端口。但我得承认很多内部生产环境为了省事直接关了防火墙然后在更上层的安全组层面做管控。这两种方式都可以关键是端口清单要理清楚。控制平面节点需要放行的端口组件端口说明kube-apiserver6443所有客户端访问入口etcd2379-2380etcd 客户端和 peer 通信kube-scheduler10259调度器健康检查和指标kube-controller-manager10257控制器健康检查和指标kubelet10250kubelet 的 API 端口工作节点最少需要放行 kubelet 的 10250 端口以及 NodePort 服务使用的 30000-32767 端口段。如果集群内使用了 metrics-server 或监控系统抓取指标还需要注意 kublet 的 10255 只读端口不过新版本默认已经关闭需要用配置显式开启。注意云厂商的安全组规则和节点上的 iptables 是两个层面的东西很多人改了安全组发现还是不通原因就是节点本机的防火墙没放行。两处都要确认不要只看一层。3. 容器运行时先把 containerd 搞定kubelet 自己不直接启动容器它通过 CRIContainer Runtime Interface调用容器运行时。早期大家用 Docker cri-dockerd 适配器现在生产环境的主流选择已经变成了 containerd。这一节先把运行时搞定因为 kubeadm、kubelet 装完之后第一个依赖就是它。3.1 为什么生产环境默认选 containerd 而不是 DockerDocker 在企业里普及度高很多人习惯用docker ps看容器但它作为 Kubernetes 的运行时中间多了一层 Docker Engine、dockerd、cri-dockerd链路更长资源占用更高而且 Docker 自带的 iptables 规则有时会和 kube-proxy 的规则互相干扰。containerd 本身就实现了 CRIkubelet 可以直接通过 CRI 协议和它通信少一层适配就少一个故障点。从 Kubernetes 1.24 开始kubelet 里那个内置的 dockershim 已经被移除Docker 仓库里的镜像依然可以用但运行时的底层代理方式变了。所以新集群的生产环境我基本都直接用 containerd。如果你公司内部已经有大量基于 Docker 的镜像和工具链也不是不能用 Docker就是需要额外装 cri-dockerd而且要把 Docker 的 cgroup 驱动和 kubelet 对齐复杂度明显上升。3.2 containerd 安装与配置要点containerd 的安装方式每个发行版略有差异但配置核心是一样的。以 Ubuntu 22.04 为例可以通过官方 apt 源直接安装。安装完成后先不要急着启动重要的是生成默认配置并调整关键参数。apt-get install -y containerd mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml生成的/etc/containerd/config.toml里有一个参数必须改SystemdCgroup。containerd 默认值是false意味着它使用 cgroupfs 作为 cgroup 驱动而 kubelet 默认期望使用 systemd 作为 cgroup 驱动。两边不一致的话kubelet 启动后会发现节点的 cgroup 驱动配置不匹配报错说failed to initialize kubelet。sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml systemctl daemon-reload systemctl restart containerd另一个需要留意的是 sandbox_image 参数也就是 Pod 的基础暂停容器镜像。默认配置里的镜像是registry.k8s.io/pause:3.x如果你的网络访问这个地址困难可以换成公司内部镜像仓库里的 pause 镜像再重启 containerd。这一步很多人在装完集群后遇到CrashLoopBackOff才想起来不如提前配好。3.3 运行时和 kubelet 的 cgroup 驱动对齐前面反复提到 cgroup 驱动这里稍微展开一下。cgroup 是 Linux 用来限制进程资源CPU、内存等的机制systemd 和 cgroupfs 是两种不同的管理方式。Kubernetes 官方推荐使用 systemd因为它和系统初始化进程配合更紧密生产环境资源紧张时不会出现两套 cgroup 管理逻辑互相打架的情况。检查一致性有个简单的办法分别执行cat /etc/containerd/config.toml | grep SystemdCgroup和cat /var/lib/kubelet/config.yaml看两边的值理想状态下都应该是 systemd。如果你打算用 kubeadm 初始化集群初始化的kubeadm-config.yaml里也要设置cgroupDriver: systemd这个后面我会在初始化部分再提到。4. 安装 kubeadm、kubelet 和 kubectl核心章节前面所有准备都是为了这一刻。kubeadm、kubelet、kubectl 这三个组件的安装逻辑其实是同一套流程配置软件源、安装指定版本、锁定版本、启动 kubelet 服务。下面按步骤拆解。4.1 配置 Kubernetes 官方软件源新版本的 Kubernetes 把安装包发布在独立的软件源里地址和旧版有所不同。以 Ubuntu/Debian 为例需要先安装一些基础工具然后导入 GPG 密钥并添加软件源apt-get update apt-get install -y apt-transport-https ca-certificates curl gpg curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo deb [signed-by/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ / | tee /etc/apt/sources.list.d/kubernetes.list apt-get update如果是 CentOS/RHEL 系软件源写法稍有不同cat EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://pkgs.k8s.io/core:/stable:/v1.28/rpm/ enabled1 gpgcheck1 gpgkeyhttps://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key EOF注意软件源路径里的v1.28是你选定的版本号这决定了这个源里能安装到哪些版本。如果在企业内网环境无法访问外网可以把这套软件源镜像到内网仓库里baseurl和 GPG 密钥地址改成内网地址即可。4.2 安装指定版本并锁定版本号软件源配好之后直接安装默认版本不一定是你想要的因为源里默认指向的是这个版本系列中最新的小版本。生产环境我强烈建议显式指定版本号安装然后锁定避免以后执行apt-get upgrade或者yum update时不小心把这三个组件升上去导致和集群里其他组件版本不匹配。Ubuntu 上的做法apt-get install -y kubelet1.28.2-* kubeadm1.28.2-* kubectl1.28.2-* apt-mark hold kubelet kubeadm kubectlCentOS/RHEL 上的做法yum install -y kubelet-1.28.2-* kubeadm-1.28.2-* kubectl-1.28.2-* yum install -y --enablerepokubernetes kubelet kubeadm kubectlapt-mark hold和yum versionlock的目的是一样的就是把这三个包标记为不自动升级。升级 Kubernetes 是一个需要计划的动作应该通过 kubeadm 的升级流程来执行而不是让系统包管理器在某个凌晨悄悄改掉你的二进制。安装完成后先验证一下kubeadm version kubelet --version kubectl version --client这三个命令的输出应该显示一致的版本号。如果kubelet --version返回的版本和其他两个不一样说明软件源或者版本锁定的操作有问题趁早解决不要等到集群初始化的时候才发现。4.3 启动占位配置先让 kubelet 服务能跑起来安装完 kubelet 后其实 service 文件已经生成只是很多人在这一步直接执行systemctl start kubelet发现服务起不来或者起来后反复重启。这不一定是你操作错了而是 kubelet 在没有集群配置的情况下本来就会启动失败。生产环境我习惯在这一步先给 kubelet 写一个占位配置让它在集群初始化前能稳定运行。编辑/etc/default/kubeletUbuntu或/etc/sysconfig/kubeletCentOS写入KUBELET_EXTRA_ARGS--cgroup-driversystemd然后systemctl daemon-reload systemctl enable kubelet systemctl restart kubelet执行systemctl status kubelet能看状态但此时大概率仍然是activating (auto-restart)循环这其实是正常的因为还没有/etc/kubernetes/kubelet.conf这个配置文件。真正让 kubelet 稳定运行要等kubeadm init或者kubeadm join完成之后。这里提前把服务 enable 起来的意义在于确保加入集群时 kubelet 能以正确的启动参数运行。KUBELET_EXTRA_ARGS里也可以顺便加上节点 IP 参数比如KUBELET_EXTRA_ARGS--cgroup-driversystemd --node-ip192.168.1.10如果你的节点有多块网卡--node-ip这个参数非常重要。我之前遇到过一个案例节点上有管理和业务两块网卡kubelet 默认选了第一块导致 Pod 之间跨节点通信全走错网络中间排查了很久。提前指定--node-ip可以避免这类问题。4.4 kubectl 的访问配置说明kubectl 是控制集群的命令行工具它本身不需要像 kubelet 那样常驻运行安装好即可。生产环境上 kubectl 一般装在管理机上不一定和集群节点放在一起。集群初始化完成后kubeadm 会在控制平面节点生成/etc/kubernetes/admin.conf这个文件就是 kubectl 连接集群的凭证。使用方式是mkdir -p $HOME/.kube cp /etc/kubernetes/admin.conf $HOME/.kube/config然后在管理机上执行kubectl get nodes就能看到集群节点状态。如果是远程管理机可以把 admin.conf 拷贝到本地通过 kube-apiserver 的负载均衡地址来访问注意生产环境不要直接把控制平面节点的 6443 端口暴露到公网。5. 初始化前的预检与高频报错排查安装完这三个组件不代表万事大吉。真正开始kubeadm init之前我建议先做一次预检把问题在初始化之前暴露出来省得初始化报错时还要现场翻日志。5.1 利用 kubeadm init 的预检机制kubeadm init在执行时本身就是一套预检流程它会检查系统参数、swap 状态、端口占用、运行时连接等一堆项目。如果你想在正式初始化前快速验证可以用--dry-run参数kubeadm init --configkubeadm-config.yaml --dry-run这个命令不会真正创建集群但会走一遍预检逻辑把所有不满足的条件一次性列出来。我每次初始化前都会跑一遍相当于给自己一个安心的机会。socket连接检查有时候会比较迷惑比如报错[ERROR CRI]: container runtime is not running: output: time... levelfatal msgfailed to connect to the containerd socket: connection refused这个信息说得很直接就是 containerd 没起来。此时先systemctl status containerd看看服务状态大概率是配置写错了或者重启后没daemon-reload。我遇到过一次是SystemdCgroup改完忘记重启 containerd结果预检一直报这个错。5.2 高频问题排查清单我把自己和身边同事在生产环境安装中踩过的坑整理成一个速查表这里面的问题都是真实出现过的报错或现象根本原因处理方式kubeadm init报 swap 未关闭只执行了swapoff -a没改/etc/fstab注释掉 swap 挂载行重启后swapon --show确认[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]内核参数没生效确认/etc/sysctl.d/k8s.conf已写入并sysctl --systemkubelet 反复重启日志报 cgroup driver 不匹配containerd 和 kubelet 的 cgroup 驱动不一致containerd 的SystemdCgroup设为 truekubelet 参数也配置为 systemdconnection refused连接 containerdcontainerd 服务未启动或配置解析失败journalctl -u containerd -n 50查看具体报错集群节点不可达hosts 文件没配全或主机名重复检查/etc/hosts确认节点名称唯一Pod 里域名解析失败节点 resolv.conf 被覆盖在 kubelet 配置里指定正确的resolvConf或调整 CoreDNS这里我想多说一句排查思路遇到 kubelet 的问题第一件事永远是看日志journalctl -u kubelet -f能滚动输出 kubelet 的实时日志比瞎猜有效得多。很多人一上来就改配置改来改去反而把问题搞复杂了。正确路径是先看日志定位再动配置最后验证。5.3 我实际踩过的坑和规避办法第一个坑是镜像拉取。国内网络环境下kubeadm init需要拉取一堆 gcr.io 镜像经常卡在ImagePullBackOff。现在 kubeadm 支持通过--image-repository指定镜像仓库也可以写成 kubeadm-config.yaml 里的imageRepository字段。生产环境建议在初始化前把需要的镜像列表列出来提前拉到各节点上或者配置好内网镜像仓库。第二个坑是 kubelet 的 Node IP 选择。这个问题前面提过多网卡的节点如果没指定--node-ipkubelet 会把默认路由关联的网卡 IP 注册为节点地址。如果这个 IP 不是集群通信网段的地址会直接导致kubectl get nodes显示NotReady因为 apiserver 无法通过这个地址和 kubelet 通信。规避方式就是在/etc/default/kubelet里配置好--node-ip。第三个坑是关于证书有效期。kubeadm 生成的证书默认有效期是一年生产环境一定要提前规划证书续期的自动化方案不要等证书过期了才发现。kubeadm certs renew可以手动更新但要配合kubeadm certs check-expiration定时检查。这部分虽然不属于安装环节但安装时就要把这个运维项纳入计划否则一年后再来处理手忙脚乱的还是你自己。第四个坑是 containerd 的镜像仓库配置。如果你的环境只允许访问内网仓库containerd 的config.toml里还需要配置 registry 的 endpoint否则 Pod 启动时拉镜像会一直超时。这个配置在安装阶段顺手做完后面创建业务 Pod 时会省很多事。6. 初始化动作与后续第一步验证安装和配置都完成之后可以正式初始化集群了。这里我给出一个最小可用的启动配置以及初始化之后必须做的第一轮验证。6.1 控制平面节点的初始化配置创建一个kubeadm-config.yaml内容如下apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.28.2 controlPlaneEndpoint: 192.168.1.10:6443 imageRepository: registry.k8s.io networking: podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 --- apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock kubeletExtraArgs: cgroupDriver: systemd然后执行kubeadm init --configkubeadm-config.yamlcontrolPlaneEndpoint建议填写负载均衡地址或第一个控制平面节点的 IP这样后续添加第二个控制平面节点时kubeadm 会自动向这个端点注册。podSubnet要与后续安装的网络插件保持一致比如我示例里写的是 10.244.0.0/16如果后面选 Calico要按 Calico 默认网段调整。初始化成功后会输出一个kubeadm join命令这个命令包含了加入集群的 token 和证书哈希一定要保存好。工作节点加入的时候需要用同样的命令如果 token 过期了可以用kubeadm token create --print-join-command重新生成。6.2 Pod 网络插件的安装kubeadm init完成后控制平面节点状态还是NotReady因为还没有安装 CNI 网络插件。这一步是必须的否则 CoreDNS 和后续的业务 Pod 都起不来。网络插件有很多选择Calico、Flannel、Cilium 是目前主流的几个。我个人生产环境多用 Calico因为它在性能、安全策略和网络策略支持上都比较全面。安装方式很简单用kubectl apply -f应用它的 manifest 文件。需要注意的依旧是版本兼容性Calico 的版本要支持你选择的 Kubernetes 版本安装前看一眼它的 release notes。安装完网络插件后再执行kubectl get nodes等一两分钟所有节点应该变成Ready。这个等待过程有个技巧同时用kubectl get pods -n kube-system -w观察系统组件的启动情况因为手动get pods看不到状态变化过程。6.3 验证集群的基础功能第一轮验证我建议做三件事。第一件是检查系统 Pod 是否全部 Running包括 CoreDNS、etcd、kube-apiserver 等第二件是创建一个测试 Deployment验证 Pod 能在工作节点上正常调度和运行第三件是验证 DNS 解析进入测试 Pod 内部解析一个 Service 名称确认集群内部域名解析链路是通的。我记得第一次搭集群时就是在这轮验证里发现 CoreDNS 一直 CrashLoopBackOff最后原因是网络插件安装顺序搞错了我先启动了 CoreDNS 再装网络插件导致 Pod 创建时 CNI 还没就绪。后来我就养成了一个习惯初始化完先装网络插件再等所有组件 Running最后才做功能验证顺序错了很容易让问题变得难以分辨。7. 最后分享几个生产环境的小习惯安装 kubeadm、kubelet、kubectl 这件事做一次可能只要半天但生产环境真正考验的是后续半年怎么运维。这节内容更像是我个人的经验沉淀不涉及复杂原理纯粹是实战中沉淀出来的习惯。第一所有节点的变更操作都要有记录。我在生产环境维护过的集群每次在节点上执行了什么命令、改了什么配置、为什么改都会记录下来。这个习惯在排查问题的时候价值巨大特别是集群出问题时你往往需要知道几天前甚至几个月前的一次配置变更到底改了什么。第二控制平面节点和工作节点的配置尽量用配置管理工具统一管理而不是每台机器手动登录去改。这里的差异点在于/etc/sysctl.d、/etc/modules-load.d、/etc/containerd/config.toml这些底层配置文件如果没有统一的版本管理机器数量一多就会慢慢出现漂移这是集群故障的温床。第三安装阶段的每一段配置都值得留一份备份。比如 containerd 的 config.toml、kubeadm-config.yaml、sysctl 配置这些问题排查时都会用到。我自己习惯把每个节点的配置放到一个目录里用 Git 管理起来后面升级或重建节点时可以直接对照。我记得有一次集群里一个工作节点的 kubelet 始终注册不上排查了半天最后发现那台机器的/etc/hosts缺了一条其他节点的解析记录。这种问题如果当初安装时有统一的配置清单可能两分钟就能定位到。生产环境的稳定性从来不是靠某一次完美安装而是靠后期持续的可维护性换来的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑