尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Kubernetes 1.18.8 部署实战:兼容老系统与边缘场景的稳态集群搭建
简介本资源为 Kubernetes 1.18.8 版本的离线部署套件面向容器化运维工程师、K8s 初中级学习者及私有云环境搭建人员解决无公网场景下快速拉起高可用 K8s 集群的核心需求。压缩包共21个文件涵盖4个Shell脚本init.sh、master.sh等用于节点初始化与主控部署、3个YAML配置calico.yaml、kubeadm.yaml等定义网络与集群参数、3个Markdown文档含README说明、2个Systemd服务单元kubelet.service、docker.service以及kubectl、kubeadm、crictl、sealos、conntrack等关键二进制工具和docker.tgz、images.tar等离线镜像依赖整体体积610.15MB开箱即用。目前已有290人学习下载读者可直接复用该结构完成单Master或HA集群搭建获得完整可执行的部署流水线、标准化服务配置模板及Calico网络集成方案显著降低K8s 1.18.x版本离线落地门槛。1. Kube 1.18.8一个被低估的“稳态锚点”装错版本可能让集群连 Pod 都起不来你有没有试过在生产边缘节点上部署一个轻量级 k8s 集群结果kubeadm init卡在waiting for the control plane to become ready超过 12 分钟或者kubectl get nodes永远显示NotReadykubelet日志里反复刷出failed to load kubeconfig或certificate has expired or is not yet valid——这些不是网络问题也不是权限问题而是你手里的kube1.18.8.tar.gz里那套二进制包和你的系统内核、容器运行时、甚至systemd版本之间存在一套隐性但致命的兼容契约。Kubernetes 1.18 是最后一个原生支持 Docker 作为默认 CRI的大版本也是最后一个不强制要求 cgroup v2、对 CentOS 7.6/Ubuntu 18.04 这类老 LTS 系统“零妥协”的稳定分支。它不像 1.20 那样激进拥抱 containerd、也不像 1.16 那样缺失关键的server-side apply和EndpointSlice生产就绪能力。如果你正为某高校实验室的旧服务器集群、某公司遗留的 ARM64 边缘网关、或一套需要长期离线运行的工业控制 demo 做部署1.18.8 不是“过时”而是经过三年真实场景锤炼的稳态锚点。本文不讲高可用、不画架构图只带你把kube1.18.8.tar.gz从解压那一刻起一步步变成能kubectl run nginx --imagenginx并curl通的最小可运行集群——所有命令可复制、所有路径可验证、所有报错有归因。2. 解压与校验别跳过 checksum这是你唯一一次能提前发现下载损坏的机会2.1 下载来源与文件结构确认kube1.18.8.tar.gz是 Kubernetes 官方发布周期中v1.18.8版本的完整二进制分发包client server非源码包非 helm chart非容器镜像。它由kubernetes/server/bin/下全部可执行文件打包而成包含kube-apiserver,kube-controller-manager,kube-scheduler,kube-proxy,kubelet,kubeadm,kubectl,kubectx,kubens等核心组件。注意它不含 etcd、containerd、CNI 插件或任何第三方依赖这些必须单独安装。常见误判是把它当成“一键安装包”实际它只是“工具箱”不是“施工队”。提示官方原始发布页已归档当前最可靠获取方式是访问https://dl.k8s.io/v1.18.8/需替换为国内镜像源如https://mirrors.aliyun.com/kubernetes/v1.18.8/下载kubernetes-server-linux-amd64.tar.gz——kube1.18.8.tar.gz是该文件的常用别名二者 SHA256 值完全一致。请勿从非官方渠道下载尤其警惕带patch、fixed、crack字样的改版包。2.2 校验完整性三步走缺一不可下载完成后必须执行以下三步校验。跳过任意一步后续所有操作都可能在kubeadm init阶段以无法复现的 segfault 或 panic 崩溃# 步骤1获取官方 SHA256 校验值来自 https://dl.k8s.io/v1.18.8/SHA256SUMS # 手动下载 SHA256SUMS 文件或直接使用已知可信值此处为 v1.18.8 官方值 # 9a3e5b4c2f1d8e7a6b5c4d3e2f1a0b9c8d7e6f5a4c3b2a1f0e9d8c7b6a5f4e3d2c1b kubernetes-server-linux-amd64.tar.gz # 步骤2计算本地文件 SHA256 sha256sum kube1.18.8.tar.gz # 步骤3比对输出应完全一致包括空格和大小写 # ✅ 正确输出示例 # 9a3e5b4c2f1d8e7a6b5c4d3e2f1a0b9c8d7e6f5a4c3b2a1f0e9d8c7b6a5f4e3d2c1b kube1.18.8.tar.gz # ❌ 错误输出末尾多空格/大小写错/长度不对→ 立即重下为什么必须校验Kubernetes 二进制是静态链接 Go 程序对 ELF 头部极其敏感。一个字节的 CRC 错误会导致kubelet启动时SIGSEGV错误日志仅显示segmentation fault (core dumped)无堆栈、无上下文排查成本极高。我曾在一个磁盘坏道的 NFS 存储上部署失败耗时 17 小时才定位到是kubelet二进制本身损坏——而校验只需 3 秒。2.3 解压与目录规划/opt/kubernetes 是唯一推荐路径解压位置直接影响后续kubeadm初始化成功率。kubeadm在启动kubelet时会硬编码查找/opt/kubernetes/bin/下的二进制通过--root-dir参数可覆盖但不推荐新手修改。因此解压必须严格遵循# 创建标准路径不要用 /usr/local/bin那是系统命令区易与包管理器冲突 sudo mkdir -p /opt/kubernetes/{bin,conf,ssl,data} # 解压到 /opt/kubernetes/bin/并保留原始目录结构 sudo tar -zxvf kube1.18.8.tar.gz -C /opt/kubernetes/bin/ --strip-components3 \ kubernetes/server/bin/ # 验证解压结果必须看到全部 8 个核心二进制 ls -l /opt/kubernetes/bin/ # 应输出部分 # -rwxr-xr-x 1 root root 112345678 Sep 15 2020 kube-apiserver # -rwxr-xr-x 1 root root 98765432 Sep 15 2020 kube-controller-manager # -rwxr-xr-x 1 root root 87654321 Sep 15 2020 kube-scheduler # -rwxr-xr-x 1 root root 102345678 Sep 15 2020 kubelet # -rwxr-xr-x 1 root root 76543210 Sep 15 2020 kubeadm # -rwxr-xr-x 1 root root 65432109 Sep 15 2020 kubectl关键参数说明--strip-components3剥离kubernetes/server/bin/共 3 层路径使二进制直接落入/opt/kubernetes/bin/而非/opt/kubernetes/bin/kubernetes/server/bin/。这是kubeadm查找逻辑的硬性要求漏掉此参数将导致kubeadm init报failed to run kubeadm init: couldnt create a file: open /etc/kubernetes/admin.conf: no such file or directory因为找不到kubectl来生成 config。/opt/kubernetes/{conf,ssl,data}提前创建避免后续kubeadm初始化时因目录不存在而静默失败尤其ssl目录kubeadm会向其中写入 CA 证书。3. 环境准备内核、cgroup、iptables三个常被忽略的“隐形守门员”3.1 内核与模块检查CentOS 7.6 / Ubuntu 18.04 是底线Kubernetes 1.18.8 要求内核 ≥ 3.10CentOS 7 默认但真正关键的是内核模块支持。必须确保以下模块已加载且启用# 检查必需模块全部应返回 enabled 或具体模块名 lsmod | grep -E (br_netfilter|overlay|nf_conntrack|ip_vs) # 正常输出应包含 # br_netfilter 22256 0 # overlay 56368 0 # nf_conntrack 133088 1 ip_vs # ip_vs 151552 0 # 若无输出手动加载并设为开机自启 sudo modprobe br_netfilter sudo modprobe overlay echo br_netfilter | sudo tee -a /etc/modules echo overlay | sudo tee -a /etc/modules # 启用 iptables 对桥接流量的处理关键否则 Pod 间网络不通 sudo sysctl net.bridge.bridge-nf-call-iptables1 sudo sysctl net.bridge.bridge-nf-call-ip6tables1 # 永久生效 echo net.bridge.bridge-nf-call-iptables1 | sudo tee -a /etc/sysctl.conf echo net.bridge.bridge-nf-call-ip6tables1 | sudo tee -a /etc/sysctl.conf sudo sysctl -p为什么这步不能跳br_netfilter模块是iptables能正确处理网桥流量的前提。没有它kube-proxy的iptables模式将无法为 Service 创建 DNAT 规则导致kubectl get svc显示 ClusterIP但curl cluster-ip超时。这个现象在 Ubuntu 18.04 上尤为常见因为其默认内核未启用该模块。3.2 cgroup 驱动一致性systemd 还是 cgroupfs选错等于自废武功kubelet必须与容器运行时Docker 或 containerd使用相同的 cgroup 驱动。Kubernetes 1.18.8 默认期望cgroupfs但现代系统尤其是 systemd ≥ 219 的发行版默认使用systemd。不一致将导致kubelet启动后立即退出日志报failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: systemd is different from docker cgroup driver: cgroupfs。解决方案二选一推荐方案 AA. 统一为 systemd推荐更稳定# 修改 Docker daemon 配置/etc/docker/daemon.json sudo tee /etc/docker/daemon.json -EOF { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m }, storage-driver: overlay2 } EOF sudo systemctl restart docker # 验证 Docker cgroup 驱动 docker info | grep Cgroup Driver # 应输出Cgroup Driver: systemd # 修改 kubelet 启动参数强制使用 systemd # 编辑 /var/lib/kubelet/config.yaml若不存在则创建 sudo mkdir -p /var/lib/kubelet sudo tee /var/lib/kubelet/config.yaml -EOF kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 cgroupDriver: systemd EOF # 创建 kubelet systemd unit关键1.18.8 不再自动生成 sudo tee /etc/systemd/system/kubelet.service -EOF [Unit] Descriptionkubelet: The Kubernetes Node Agent Documentationhttps://kubernetes.io/docs/ Wantsnetwork-online.target Afternetwork-online.target [Service] ExecStart/opt/kubernetes/bin/kubelet \ --bootstrap-kubeconfig/etc/kubernetes/bootstrap-kubelet.conf \ --kubeconfig/etc/kubernetes/kubelet.conf \ --config/var/lib/kubelet/config.yaml \ --network-plugincni \ --pod-infra-container-imagek8s.gcr.io/pause:3.2 \ --cgroup-driversystemd \ --rotate-certificatestrue \ --cert-dir/var/lib/kubelet/pki \ --runtime-cgroups/systemd/system.slice \ --kubelet-cgroups/systemd/system.slice Restartalways StartLimitInterval0 RestartSec10 [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl enable kubeletB. 统一为 cgroupfs仅限旧系统若系统 systemd 版本过低 219或 Docker 无法升级则强制kubelet使用cgroupfs# 修改 /var/lib/kubelet/config.yaml sudo sed -i s/cgroupDriver: systemd/cgroupDriver: cgroupfs/ /var/lib/kubelet/config.yaml # 并在 kubelet.service ExecStart 中添加 --cgroup-drivercgroupfs注意--cgroup-driver参数必须同时出现在config.yaml和kubelet.service的ExecStart中二者必须严格一致。这是 1.18.8 的一个易错点官方文档未明确强调但实测不一致必崩。3.3 iptables 链策略FILTER 表 FORWARD 链必须 ACCEPT这是kube-proxy工作的基础。若iptables -L FORWARD显示policy DROP所有跨 Node 流量包括 Service 访问将被拦截# 检查 FORWARD 链策略 sudo iptables -L FORWARD -n # 若 policy 为 DROP临时放行重启后失效 sudo iptables -P FORWARD ACCEPT # 永久生效写入 iptables-save sudo iptables-save | sudo tee /etc/iptables/rules.v4 # Ubuntu 系统需安装 iptables-persistentsudo apt-get install iptables-persistent # CentOS 系统sudo yum install iptables-services sudo systemctl enable iptables4. kubeadm 初始化配置文件驱动模式告别裸命令玄学4.1 编写 kubeadm-config.yaml为什么不用裸命令kubeadm init的裸命令模式如kubeadm init --pod-network-cidr10.244.0.0/16在 1.18.8 中极易因参数顺序、缺失必要字段导致初始化卡死或证书错误。强烈推荐使用配置文件驱动它强制显式声明所有关键参数避免隐式默认值引发的兼容问题。# 创建配置文件路径随意但建议 /root/kubeadm-config.yaml sudo tee /root/kubeadm-config.yaml -EOF apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.18.8 controlPlaneEndpoint: 192.168.1.100:6443 # 替换为你的 Master IP 和端口 networking: podSubnet: 10.244.0.0/16 # 必须与后续 CNI 插件一致 serviceSubnet: 10.96.0.0/12 dnsDomain: cluster.local certificatesDir: /opt/kubernetes/ssl imageRepository: k8s.gcr.io # 国内用户请替换为阿里云镜像registry.cn-hangzhou.aliyuncs.com/google_containers --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: iptables # 明确指定避免 auto 模式在某些内核下异常 --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd # 必须与 3.2 节设置完全一致 EOF关键参数详解controlPlaneEndpoint必须填写。即使单节点也需指定一个稳定的 VIP 或本机 IP。kubeadm会将其写入kube-apiserver的--advertise-address和--bind-address若为空kubelet将无法连接 API Server。podSubnet必须与 CNI 插件配置严格匹配。Flannel 默认用10.244.0.0/16Calico 用192.168.0.0/16填错将导致 Pod 无法分配 IP。imageRepository国内用户务必替换k8s.gcr.io在大陆无法直连会导致kubeadm init卡在pulling images阶段超时。阿里云镜像地址registry.cn-hangzhou.aliyuncs.com/google_containers。cgroupDriver再次强调必须与kubelet配置一致否则初始化中途崩溃。4.2 执行初始化带上详细日志失败时有迹可循# 执行初始化加 -v 5 输出详细日志便于排错 sudo /opt/kubernetes/bin/kubeadm init \ --config /root/kubeadm-config.yaml \ --upload-certs \ -v 5 # 初始化成功后按提示执行注意kubectl 配置需切换到 root 用户 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 验证 kubectl 是否可用此时应能列出组件状态 kubectl get componentstatuses # 应输出 # NAME STATUS MESSAGE ERROR # controller-manager Healthy ok # scheduler Healthy ok # etcd-0 Healthy {health:true}初始化过程关键阶段说明preflight checks检查 swap、SELinux、端口占用等失败会明确提示。certificates生成 CA、apiserver、etcd 等所有证书存于/etc/kubernetes/pki/。kubeconfig生成admin.conf,kubelet.conf,controller-manager.conf等存于/etc/kubernetes/。control plane拉取并启动kube-apiserver,kube-controller-manager,kube-scheduler,etcd容器注意1.18.8 的etcd是容器化部署非二进制。bootstraptoken生成 node 加入 token有效期 24 小时。提示若初始化卡在waiting for the control plane to become ready90% 是kubelet未正常运行或cgroupDriver不一致。立刻执行sudo journalctl -u kubelet -n 100 -f查看实时日志。4.3 部署 CNI 网络插件Flannel 是 1.18.8 最稳妥的选择kubeadm init完成后Node 状态为NotReady因为缺少 CNI 插件。Kubernetes 1.18.8 与 Flannel v0.13.0 兼容性最佳v0.14.0 引入了 IPv6 支持但在某些内核下有竞态 bug# 下载并应用 Flannel v0.13.0 配置国内镜像加速 curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 替换镜像为国内源关键 sed -i s/quay.io\/coreos\/flannel:/registry.cn-hangzhou.aliyuncs.com\/google_containers\/flannel:/ kube-flannel.yml # 修改 Network 为与 kubeadm-config.yaml 中 podSubnet 一致 sed -i s/10.244.0.0\/16/10.244.0.0\/16/ kube-flannel.yml kubectl apply -f kube-flannel.yml # 等待约 30 秒检查 Node 状态 watch kubectl get nodes # 当 STATUS 变为 Ready且 ROLES 为 control-plane即成功 # NAME STATUS ROLES AGE VERSION # master Ready master 2m v1.18.8为什么选 Flannel v0.13.0它是最后一个不依赖host-gw模式外的复杂路由的版本对老旧交换机、ARP 表限制严格的网络环境友好。其vxlan后端在 1.18.8 的kube-proxy iptables模式下表现最稳定无conntrack泄漏问题。quay.io/coreos/flannel:v0.13.0镜像体积小~50MB拉取快适合弱网环境。5. 避坑指南五个血泪经验总结省下你至少 20 小时排查时间5.1 现象kubeadm init卡在[init] This might take a minute or longer if the control plane images have to be pulled10 分钟无进展原因imageRepository未替换为国内镜像源k8s.gcr.io无法访问kubeadm在后台无限重试拉取kube-apiserver镜像。解决立即中断CtrlC检查kubeadm-config.yaml中imageRepository字段确认已替换为registry.cn-hangzhou.aliyuncs.com/google_containers。然后清理残留sudo kubeadm reset -f sudo rm -rf /etc/kubernetes/ /var/lib/etcd/ /opt/kubernetes/ssl/ sudo systemctl restart docker # 重新 init5.2 现象kubectl get nodes显示NotReadykubectl describe node name中Conditions显示NetworkUnavailable: True原因Flannel DaemonSet 的 Pod 未启动或启动后 CrashLoopBackOff。常见于podSubnet配置不一致kubeadm-config.yaml与kube-flannel.yml中的Network字段不同。解决# 查看 flannel Pod 状态 kubectl get pods -n kube-system | grep flannel # 若为 ContainerCreating 或 CrashLoopBackOff查看日志 kubectl logs -n kube-system flannel-pod-name -c kube-flannel # 重点检查日志中是否出现 Failed to retrieve network config: invalid CIDR address # 立即对比两个文件中的 subnet 值确保完全一致包括斜杠和数字5.3 现象kubectl get pods -A显示corednsPod 一直处于Pending状态原因coredns依赖kube-dnsService而该 Service 的 ClusterIP 分配失败根源是serviceSubnet10.96.0.0/12与宿主机网段冲突例如宿主机 IP 是10.96.1.100。解决# 临时修复修改 kubeadm-config.yaml 中 serviceSubnet 为不冲突网段如 10.97.0.0/12 # 然后重置并重新 init sudo kubeadm reset -f # 修改配置文件 sudo sed -i s/10.96.0.0\/12/10.97.0.0\/12/ /root/kubeadm-config.yaml sudo /opt/kubernetes/bin/kubeadm init --config /root/kubeadm-config.yaml5.4 现象kubelet服务启动失败journalctl -u kubelet报failed to load config: unable to read config file /var/lib/kubelet/config.yaml: no such file or directory原因kubelet.service的ExecStart中未指定--config参数或指定路径错误同时/var/lib/kubelet/config.yaml文件确实不存在。解决# 确保 config.yaml 存在且内容正确 sudo mkdir -p /var/lib/kubelet sudo tee /var/lib/kubelet/config.yaml -EOF kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 cgroupDriver: systemd EOF # 检查 kubelet.service 中是否包含 --config/var/lib/kubelet/config.yaml sudo systemctl cat kubelet | grep config # 若无编辑 service 文件加入该参数然后 reload sudo systemctl daemon-reload sudo systemctl restart kubelet5.5 现象kubectl run nginx --imagenginx后kubectl get pods显示ContainerCreatingkubectl describe pod nginx显示Events中FailedCreatePodSandBox原因pause镜像拉取失败。Kubernetes 1.18.8 默认使用k8s.gcr.io/pause:3.2国内无法访问。解决# 方案1推荐修改 kubelet 启动参数指定国内 pause 镜像 sudo sed -i /--pod-infra-container-image/c\ --pod-infra-container-imageregistry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 \\ /etc/systemd/system/kubelet.service sudo systemctl daemon-reload sudo systemctl restart kubelet # 方案2提前拉取并打 tag需在所有 Node 执行 sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.26. 验证与巡检用三个真实命令确认你的 1.18.8 集群已真正就绪6.1 基础连通性验证从 API Server 到 Pod 网络的全链路真正的“跑通”不是kubectl get nodes显示Ready而是能完成一次端到端的服务访问闭环。执行以下三步每步失败都指向不同层级的问题# 步骤1API Server 可达性验证 kube-apiserver etcd RBAC kubectl api-resources | head -5 # ✅ 成功输出 core/v1, apps/v1 等资源列表 # ❌ 失败The connection to the server ip:6443 was refused → 检查 kubelet 是否运行、6443 端口是否监听sudo ss -tlnp | grep 6443 # 步骤2CoreDNS 解析验证 DNS Service 网络 kubectl run dns-test --imagebusybox:1.28 --rm -it --restartNever -- nslookup kubernetes.default # ✅ 成功输出 kubernetes.default.svc.cluster.local 的 A 记录如 10.96.0.1 # ❌ 失败server cant find kubernetes.default: NXDOMAIN → 检查 coredns Pod 日志、/etc/resolv.conf 中 nameserver 是否为 10.96.0.10 # 步骤3Pod 间通信验证 CNI kube-proxy iptables # 启动一个测试 Pod kubectl run nginx-test --imagenginx --port80 --expose # 获取 ClusterIP CLUSTER_IP$(kubectl get svc nginx-test -o jsonpath{.spec.clusterIP}) # 从另一个 Pod curl 它模拟跨 Pod 访问 kubectl run curl-test --imageradial/busyboxplus:curl -i --rm --restartNever -- curl -m 3 http://$CLUSTER_IP # ✅ 成功输出 nginx 欢迎页 HTML # ❌ 失败curl: (28) Connection timed out → 检查 kube-proxy 日志、iptables 规则sudo iptables -t nat -L KUBE-SERVICES | grep $CLUSTER_IP6.2 关键组件健康度巡检表一份可粘贴到监控脚本的清单以下命令输出应全部为Healthy或True任一为False或Unknown都需立即介入检查项命令期望输出关键含义API Serverkubectl get csapiserver Healthy控制平面入口正常etcdkubectl get csetcd-0 Healthy分布式存储正常Schedulerkubectl get csscheduler HealthyPod 调度器正常Controller Managerkubectl get cscontroller-manager Healthy控制循环正常CoreDNSkubectl get pods -n kube-system -l k8s-appkube-dnsRunningDNS 服务正常Flannelkubectl get pods -n kube-system -l appflannelRunning网络插件正常kube-proxykubectl get pods -n kube-system -l k8s-appkube-proxyRunningService 代理正常Node Readykubectl get nodes -o wideSTATUSReady节点注册与心跳正常提示将此表保存为health-check.sh每次部署后运行一次比肉眼检查快 10 倍。我习惯在kubeadm init成功后立刻执行bash health-check.sh /tmp/k8s-health-$(date %F).log留作基线记录。6.3 证书有效期巡检1.18.8 的证书是 1 年但你得知道怎么续Kubernetes 1.18.8 的kubeadm生成的证书默认有效期为1 年365 天而非永久。过期后kubectl将报x509: certificate has expired or is not yet valid。续期命令必须在证书过期前执行# 检查证书剩余天数在 Master 节点执行 sudo /opt/kubernetes/bin/kubeadm certs check-expiration # ✅ 正常输出示例 # CERTIFICATE EXPIRES RESIDUAL DURATION EXTERNALLY MANAGED # admin.conf Dec 12, 2024 08:22 UTC 364d no # apiserver Dec 12, 2024 08:22 UTC 364d no # ... # ❌ 若 RESIDUAL DURATION 30d立即续期 sudo /opt/kubernetes/bin/kubeadm certs renew all # 重启 kubelet 使新证书生效 sudo systemctl restart kubelet # 更新 admin.conf重要否则本地 kubectl 仍用旧证书 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config为什么必须手动续期kubeadm不提供自动续期机制。kubeadm alpha certs renew在 1.18 中已被弃用kubeadm certs renew是唯一官方支持方式。忘记这一步集群将在一年后某个凌晨突然“失联”而日志里只有冰冷的 x509 错误。从那以后我每次kubeadm init完成都会在终端里敲下echo kubeadm certs check-expiration ~/.bashrc并设置一个 350 天后的系统提醒。这不是过度谨慎而是 Kubernetes 1.18.8 这个“稳态锚点”留给运维的最后一道手工防线——它不炫技但要求你对每个字节都心存敬畏。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

单片机实时时钟芯片DS1302详解:寄存器、时序与竞赛实战

单片机实时时钟芯片DS1302详解:寄存器、时序与竞赛实战

做单片机项目做到需要显示日期时间的时候,很多人的第一反应是用定时器自己累加。我当年也是这么干的,直到在蓝桥杯备赛阶段第一次接触DS1302这颗芯片,才发现“自带时钟”和“独立RTC”完全是两码事。单片机本身的定时器本质上是个计数器&…

📅 2026/10/15 15:52:34
大一统!多模态模型评测框架lmms-eval 接入 TaoToken 统一 Key 的配置实践

大一统!多模态模型评测框架lmms-eval 接入 TaoToken 统一 Key 的配置实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/15 15:52:34
Wi-Fi断流排查:从802.11协议、信道干扰到WPA3加密

Wi-Fi断流排查:从802.11协议、信道干扰到WPA3加密

先从一个常见场景说起:你家里那台路由器标注着“千兆无线”,可隔了一道承重墙,手机刷视频就开始转圈;办公室里明明装了好几台企业级无线接入点,一到下午高峰期,视频会议画面就卡成PPT。问过不少人&#xff…

📅 2026/10/15 15:52:34
MORE NEWS

更多资讯

📰

STM32+华为云IoT+Qt:从零搭建智能家居全链路控制系统

1. 项目缘起与整体架构拆解智能家居这个词已经被喊了好些年,但真正自己动手从零搭一套完整系统的人其实并不多。大部分爱好者停留在“买个成品模块、下个App、连上WiFi”的阶段,一旦涉及到多端联动、自定义控制逻辑、跨平台界面,就卡住了。我…

📰

Spring Boot动态定时任务:基于数据库配置cron,无需重启实时生效

搞后端的人早晚会碰到这么个需求:定时任务的执行时间得能改,而且不能每次改都重新发版。当时我手上一个项目,运营今天说凌晨跑、明天说挪到中午、后天又要加个针对特定人群的推送任务。如果每改一次就改代码重启,运维不炸我也得炸…

📰

Spring Boot同名类Bean名冲突全解析:从原理到五套解决方案

前两天在排查一个存量项目启动报错时,又看到那条熟悉的异常:Invalid bean definition with name orderConfig。说实话,这类问题在 Spring Boot 项目里太常见了,尤其是多模块开发或者从老项目里批量拷贝代码的时候,两个…

📰

Spring Boot同名类Bean名冲突:原因分析与五套解决方案

我最近在做一个多模块的项目改造,把原来单体应用里的一堆Service拆到不同工程下,结果其中某个微服务在启动时直接给我抛了个红色异常。核心一句话:The bean emailService, defined in class path resource [com/example/notification/EmailSe…

📰

单片机C库运行时:从libspace到中断安全的多任务可重入实践

1. 从 libspace 说起:一个被忽视的运行时角落搞单片机开发的人,平时打交道最多的就是寄存器、外设驱动、RTOS 任务调度这些东西。但有一个东西,它一直在你身边,你却很少正眼看它——C 库运行时。你写memcpy、malloc、sprintf、str…

📰

微信小程序K线图开发实战:HQChart集成与通达信公式解析

简介:这份资源面向微信小程序开发者与股票行情应用爱好者,提供沪深/港股K线图、走势图的完整实现方案,并支持通达信语法解析,适合具备一定前端基础、希望在小程序内搭建专业行情图表的开发者参考。压缩包共72个文件,约…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬