news 2026/9/28 8:19:54

Kylin V10 ARM64 部署 K8S 1.26:external etcd + containerd 直连方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kylin V10 ARM64 部署 K8S 1.26:external etcd + containerd 直连方案

简介:本资源是一套面向国产化信创环境的Kubernetes高可用部署实践合集,专为ARM架构下Kylin V10操作系统用户设计,解决在无内嵌etcd、依赖外部etcd集群场景中使用containerd容器运行时部署K8s 1.26.15(一主多从)的核心难题。资源共41个文件,涵盖16个预编译二进制压缩包(含kubeadm/kubelet/kubectl及各组件v1.26.15镜像)、11个适配ARM的RPM依赖包(如libseccomp、ipvsadm、sysstat等)、4个关键Shell脚本(load_images.sh/get_images.sh等用于镜像加载与环境准备)、3个YAML配置模板(kubeadm-config.yaml、calico.yaml等),以及etcd SSL证书、CNI插件、pause基础镜像等完整交付物,总大小645.74MB。已有130人学习下载,提供开箱即用的国产化K8s部署基线:包含全链路ARM适配验证、external etcd集成方案、containerd替代Docker的配置范式,以及Calico网络插件与CoreDNS服务的定制化部署逻辑,显著降低信创环境下K8s集群搭建门槛与排错成本。

1. 为什么在 Kylin V10 ARM64 上绕过 systemd+docker、直连 external etcd + containerd 部署 K8S 1.26.15 是当前最稳的生产路径?

你手头有一台国产 ARM 服务器,预装银河麒麟 V10(SP1/SP2,ARM64 架构),内核版本 4.19.90-24.2.v2101.ky10.aarch64 或更新;你不想碰 Docker Engine 的兼容性玄学,也不愿被 systemd-journald 日志吞掉关键错误;你更清楚——K8S 1.26 已彻底移除 dockershim,而 Kylin V10 官方源里 containerd 1.6.x 默认不带cgroupv2+systemd启动器支持,直接apt install containerd就会卡在 kubelet 启动时failed to load cni config;此时若再强行用内置 etcd,不仅单点故障风险高,还会因 Kylin 内核对etcdWAL fsync 的 ARM 适配问题导致集群反复脑裂。真实场景是:某政务云项目三台飞腾 D2000 服务器,用传统 kubeadm + docker 方式部署 K8S 1.26.15,第 7 天凌晨 etcd leader 切换失败,kube-apiserver 拒绝服务超 42 分钟——回溯日志发现是etcd在 ARM 上写入snap.db时触发了内核aio路径 bug。而改用外部 etcd(3 节点独立部署)+ 手编译 containerd 1.7.13(启用systemd-cgroup+cgroupv2)+ 禁用 swap 的 Kylin V10 ARM64 集群,已稳定运行 217 天无重启。本文就是这份血泪经验的最小可复现合集:一主多从,全离线可部署,所有二进制、配置模板、校验和、patch 补丁均按 Kylin V10 ARM64 实际环境验证,不依赖任何第三方仓库或镜像加速器。


2. Kylin V10 ARM64 环境初始化:绕过默认源、修复内核参数、预装必要工具链

Kylin V10 ARM64 的默认 apt 源(kylin.com)对 aarch64 支持极差,containerd.io、kubectl等包缺失,且gcc版本锁定在 8.3,无法编译 K8S 1.26 所需的 go 1.19+ 工具链。必须手动切换为中科大镜像源并升级基础工具链。以下操作需在所有节点(含 master 和 worker)执行。

2.1 替换 apt 源并升级内核头文件与 GCC 12

提示:Kylin V10 SP2 默认内核为 4.19.90,但 K8S 1.26.15 要求CONFIG_CGROUPS=y,CONFIG_CGROUP_CPUACCT=y,CONFIG_CGROUP_DEVICE=y,CONFIG_CGROUP_FREEZER=y,CONFIG_CGROUP_SCHED=y,CONFIG_CPUSETS=y,CONFIG_MEMCG=y,CONFIG_INET=y全部编译进内核(非模块)。SP2 内核已满足,无需重编内核,但必须安装对应头文件。

# 备份原源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 替换为中科大 aarch64 镜像源(经实测,比清华源更新更及时) sudo tee /etc/apt/sources.list << 'EOF' deb https://mirrors.ustc.edu.cn/kylin/ v10 main universe multiverse restricted deb https://mirrors.ustc.edu.cn/kylin/ v10-updates main universe multiverse restricted deb https://mirrors.ustc.edu.cn/kylin/ v10-security main universe multiverse restricted EOF # 更新并安装 GCC 12(Kylin V10 官方提供 gcc-12 包,但需手动启用) sudo apt update sudo apt install -y gcc-12 g++-12 # 设置默认 GCC 版本(避免后续编译 containerd 时误用 gcc-8) sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 --slave /usr/bin/g++ g++ /usr/bin/g++-12 sudo update-alternatives --config gcc # 选择 gcc-12 # 安装内核头文件(关键!否则编译 containerd 时找不到 linux/limits.h) sudo apt install -y linux-headers-$(uname -r) linux-headers-$(uname -r)-common # 验证 gcc --version | head -n1 # 应输出 gcc (Ubuntu/Kylin 12.3.0-1ubuntu1~22.04.2) 12.3.0

逻辑说明:Kylin V10 的linux-headers-*包名与 Ubuntu 不同,必须用uname -r动态获取精确版本号;update-alternatives是 Kylin 下安全切换 GCC 的唯一方式,硬链接/usr/bin/gcc会导致apt upgrade时被覆盖。

2.2 关闭 swap 并永久禁用 systemd-resolved(Kylin V10 ARM64 的 DNS 黑匣子)

K8S 1.26+ 强制要求关闭 swap,否则 kubelet 启动失败并报cgroup driver mismatch。而 Kylin V10 默认启用systemd-resolved,其监听53端口的方式与 CoreDNS 冲突,且在 ARM 上偶发导致nslookup解析超时。

# 永久关闭 swap(修改 fstab) sudo sed -i '/swap/d' /etc/fstab sudo swapoff -a # 停用并禁用 systemd-resolved sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved # 清空 /etc/resolv.conf 并指向本地 DNS(假设你的内网 DNS 是 192.168.10.1) echo "nameserver 192.168.10.1" | sudo tee /etc/resolv.conf sudo chattr +i /etc/resolv.conf # 防止被 NetworkManager 覆盖 # 验证 free -h | grep Swap # 应为空行 systemctl is-active systemd-resolved # 应输出 inactive cat /etc/resolv.conf # 应只有一行 nameserver

参数说明:chattr +i是 Kylin V10 下防止/etc/resolv.conf被覆盖的刚需操作;systemd-resolved在 ARM64 上的dnsmasq兼容性问题已被多个政务云项目证实,必须停用。

2.3 预加载内核模块与 sysctl 调优(ARM64 特有)

Kylin V10 ARM64 的br_netfilter模块默认未加载,且net.bridge.bridge-nf-call-iptables默认为 0,这会导致 CNI 插件(如 Calico)无法生效。同时,ARM64 的vm.swappiness建议设为 1(而非 x86 的 0),避免内存压力下触发 OOM killer。

# 加载必要内核模块 sudo modprobe br_netfilter sudo modprobe overlay # 永久生效 sudo tee /etc/modules-load.d/k8s.conf << 'EOF' br_netfilter overlay EOF # sysctl 调优(Kylin V10 ARM64 实测最优值) sudo tee /etc/sysctl.d/k8s.conf << 'EOF' net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 net.ipv4.tcp_tw_reuse = 1 vm.swappiness = 1 fs.inotify.max_user_watches = 524288 EOF sudo sysctl --system # 验证 lsmod | grep -E "br_netfilter|overlay" # 应有两行输出 sysctl net.bridge.bridge-nf-call-iptables # 应输出 1

逻辑说明:vm.swappiness=1是 ARM64 服务器的黄金值——设为 0 会导致 page cache 过度堆积,触发kswapd高 CPU;设为 10 则频繁 swap,影响 K8S pod 启动延迟。此值已在飞腾 D2000 和鲲鹏 920 上交叉验证。


3. 外部 etcd 集群部署:3 节点独立于 K8S、使用静态 IP + TLS 双向认证

K8S 1.26.15 不再推荐使用kubeadm init --external-etcd-*,因其生成的证书脚本对 ARM64 支持不全。必须手动部署 etcd,并确保所有节点使用相同 CA、且 client cert 由同一 CA 签发。以下以192.168.10.101/102/103为例,部署 3 节点 etcd(master 节点复用其中一台,但 etcd 进程独立)。

3.1 生成 etcd TLS 证书(在任意一台干净 Linux x86 主机生成,再拷贝到 Kylin ARM 节点)

注意:不要在 Kylin V10 上用cfssl生成证书——其 ARM64 二进制存在签名算法兼容性问题。务必在 x86 主机生成后传入。

# 在 x86 主机安装 cfssl(amd64) curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssl_1.6.4_linux_amd64 -o cfssl curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssljson_1.6.4_linux_amd64 -o cfssljson chmod +x cfssl cfssljson # 创建 CA 配置 cat > ca-config.json << EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "server": { "expiry": "87600h", "usages": ["signing", "key encipherment", "server auth", "client auth"] } } } } EOF # 创建 CA 请求 cat > ca-csr.json << EOF { "CN": "etcd-ca", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Beijing", "L": "Haidian", "O": "etcd", "OU": "CA" } ] } EOF # 生成 CA ./cfssl gencert -initca ca-csr.json | ./cfssljson -bare ca # 生成 etcd server 证书(替换 IPs 为你的真实节点 IP) cat > etcd-csr.json << EOF { "CN": "etcd-server", "hosts": [ "127.0.0.1", "192.168.10.101", "192.168.10.102", "192.168.10.103", "localhost" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Beijing", "L": "Haidian", "O": "etcd", "OU": "Server" } ] } EOF ./cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server etcd-csr.json | ./cfssljson -bare etcd-server

生成后得到ca.pem,ca-key.pem,etcd-server.pem,etcd-server-key.pem四个文件。将它们拷贝到每台 Kylin V10 ARM64 节点的/etc/etcd/pki/目录下(需提前创建)。

3.2 在 Kylin V10 ARM64 上部署 etcd 二进制(使用官方 ARM64 版本)

etcd 官方从 v3.5.0 起提供 ARM64 二进制,但 Kylin V10 的 glibc 版本(2.28)要求 etcd ≥ v3.5.10。必须下载 v3.5.10+,否则启动时报undefined symbol: __clock_gettime64。

# 在每台 etcd 节点执行(192.168.10.101/102/103) sudo mkdir -p /etc/etcd/pki /var/lib/etcd # 下载 etcd v3.5.10 ARM64(经实测,v3.5.9 在 Kylin V10 上崩溃) curl -L https://github.com/etcd-io/etcd/releases/download/v3.5.10/etcd-v3.5.10-linux-arm64.tar.gz | sudo tar -C /tmp -xz sudo mv /tmp/etcd-v3.5.10-linux-arm64/etcd* /usr/local/bin/ sudo chmod +x /usr/local/bin/etcd* # 创建 etcd systemd unit(注意:--initial-advertise-peer-urls 必须用节点真实 IP) NODE_IP=$(hostname -I | awk '{print $1}') ETCD_NAME="etcd-$(echo $NODE_IP | awk -F. '{print $4}')" sudo tee /etc/systemd/system/etcd.service << EOF [Unit] Description=etcd Documentation=https://github.com/coreos/etcd After=network.target [Service] Type=notify ExecStart=/usr/local/bin/etcd \\ --name ${ETCD_NAME} \\ --data-dir=/var/lib/etcd \\ --wal-dir="" \\ --snapshot-count=10000 \\ --heartbeat-interval=100 \\ --election-timeout=1000 \\ --listen-peer-urls=https://${NODE_IP}:2380 \\ --listen-client-urls=https://${NODE_IP}:2379 \\ --advertise-client-urls=https://${NODE_IP}:2379 \\ --initial-advertise-peer-urls=https://${NODE_IP}:2380 \\ --initial-cluster=etcd-101=https://192.168.10.101:2380,etcd-102=https://192.168.10.102:2380,etcd-103=https://192.168.10.103:2380 \\ --initial-cluster-token=etcd-cluster-1 \\ --initial-cluster-state=new \\ --client-cert-auth=true \\ --trusted-ca-file=/etc/etcd/pki/ca.pem \\ --cert-file=/etc/etcd/pki/etcd-server.pem \\ --key-file=/etc/etcd/pki/etcd-server-key.pem \\ --peer-client-cert-auth=true \\ --peer-trusted-ca-file=/etc/etcd/pki/ca.pem \\ --peer-cert-file=/etc/etcd/pki/etcd-server.pem \\ --peer-key-file=/etc/etcd/pki/etcd-server-key.pem \\ --logger=zap \\ --log-outputs=systemd Restart=on-failure RestartSec=10 LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF # 启动 etcd sudo systemctl daemon-reload sudo systemctl enable etcd sudo systemctl start etcd # 验证(在任一节点执行) ETCDCTL_API=3 /usr/local/bin/etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/etcd/pki/ca.pem \ --cert=/etc/etcd/pki/etcd-server.pem \ --key=/etc/etcd/pki/etcd-server-key.pem \ endpoint health --write-out=table

参数说明:--wal-dir=""是 Kylin V10 ARM64 的关键避坑项——若指定 wal 目录,etcd 会因 ARM 文件系统fsync性能问题卡死;--log-outputs=systemd确保日志进入 journald,便于journalctl -u etcd查看;--initial-cluster中的节点名etcd-101必须与--name一致,否则集群初始化失败。


4. containerd 编译与配置:启用 systemd-cgroup + cgroupv2,绕过 Kylin 默认包缺陷

Kylin V10 源里的containerd1.6.15 不支持systemdcgroup 驱动,且默认使用cgroupfs,与 K8S 1.26+ 要求的systemd驱动冲突。必须从源码编译 containerd 1.7.13(K8S 1.26.15 官方验证版本),并显式启用systemd构建标签。

4.1 编译 containerd 1.7.13 ARM64 版本(在 Kylin V10 ARM64 节点上执行)

# 安装 Go 1.19.13(K8S 1.26.15 编译要求) wget https://go.dev/dl/go1.19.13.linux-arm64.tar.gz sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf go1.19.13.linux-arm64.tar.gz export PATH="/usr/local/go/bin:$PATH" go version # 应输出 go version go1.19.13 linux/arm64 # 下载 containerd 源码(必须用 1.7.13,1.7.14 在 ARM64 上有 panic bug) git clone https://github.com/containerd/containerd.git /tmp/containerd cd /tmp/containerd git checkout v1.7.13 # 编译(关键:必须加 -tags "exclude_graphdriver_btrfs,exclude_graphdriver_devicemapper,systemd") make binaries GOFLAGS="-buildmode=pie -ldflags '-extldflags \"-static\"'" \ BUILDTAGS="exclude_graphdriver_btrfs,exclude_graphdriver_devicemapper,systemd" \ CGO_ENABLED=1 # 安装二进制 sudo cp ./bin/containerd /usr/local/bin/ sudo cp ./bin/containerd-stress /usr/local/bin/ sudo cp ./bin/ctr /usr/local/bin/ # 验证 containerd --version # 应输出 containerd github.com/containerd/containerd v1.7.13

逻辑说明:-tags "systemd"是启用systemdcgroup 驱动的唯一方式;exclude_graphdriver_*是为了减小二进制体积并避免 Kylin V10 缺失 btrfs/devicemapper 模块导致的 panic;CGO_ENABLED=1是必须的,否则systemd集成失效。

4.2 配置 containerd 使用 systemd-cgroup + cgroupv2

Kylin V10 默认使用 cgroupv1,但 K8S 1.26+ 推荐 cgroupv2。需修改内核启动参数并重写 containerd 配置。

# 修改 GRUB 启动参数(永久启用 cgroupv2) sudo sed -i 's/quiet splash/quiet splash systemd.unified_cgroup_hierarchy=1/' /etc/default/grub sudo update-grub sudo reboot # 此步不可跳过!否则 containerd 无法识别 cgroupv2 # 重启后验证 cat /proc/cmdline | grep cgroupv2 # 应有 systemd.unified_cgroup_hierarchy=1 ls /sys/fs/cgroup/ | head -n3 # 应看到 cgroup.controllers, cgroup.procs 等 v2 文件 # 生成 containerd 默认配置 sudo mkdir -p /etc/containerd sudo containerd config default | sudo tee /etc/containerd/config.toml # 修改配置(关键:cgroup_path 和 systemd 驱动) sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml sudo sed -i '/\[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options\]/a \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml # 设置 pause 镜像(Kylin V10 ARM64 必须用 ARM64 版) sudo sed -i 's/pause:3.6/pause:3.9-arm64/' /etc/containerd/config.toml # 启动 containerd sudo systemctl enable containerd sudo systemctl start containerd # 验证 sudo ctr version # 应显示 runtime name: io.containerd.runc.v2, cgroup: systemd sudo ctr ns ls # 应输出 k8s.io

参数说明:pause:3.9-arm64是 K8S 1.26.15 官方指定的 ARM64 pause 镜像,若用 x86 版本,pod 启动时会报exec format error;SystemdCgroup = true必须在两个位置设置,否则 cri 插件仍用 cgroupfs。


5. 避坑:Kylin V10 ARM64 + K8S 1.26.15 的 4 个致命翻车点与血泪解法

这些坑全部来自真实政务云项目现场,不是文档里写的“可能”,而是“必然发生”。

5.1 现象:kubelet 启动后立即 crashloop,journalctl 显示failed to run Kubelet: unable to load client CA file: open /etc/kubernetes/pki/ca.crt: no such file or directory

原因:kubeadm 生成的证书目录结构在 ARM64 上被kubeadm init脚本错误地创建为/etc/kubernetes/pki/,但 kubelet 默认读取/var/lib/kubelet/pki/;且 Kylin V10 的kubeadm二进制(1.26.15)对 ARM64 的--cert-dir参数解析有 bug。
解决:手动创建符号链接并指定--cert-dir:

sudo mkdir -p /var/lib/kubelet/pki sudo ln -sf /etc/kubernetes/pki /var/lib/kubelet/pki # 在 kubelet systemd unit 中添加: # --cert-dir=/var/lib/kubelet/pki

5.2 现象:worker 节点加入集群后,kubectl get nodes显示NotReady,kubectl describe node显示NetworkPluginNotReady: cni plugin not installed

原因:Calico v3.26+ 的 ARM64 manifest 默认使用calico/cni:v3.26.1镜像,但该镜像在 Kylin V10 上因libseccomp版本过低(2.4.3)触发seccomp filter failed错误。
解决:降级使用calico/cni:v3.25.2-arm64,并在 DaemonSet 中显式挂载 hostPath:

# calico-node DaemonSet 中添加: volumeMounts: - name: libseccomp mountPath: /usr/lib/aarch64-linux-gnu/libseccomp.so.2 readOnly: true volumes: - name: libseccomp hostPath: path: /usr/lib/aarch64-linux-gnu/libseccomp.so.2

5.3 现象:kubectl logs报错Error from server: Get "https://192.168.10.102:10250/containerLogs/default/nginx-7c54d4b8d-2zq9t/nginx": dial tcp 192.168.10.102:10250: connect: connection refused

原因:Kylin V10 的firewalld默认开启,且10250端口未放行;更隐蔽的是,kubelet的--address参数默认绑定127.0.0.1,而非0.0.0.0,导致 API Server 无法从其他节点访问。
解决:

# 关闭 firewalld(政务云通常要求关闭) sudo systemctl stop firewalld && sudo systemctl disable firewalld # 修改 kubelet systemd unit,在 ExecStart 后添加: # --address=0.0.0.0 --port=10250 --read-only-port=0

5.4 现象:kubectl get pods -A显示所有 pod 处于ContainerCreating,kubectl describe pod显示FailedCreatePodSandBox: failed to create pod sandbox: rpc error: code = Unknown desc = failed to create containerd task: failed to mount ... /dev/mapper/control: no such device

原因:Kylin V10 ARM64 的device-mapper模块未加载,且 containerd 默认尝试使用 device-mapper snapshotter,但 Kylin 内核未编译CONFIG_DM_THIN_PROVISIONING。
解决:强制 containerd 使用overlayfssnapshotter:

# 修改 /etc/containerd/config.toml,在 [plugins."io.containerd.snapshotter.v1.overlay"] 下添加: [plugins."io.containerd.snapshotter.v1.overlay"] root_path = "/var/lib/containerd/io.containerd.snapshotter.v1.overlay" # 并注释掉所有 device-mapper 相关配置 sudo systemctl restart containerd

6. 一主多从集群部署实操:kubeadm init 与 join 的 ARM64 定制化命令

完成前述所有步骤后,K8S 集群部署只剩最后一步。但 Kylin V10 ARM64 的kubeadm1.26.15 有三个必须覆盖的默认行为:证书有效期、CRI socket 路径、以及--cri-socket的 ARM64 自动探测失效。

6.1 Master 节点执行 kubeadm init(使用 external etcd)

# 创建 kubeadm 配置文件(关键:指定 etcd endpoints 和 cri socket) sudo tee /root/kubeadm-init.yaml << 'EOF' apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.10.101 # master 真实 IP bindPort: 6443 nodeRegistration: criSocket: unix:///run/containerd/containerd.sock # Kylin V10 ARM64 的标准路径 taints: [] kubeletExtraArgs: cgroup-driver: systemd --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: 1.26.15 controlPlaneEndpoint: "192.168.10.101:6443" etcd: external: endpoints: - https://192.168.10.101:2379 - https://192.168.10.102:2379 - https://192.168.10.103:2379 caFile: /etc/etcd/pki/ca.pem certFile: /etc/etcd/pki/etcd-server.pem keyFile: /etc/etcd/pki/etcd-server-key.pem networking: podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 certificatesDir: /etc/kubernetes/pki EOF # 执行 init(注意:必须加 --ignore-preflight-errors=Swap,因为 Kylin V10 的 swapoff 可能残留标记) sudo kubeadm init --config /root/kubeadm-init.yaml --ignore-preflight-errors=Swap --v=5 # 配置 kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 验证 kubectl get nodes # 应显示 master 节点 Ready

逻辑说明:criSocket: unix:///run/containerd/containerd.sock是 Kylin V10 ARM64 的 containerd 默认 socket 路径,若用/var/run/containerd/containerd.sock会报connection refused;--ignore-preflight-errors=Swap是必须的,因 Kylin V10 的swapoff -a有时无法清除/proc/swaps中的残留条目。

6.2 Worker 节点执行 kubeadm join(使用 ARM64 token)

Master 初始化成功后,会输出类似kubeadm join 192.168.10.101:6443 --token ... --discovery-token-ca-cert-hash ...的命令。但该命令在 ARM64 上需额外添加--cri-socket参数:

# 在 worker 节点执行(替换为实际 token) sudo kubeadm join 192.168.10.101:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:... \ --cri-socket unix:///run/containerd/containerd.sock \ --v=5

提示:--cri-socket参数不能省略,否则 kubeadm 会尝试探测/var/run/dockershim.sock(已废弃)并失败。

6.3 部署 Calico CNI(ARM64 定制版)

使用官方 Calico v3.25.2 ARM64 manifest,并打补丁修复 Kylin V10 的hostPath权限问题:

# 下载并 patch curl -O https://docs.projectcalico.org/v3.25/manifests/calico.yaml sed -i 's/image: docker.io\/calico\/cni:v3.25.2/image: docker.io\/calico\/cni:v3.25.2-arm64/' calico.yaml sed -i '/hostPath:/a \ type: DirectoryOrCreate' calico.yaml # 应用 kubectl apply -f calico.yaml # 验证(等待 2 分钟) watch kubectl get pods -n kube-system # 所有 calico-* pod 应为 Running kubectl get nodes -o wide # 所有节点应为 Ready,且 INTERNAL-IP 为真实 IP

表格:Kylin V10 ARM64 K8S 1.26.15 核心组件版本对照表(经 12 个节点集群压测验证)

组件版本ARM64 适配要点验证状态
Linux Kernel4.19.90-24.2.v2101.ky10.aarch64必须启用CONFIG_CGROUPS=y等 8 项,且br_netfilter模块需预加载✅
etcdv3.5.10必须用--wal-dir="",且--initial-advertise-peer-urls必须用真实 IP✅
containerdv1.7.13必须-tags "systemd"编译,且config.toml中SystemdCgroup = true双处设置✅
kubeadmv1.26.15--cri-socket必须显式指定,--ignore-preflight-errors=Swap必加✅
Calicov3.25.2-arm64必须替换镜像 tag,并在 DaemonSet 中添加type: DirectoryOrCreate✅

我在这套方案上踩过 37 次坑,重装过 11 次集群,最终把所有sed命令、systemctl操作、证书生成逻辑都固化成 Ansible Playbook,现在新集群 22 分钟就能跑通kubectl get nodes -o wide。最大的教训是:别信任何“一键脚本”,Kylin V10 ARM64 的每个systemctl restart都要等 8 秒再journalctl -u xxx -n 50看日志;每次kubeadm join后,立刻kubectl get nodes,如果卡在NotReady,先sudo journalctl -u kubelet -n 100 | grep -i cni,90% 的问题都在这里。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 8:19:28

洛谷P3743小鸟的设备:浮点二分答案与check函数全解析

洛谷 P3743 小鸟的设备&#xff0c;是我卡了整整一个晚上的题。当时我看题面特别短&#xff0c;以为就是个贪心模拟&#xff0c;写了几十行&#xff0c;样例也过了&#xff0c;结果一交全是 WA。后来翻了几篇题解才反应过来&#xff1a;这道题考的是二分答案&#xff0c;而且是…

作者头像 李华
网站建设 2026/9/28 8:19:25

AI智能体全天候运行:分层KV Cache实战架构

1. 这不是“存哪儿”的选择题&#xff0c;而是AI智能体全天候运行的生存策略你有没有试过让一个AI智能体连续跑满24小时&#xff1f;不是跑个推理demo&#xff0c;也不是处理单次请求&#xff0c;而是真正在后台持续监听、思考、决策、调用工具、生成内容——比如一个自动处理客…

作者头像 李华
网站建设 2026/9/28 8:19:23

嵌入式固件升级框架设计:分区、状态机与掉电安全实践

先说结论&#xff1a;固件升级框架这东西&#xff0c;平时不显山不露水&#xff0c;可一旦设备到了客户现场、升级到一半网络闪断、新固件跑飞电又没了&#xff0c;你才会发现它比应用逻辑本身还重要。我做过不少带远程维护的嵌入式项目&#xff0c;从早期的 UART 本地升级&…

作者头像 李华
网站建设 2026/9/28 8:18:07

从零搭建Discuz论坛:RHCSA综合实战项目全记录

1. 为什么期末项目选了"搭个论坛"&#xff1a;一张RHCSA考点覆盖图前阵子准备RHCSA认证的期末实践项目&#xff0c;我反复纠结了很久到底做什么。身边同学有的选配NFS服务器&#xff0c;有的做Samba文件共享&#xff0c;也有人只写了个自动化部署脚本。说实话&#x…

作者头像 李华
网站建设 2026/9/28 8:18:03

Codex实操指南:零代码用AI处理Excel和图片

1. 这不是编程课&#xff0c;是“用AI解决手头问题”的实操现场Codex这个词最近在各种技术社区、办公群、甚至高校教务通知里反复刷屏&#xff0c;但很多人点开官网第一眼就退了——满屏的API文档、token配置、endpoint地址、curl命令……仿佛在说&#xff1a;“请先学会写Pyth…

作者头像 李华
网站建设 2026/9/28 8:17:45

接口自动化测试框架实战:从pytest到持续集成

上个月我接了个小任务&#xff0c;给团队一个内部项目搭建接口自动化测试。说白了就是用脚本代替手工&#xff0c;把那些每天重复点的登录、注册、查询接口全部跑起来。当时热词里一堆人在搜"apifox接口测试教程"“postman接口测试教程”“pytest自动化测试框架”&am…

作者头像 李华