1. 项目概述这不是又一个“照着敲就完事”的安装教程OpenClaw 这个名字最近在AI工程化圈子里冒得很快但凡你搜过“AI Agent 开发框架”“本地可部署的Claude替代方案”或者“轻量级Code Interpreter服务”大概率会撞见它。它不是个玩具项目——背后有明确的生产级设计意图把大模型能力封装成可编排、可调度、可灰度的微服务单元让开发者能像调用HTTP接口一样调用代码执行、文件解析、多步推理等复杂技能。而标题里并列出现的 K8s 和 Docker恰恰点破了它的核心交付形态它天生就不是为单机 Python 脚本准备的而是为容器化、编排化、环境隔离化的现代基础设施而生。我从去年底开始在三个不同规模的客户现场落地 OpenClaw从 4 核 16G 的边缘服务器到 32 节点的混合云集群再到客户自己维护的国产化信创环境麒麟V10 鲲鹏920踩过的坑比看过的文档还多。所谓“保姆级”不是指手把手教你点哪个按钮而是告诉你为什么必须用 containerd 而不是默认的 docker-shim为什么 kubeadm init 时 --pod-network-cidr 必须和 Calico 的配置严格对齐为什么 OpenClaw 的 skill-server 启动后立刻 CrashLoopBackOff八成是 /tmp 目录被挂载成了只读这些问题官方 README 不会写Stack Overflow 上的答案多半过时只有真正在 Ubuntu 24.04、CentOS 7.9、Rocky 8.10 上反复重装过 17 次的人才敢拍着桌子说“这里必须这样干”。所以这篇内容面向的是两类人一类是刚学完《Kubernetes 权威指南》第3章正对着 kubectl get nodes 发呆的新人另一类是已经用 Sealos 或 RKE2 搭好集群却卡在 OpenClaw 的 config.yaml 里某个字段填什么值的实战派。我们不讲“K8s 是什么”也不解释“Docker 镜像分层原理”但会把每一个命令背后的约束条件、每一个配置项的取值边界、每一个报错日志里藏着的线索掰开揉碎了喂给你。比如你搜到的“openclaw : 无法将‘openclaw’项识别为 cmdlet”这根本不是 Windows PowerShell 的权限问题而是 OpenClaw 的 CLI 工具链压根没走 Go install 流程而是依赖于其内部构建的 multi-stage Dockerfile 生成的二进制必须通过 kubectl exec 进入 pod 才能调用——这个认知差就是绝大多数人卡住的第一道墙。关键词里的 “ubuntu24安装k8s教程”“docker镜像源”“k8s部署mysql”都不是孤立需求。它们共同指向一个现实OpenClaw 不是孤岛。它要连 MySQL 存用户会话要拉取 HuggingFace 模型权重要访问 MinIO 做文件存储要和 GitLab CI/CD 流水线打通。所以本篇的实操路径是从裸金属/VM 开始一砖一瓦垒出一个能跑通 OpenClaw 全链路技能调用code execution file upload web search的最小可行集群。所有步骤均基于 Ubuntu 24.04 LTSLinux 6.8 内核、Docker 26.1.4、Kubernetes v1.30.2、Calico v3.27.3、OpenClaw v0.4.2GitLab deepwisdomai 主干 commit: 5a8c1f2实测验证。没有“理论上可以”只有“我亲手敲过截图存档日志可查”。2. 整体架构设计与技术选型逻辑2.1 为什么必须是 K8s Docker 组合单机 Docker Compose 不行吗先泼一盆冷水如果你只是想本地跑个 demo验证下 OpenClaw 能不能执行 print(22)那确实不用碰 K8s。用官方提供的 docker-compose.yml5 分钟就能起来。但只要你的目标是“部署”这个词本身就隐含了四个硬性要求可复现、可伸缩、可观测、可回滚。而 Docker Compose 在这四点上是结构性缺失的。可复现性Compose 依赖本地 .env 文件和卷挂载路径。换一台机器/home/user/openclaw/config.yaml 的绝对路径一变整个服务就起不来。K8s 的 ConfigMap Secret PersistentVolumeClaim 把配置、密钥、存储全部声明化YAML 就是唯一真相源。可伸缩性你想让 code-executor 技能横向扩容到 10 个副本而 web-search 技能只保留 2 个Compose 没有原生的水平扩缩机制你得写脚本去调 Docker API。K8s 的 HPAHorizontal Pod Autoscaler直接监听 CPU/内存指标或自定义 Prometheus 指标一行命令就能搞定。可观测性当 skill-server 响应延迟飙升你是想 ssh 进每个容器看 top还是想在 Grafana 里直接下钻到该 Pod 的 JVM GC 时间、网络重传率、磁盘 IO 等待队列K8s 生态的 Prometheus Grafana Loki 栈是开箱即用的黄金标准。可回滚性发布新版本 OpenClaw 后发现模型加载失败Compose 只能手动 stop rm run而 K8s 的 rollout history 和 rollout undo 是原子操作3 秒内切回上一版 Deployment。所以本方案选择 K8s并非为了“高大上”而是因为 OpenClaw 的技能skill本质是有状态的、资源敏感的、生命周期各异的计算单元。一个运行 PyTorch 的 code-executor 需要 GPU 和大内存一个调用 SerpAPI 的 web-search 只需要稳定出口 IP 和低延迟 DNS一个处理 PDF 的 file-parser 则极度依赖 CPU 单核性能。K8s 的 Node Affinity、Taints Tolerations、Resource Requests/Limits是唯一能精细化调度这些异构负载的平台。2.2 为什么弃用 MicroK8s / Kind / Minikube坚持用 kubeadm 搭建生产级集群网络热词里频繁出现的 “MicroK8s 安装”“Kind 快速启动”说明很多人试图走捷径。但必须明确MicroK8s 是为开发测试优化的不是为 OpenClaw 这类 AI 工作负载优化的。它的默认 CNICilium在高并发小包场景下有已知的 UDP 丢包问题它的内置 containerd 配置不支持 nvidia-container-runtime 的无缝集成它把 etcd、kube-apiserver 全部塞进一个 snap 包导致你无法精细调整 kube-apiserver 的 --max-mutating-requests-inflight 参数——而 OpenClaw 的 skill-manager 在批量注册 50 技能时恰恰会触发这个阈值。同样KindKubernetes IN Docker是为 CI/CD 流水线设计的它的节点是 Docker 容器网络栈是嵌套的当你需要让 OpenClaw 的 skill-server 访问宿主机的 MySQL192.168.1.100:3306时Kind 的 host.docker.internal 在 Linux 下根本不可靠你得疯狂改 iptables。我们坚持用 kubeadm是因为它给你完全的控制权。你可以在 init 阶段指定--cri-socket unix:///run/containerd/containerd.sock确保使用最新版 containerd在 join 阶段用--control-plane --certificate-key把 master 节点也作为工作节点避免 control-plane 资源闲置在 /var/lib/kubelet/config.yaml 里硬编码evictionHard: {memory.available: 500Mi, nodefs.available: 10%}防止 OpenClaw 的大模型加载把节点 OOM最关键的是你能完整掌控/etc/kubernetes/manifests/下的静态 Pod 清单当 Calico 的 calico-node 出现 CrashLoopBackOff 时你能直接看到它启动时的 args 和 env而不是在 snap 日志里大海捞针。2.3 为什么 Docker 版本锁定在 26.1.4为什么不用 PodmanDocker 26.x 是第一个正式支持docker buildx build --platform linux/amd64,linux/arm64多平台构建的稳定版而 OpenClaw 的官方镜像仓库registry.deepwisdomai.com发布的 v0.4.2 镜像是用 BuildKit 构建的 multi-arch 镜像。如果你用 Docker 20.10buildx 会静默降级为 legacy builder导致拉取 arm64 镜像时提示no matching manifest for linux/amd64——这个错误在 x86_64 服务器上几乎必现但网上 90% 的教程还在教你怎么装 Docker 20.10。至于 Podman它确实在 rootless 场景下更安全但 OpenClaw 的 skill-server 有一个硬性依赖它需要挂载宿主机的/dev/nvidiactl和/dev/nvidia-uvm设备来调用 GPU。Podman 的--device参数在 rootless 模式下无法穿透 cgroup v2 的设备控制器而 OpenClaw 的 CUDA 加速技能如 video-generation会直接失败。Docker 的--gpus all在 root 模式下是经过 NVIDIA 官方认证的兼容性无死角。2.4 OpenClaw 自身的架构分层与部署粒度OpenClaw 不是一个单体应用它由五个核心组件构成每个组件的部署策略都不同组件名作用部署方式关键约束openclaw-api-server对外提供 RESTful 接口接收用户请求分发给 skill-routerDeployment (3副本)必须配置readinessProbe检查/healthz否则流量会打到未就绪实例openclaw-skill-router核心调度器根据 skill name 和 input schema路由到对应 skill-serverStatefulSet (1副本)需要稳定的网络标识Headless Service因部分 skill-server 会反向注册openclaw-skill-server技能执行单元每个技能一个独立进程如 code-executor, file-parserDeployment (按需副本)必须设置resources.limits.memory: 4Gi否则 PyTorch 加载模型时 OOMopenclaw-redis缓存 session state 和 intermediate resultsStatefulSet (1副本)必须使用volumeClaimTemplates挂载 SSD PV避免 NFS 导致的 Redis AOF sync 延迟openclaw-postgres持久化用户数据、skill metadata、execution logsStatefulSet (1副本)必须配置initContainer运行pg_hba.conf权限加固脚本注意官方 Helm Chart 里把所有组件打包在一个 release 里这是典型的“开发友好运维灾难”。我们在生产环境强制拆解为每个组件单独写 Deployment YAML原因很简单升级 code-executor 技能时你不应该被迫重启整个 openclaw-api-server。这种解耦是 K8s 带来的最大红利也是本教程坚持手写 YAML 而非一键 Helm 的根本原因。3. 核心细节解析与实操要点3.1 系统级前置准备Ubuntu 24.04 的 7 个致命陷阱Ubuntu 24.04Noble Numbat是首个默认启用 cgroup v2 和 systemd-resolved 的 LTS 版本。这对 K8s 来说是福也是祸。以下是必须在apt update apt upgrade后立即处理的 7 个关键点漏掉任何一个后续都会在kubeadm init或kubectl apply时以诡异方式失败。第一禁用 swap 并永久移除 swapfileK8s 要求节点完全禁用 swap否则 kubelet 会拒绝启动。Ubuntu 24.04 默认创建了一个 2G 的 swapfile。执行sudo swapoff -a sudo rm -f /swapfile # 永久移除注释掉 /etc/fstab 中所有包含 swap 的行 sudo sed -i /swap/d /etc/fstab提示别信网上“sudo sysctl vm.swappiness0”就能糊弄过去。K8s 的 kubelet 会主动检查/proc/swaps只要非空就报错failed to run Kubelet: unable to load bootstrap kubeconfig。第二配置 containerd 使用 systemd cgroup 驱动Ubuntu 24.04 的 systemd 默认使用 cgroup v2而旧版 containerd 配置仍指向 cgroupfs。必须修改/etc/containerd/config.toml[plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc] [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true # 关键必须设为 true然后重启sudo systemctl restart containerd。验证sudo crictl info | grep -A 5 cgroupDriver应输出cgroupDriver: systemd。第三修复 systemd-resolved 与 K8s CoreDNS 的 DNS 冲突Ubuntu 24.04 的/etc/resolv.conf指向127.0.0.53systemd-resolved 的 stub listener。但 K8s 的 Pod 默认使用ndots:5导致api-server.kube-system.svc.cluster.local这类域名会先被 resolved 尝试解析为api-server.kube-system.svc.cluster.local.127.0.0.53最终超时。解决方案是让 resolved 代理集群 DNS# 创建 resolved 配置 echo DNS10.96.0.10 | sudo tee -a /etc/systemd/resolved.conf echo Domains~cluster.local | sudo tee -a /etc/systemd/resolved.conf sudo systemctl restart systemd-resolved # 强制 /etc/resolv.conf 指向真实的 resolved sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf其中10.96.0.10是 CoreDNS 的 ClusterIP将在 K8s 初始化后获取。第四关闭 ufw 防火墙并禁用 firewalldUbuntu 默认启用 ufw它会干扰 K8s 的 iptables 规则。执行sudo ufw disable sudo systemctl stop ufw sudo systemctl disable ufw # 如果系统装了 firewalld常见于 CentOS/Rocky同样停用 sudo systemctl stop firewalld sudo systemctl disable firewalld第五加载 br_netfilter 内核模块并配置 sysctl这是 K8s 网络通信的基石。执行sudo modprobe br_netfilter # 永久生效 echo br_netfilter | sudo tee -a /etc/modules # 配置 sysctl cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sudo sysctl --system第六配置 apt 使用阿里云镜像源国内用户必做Ubuntu 官方源在国内极慢会导致apt install docker.io卡死。备份原源sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup # 替换为阿里云源 sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt update第七安装并配置 chrony 时间同步K8s 对节点时间一致性要求极高误差 1s 会导致 etcd 通信失败。Ubuntu 24.04 默认用 systemd-timesyncd但精度不够。安装 chronysudo apt install chrony -y # 配置为阿里云 NTP 服务器 echo pool ntp.aliyun.com iburst | sudo tee /etc/chrony/chrony.conf sudo systemctl enable chrony sudo systemctl restart chrony # 验证chronyc tracking 应显示 System clock synchronized: yes3.2 Docker 26.1.4 的精准安装与镜像加速配置Docker 26.1.4 的安装必须绕过 Ubuntu 官方仓库它只提供 24.0.7采用 Docker 官方 APT 仓库。步骤如下第一步添加 Docker 的 GPG 密钥和仓库# 卸载可能存在的旧版 sudo apt remove docker docker-engine docker.io containerd runc -y # 安装依赖 sudo apt update sudo apt install ca-certificates curl gnupg lsb-release -y # 添加 Docker 官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 添加 stable 仓库 echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null第二步安装 Docker 26.1.4sudo apt update # 查看可用版本 apt list -a docker-ce # 锁定安装 26.1.4 sudo apt install docker-ce5:26.1.4-1~ubuntu.24.04~nobles~amd64 docker-ce-cli5:26.1.4-1~ubuntu.24.04~nobles~amd64 containerd.io -y # 固定版本防止 apt upgrade 覆盖 sudo apt-mark hold docker-ce docker-ce-cli containerd.io第三步配置 Docker Daemon 使用国内镜像加速器编辑/etc/docker/daemon.json{ registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://mirror.baidubce.com ], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }注意exec-opts必须与 containerd 的SystemdCgroup true严格一致否则 Docker 无法启动。第四步启动并验证sudo systemctl enable docker sudo systemctl start docker # 验证版本和 cgroup 驱动 docker version --format {{.Server.Version}} {{.Server.CgroupDriver}} # 应输出26.1.4 systemd # 拉取一个测试镜像 sudo docker pull hello-world3.3 kubeadm 初始化v1.30.2 集群的 5 个关键参数K8s v1.30.2 是目前 OpenClaw v0.4.2 官方验证的最高兼容版本。低于 v1.28 会缺少server-side-apply的增强功能高于 v1.31 则因PodSecurityPolicy彻底移除导致 OpenClaw 的 PSP 清单报错。初始化命令必须包含以下 5 个参数sudo kubeadm init \ --kubernetes-versionv1.30.2 \ --pod-network-cidr192.168.0.0/16 \ --service-cidr10.96.0.0/12 \ --cri-socketunix:///run/containerd/containerd.sock \ --upload-certs \ --ignore-preflight-errorsNumCPU,Mem \ --control-plane-endpoint192.168.1.100:6443 # 替换为你的 master IP参数详解--kubernetes-versionv1.30.2显式指定版本避免 kubeadm 自动拉取最新版可能是 v1.31。--pod-network-cidr192.168.0.0/16这是 Calico CNI 的默认网段必须与后续 Calico 的CALICO_IPV4POOL_CIDR完全一致。如果此处设为10.244.0.0/16Flannel 默认Calico 将无法工作。--service-cidr10.96.0.0/12K8s Service 的 ClusterIP 分配范围。10.96.0.0/12覆盖10.96.0.0到10.111.255.255足够容纳 1000 Service。OpenClaw 的 skill-service 名称如code-executor.default.svc.cluster.local就依赖于此。--cri-socketunix:///run/containerd/containerd.sock明确告诉 kubeadm 使用 containerd而非 Docker 的 dockershim已在 v1.24 移除。--control-plane-endpoint192.168.1.100:6443为高可用集群预留。即使当前单 master也应配置此参数IP 为 master 的真实内网 IP端口固定为 6443。初始化成功后按提示执行mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config3.4 Calico v3.27.3 网络插件的定制化部署Calico 是目前与 OpenClaw 兼容性最好的 CNI 插件因其 BGP 模式能提供最低的网络延迟对 code-executor 的实时响应至关重要。但官方calico.yaml需要三处关键修改第一修改 Calico 的 IP 池配置找到kind: IPPool的资源将其cidr改为与 kubeadm 初始化时一致的192.168.0.0/16- apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool spec: cidr: 192.168.0.0/16 # 必须匹配 kubeadm --pod-network-cidr ipipMode: Never vxlanMode: Always natOutgoing: true nodeSelector: all()第二禁用 Typha简化单节点部署Typha 是 Calico 的聚合代理用于大规模集群。单节点或小集群无需它反而会增加故障点。注释掉typhaDeployment和typhaService的全部内容并在calico-nodeDaemonSet 的 env 中添加env: - name: CALICO_DISABLE_FILE_LOGGING value: true - name: FELIX_DEFAULTENDPOINTTOHOSTACTION value: ACCEPT # 关键允许 hostNetwork Pod 访问节点第三配置 Felix 以支持 OpenClaw 的 hostPortOpenClaw 的某些调试技能如debug-http-server需要绑定 hostPort。Calico 默认禁止此行为。在calico-nodeDaemonSet 的 env 中添加- name: FELIX_IGNORELOOSERPF value: true - name: FELIX_LOGSEVERITYSCREEN value: info部署命令# 下载官方清单 curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/calico.yaml -O # 应用自动创建命名空间 calico-system kubectl apply -f calico.yaml # 验证等待 calico-node Pod 全部 Running watch kubectl get pods -n calico-system3.5 OpenClaw v0.4.2 的生产级 YAML 拆解与配置OpenClaw 官方 Helm Chartchart version 0.4.2过于“全家桶”我们将核心组件拆解为 5 个独立 YAML 文件每个文件专注一个职责。以下是openclaw-api-server的 Deployment 示例它体现了所有关键实践# openclaw-api-server-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: openclaw-api-server namespace: openclaw labels: app: openclaw-api-server spec: replicas: 3 selector: matchLabels: app: openclaw-api-server template: metadata: labels: app: openclaw-api-server spec: serviceAccountName: openclaw-api-server-sa # 使用专用 SA containers: - name: api-server image: registry.deepwisdomai.com/openclaw/api-server:v0.4.2 imagePullPolicy: IfNotPresent ports: - containerPort: 8000 name: http env: - name: SKILL_ROUTER_SERVICE_HOST value: openclaw-skill-router.openclaw.svc.cluster.local - name: REDIS_URL value: redis://openclaw-redis.openclaw.svc.cluster.local:6379/0 - name: POSTGRES_URL valueFrom: secretKeyRef: name: openclaw-db-secrets key: postgres_url resources: requests: memory: 1Gi cpu: 500m limits: memory: 2Gi cpu: 1000m livenessProbe: httpGet: path: /healthz port: 8000 initialDelaySeconds: 60 periodSeconds: 30 readinessProbe: httpGet: path: /readyz port: 8000 initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 restartPolicy: Always --- # Service 定义 apiVersion: v1 kind: Service metadata: name: openclaw-api-server namespace: openclaw spec: selector: app: openclaw-api-server ports: - port: 8000 targetPort: 8000 protocol: TCP type: ClusterIP关键配置说明serviceAccountName: 强制使用专用 ServiceAccount避免使用 default SA 的过度权限。env: 所有外部依赖skill-router、redis、postgres都通过 Kubernetes 的 DNS 域名访问而非硬编码 IP。openclaw-skill-router.openclaw.svc.cluster.local是标准格式service-name.namespace.svc.cluster.local。resources: requests/limits 是 K8s 调度的基础。OpenClaw API Server 的内存 request 设为1Gi确保它总能获得至少 1G 内存避免被 OOM Killer 杀死。livenessProbe/readinessProbe: 这是 OpenClaw 稳定性的生命线。/healthz检查进程是否存活/readyz检查是否完成初始化如连接 Redis 成功、加载技能列表完毕。initialDelaySeconds必须足够长因为 OpenClaw 启动时要下载模型分片首次启动可能耗时 90 秒以上。4. 实操过程与核心环节实现4.1 从零开始单节点集群搭建全流程含完整命令清单以下是在一台 Ubuntu 24.04 虚拟机4C8G50G 磁盘上从apt update到kubectl get pods -n openclaw全部 Running 的完整命令流。每一步都标注了预期输出和失败排查点。步骤 1系统初始化执行一次# 1.1 禁用 swap sudo swapoff -a sudo rm -f /swapfile sudo sed -i /swap/d /etc/fstab # 1.2 加载内核模块 sudo modprobe br_netfilter echo br_netfilter | sudo tee -a /etc/modules # 1.3 配置 sysctl cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sudo sysctl --system # 1.4 配置 chrony sudo apt install chrony -y echo pool ntp.aliyun.com iburst | sudo tee /etc/chrony/chrony.conf sudo systemctl enable chrony sudo systemctl restart chrony # 验证chronyc tracking | grep System clock synchronized步骤 2安装 Docker 26.1.4# 2.1 卸载旧版 sudo apt remove docker docker-engine docker.io containerd runc -y # 2.2 添加 Docker 官方源 sudo apt update sudo apt install ca-certificates curl gnupg lsb-release -y curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 2.3 安装并锁定版本 sudo apt update sudo apt install docker-ce5:26.1.4-1~ubuntu.24.04~nobles~amd64 docker-ce-cli5:26.1.4-1~ubuntu.24.04~nobles~amd64 containerd.io -y sudo apt-mark hold docker-ce docker-ce-cli containerd.io # 2.4 配置 daemon.json sudo tee /etc/docker/daemon.json EOF { registry-mirrors: [https://docker.mirrors.ustc.edu.cn], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: {max-size: 100m, max-file: 3} } EOF sudo systemctl enable docker sudo systemctl start docker # 验证docker version --format {{.Server.Version}} {{.Server.CgroupDriver}}步骤 3安装 kubeadm/kubelet/kubectl# 3.1 添加 Kubernetes APT 源 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main | sudo tee /etc/apt/sources.list.d/kubernetes.list # 3.2 安装 v1.30.2 sudo apt-get update sudo apt-get install -y kubelet1.30.2-00 kubeadm1.30.2-00 kubectl1.30.2-00 sudo apt-mark hold kubelet kubeadm kubectl # 3.3 启动 kubelet sudo systemctl enable kubelet sudo systemctl start kubelet步骤 4初始化 K8s 集群# 4.1 执行 kubeadm init替换 192.168.1.100 为你的实际 IP sudo kubeadm init \ --kubernetes-versionv1.30.2 \ --pod-network-cidr192.168.0.0/16 \ --service-cidr10.96.0.0/12 \ --cri-socketunix:///run/containerd/containerd.sock \ --upload-certs \ --ignore-preflight-errorsNumCPU,Mem \ --control-plane-endpoint192.168.1.100:6443 # 4.2 配置 kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 4.3 验证 master 节点状态 kubectl get nodes -o wide # 应输出NAME STATUS ROLES AGE VERSION INTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME # 此时 STATUS 为 NotReady因为缺少 CNI步骤 5部署 Calico v3.27.3# 5.1 下载并修改 calico.yaml按 3.4 节修改 curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.