博客 / 詳情

返回

Ubuntu離線環境部署Kubernetes v1.31.3(ARM64)

離線ARM64環境 Kubernetes v1.31.3 部署過程記錄

前言

本文基於 Ubuntu 22.04/24.04 LTS ARM64 架構,提供完全離線、無外網、無私有倉庫的 Kubernetes 集羣部署方案,包含完整部署流程、離線物料製備、實戰踩坑問題解決。


一、部署環境要求

1.1 硬件配置

節點角色 數量 CPU 內存 磁盤 架構
Master 1 ≥4核 ≥8G ≥40G SSD ARM64
Node ≥1 ≥4核 ≥8G ≥40G SSD ARM64

image

1.2 基礎約束

  • 操作系統:Ubuntu 22.04 / 24.04 LTS ARM64
  • 所有節點關閉 Swap
  • 節點間網絡互通,配置主機名解析
  • 完全無外網、無鏡像源

1.3 主機名與hosts配置(所有節點執行)

# 設置主機名(示例)
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node01

# 配置hosts
cat >> /etc/hosts <<EOF
192.168.10.10  k8s-master
192.168.10.11  k8s-node01
EOF 

二、離線物料準備

2.1 必備物料清單

1. K8s 官方二進制包(linux-arm64)
kubeadm v1.31.3
kubelet v1.31.3
kubectl v1.31.3
2. 離線依賴 deb 包(ARM64)
conntrack_1%3a1.4.8-1ubuntu1_arm64.deb(核心依賴,必裝)
containerd.io_1.7.21-1_arm64.deb
runc_1.1.12-0ubuntu1~22.04_arm64.deb
cri-tools_1.26.0-00_arm64.deb
kubernetes-cni_1.26.0-00_arm64.deb
3. 離線鏡像包
k8s-ixe-images-v1.31.3-arm64.tar(K8s 全套核心鏡像)
pause-3.10-arm64-single.tar(單架構 pause 鏡像,解決導入報錯)
4. 配置文件
calico-v3.31.3-arm64.yaml(Calico 網絡插件)
kubelet.service(kubelet 系統服務文件

2.2 聯網機制備物料(僅執行一次)

# conntrack 官方ARM64包(清華鏡像源)
https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/pool/main/c/conntrack-tools/conntrack_1.4.8-1ubuntu1_arm64.deb

# containerd 官方包
https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/arm64/containerd.io_1.7.21-1_arm64.deb

# 1. 下載K8s官方ARM64二進制包
wget https://dl.k8s.io/v1.31.3/bin/linux/arm64/kubeadm
wget https://dl.k8s.io/v1.31.3/bin/linux/arm64/kubelet
wget https://dl.k8s.io/v1.31.3/bin/linux/arm64/kubectl

# 2. 下載離線依賴deb包(清華源+官方)
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/pool/main/c/conntrack-tools/conntrack_1.4.8-1ubuntu1_arm64.deb
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/arm64/containerd.io_1.7.21-1_arm64.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/pool/main/r/runc/runc_1.1.12-0ubuntu1~22.04_arm64.deb

# 3. 下載Calico配置
wget https://raw.githubusercontent.com/projectcalico/calico/v3.31.3/manifests/calico.yaml -O calico-v3.31.3-arm64.yaml

# 4. 導出單架構pause鏡像(解決ctr導入報錯)
ctr -n k8s.io i pull --platform linux/arm64 registry.k8s.io/pause:3.10
ctr -n k8s.io i export --platform linux/arm64 pause-3.10-arm64-single.tar registry.k8s.io/pause:3.10

# 5. 導出K8s全套離線鏡像
ctr -n k8s.io i export k8s-ixe-images-v1.31.3-arm64.tar \
registry.k8s.io/kube-apiserver:v1.31.3 \
registry.k8s.io/kube-controller-manager:v1.31.3 \
registry.k8s.io/kube-scheduler:v1.31.3 \
registry.k8s.io/kube-proxy:v1.31.3 \
registry.k8s.io/pause:3.10 \
registry.k8s.io/etcd:3.5.15-0 \
registry.k8s.io/coredns/coredns:v1.11.3 \
docker.io/calico/cni:v3.31.3 \
docker.io/calico/node:v3.31.3 \
docker.io/calico/kube-controllers:v3.31.3

# 1. 下載K8s官方x86_64二進制包
wget https://dl.k8s.io/v1.31.3/bin/linux/amd64/kubeadm
wget https://dl.k8s.io/v1.31.3/bin/linux/amd64/kubelet
wget https://dl.k8s.io/v1.31.3/bin/linux/amd64/kubectl

# 2. 下載離線依賴deb包(清華源+官方)
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/c/conntrack-tools/conntrack_1.4.8-1ubuntu1_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/containerd.io_1.7.21-1_amd64.deb
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/r/runc/runc_1.1.12-0ubuntu1~22.04_amd64.deb

# 3. 下載Calico配置
wget https://raw.githubusercontent.com/projectcalico/calico/v3.31.3/manifests/calico.yaml -O calico-v3.31.3-amd64.yaml

# 4. 導出單架構pause鏡像(解決ctr導入報錯)
ctr -n k8s.io i pull --platform linux/amd64 registry.k8s.io/pause:3.10
ctr -n k8s.io i export --platform linux/amd64 pause-3.10-amd64-single.tar registry.k8s.io/pause:3.10

# 5. 導出K8s全套離線鏡像
ctr -n k8s.io i export k8s-ixe-images-v1.31.3-amd64.tar \
registry.k8s.io/kube-apiserver:v1.31.3 \
registry.k8s.io/kube-controller-manager:v1.31.3 \
registry.k8s.io/kube-scheduler:v1.31.3 \
registry.k8s.io/kube-proxy:v1.31.3 \
registry.k8s.io/pause:3.10 \
registry.k8s.io/etcd:3.5.15-0 \
registry.k8s.io/coredns/coredns:v1.11.3 \
docker.io/calico/cni:v3.31.3 \
docker.io/calico/node:v3.31.3 \
docker.io/calico/kube-controllers:v3.31.3

2.3 物料傳輸

將所有物料拷貝至離線節點 /opt/k8s-offline/ 目錄。

三、所有節點統一初始化(Master+Node)

3.1 關閉 Swap

swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

3.5 配置 containerd

3.2 加載內核模塊

cat > /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

3.3 配置內核參數

cat > /etc/sysctl.d/99-k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sysctl --system

3.4 安裝離線依賴 deb 包

cd /opt/k8s-offline
dpkg -i *.deb
apt -f install -y

3.5 部署 K8s 二進制文件

cd /opt/k8s-offline
chmod +x kubeadm kubelet kubectl
mv kubeadm kubelet kubectl /usr/local/bin/

3.6 配置 containerd

containerd config default > /etc/containerd/config.toml
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.k8s.io/pause:3.10"#' /etc/containerd/config.toml

systemctl enable containerd
systemctl restart containerd

3.7 配置 kubelet

# 創建kubelet配置文件
cat > /var/lib/kubelet/config.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
podInfraContainerImage: "registry.k8s.io/pause:3.10"
EOF

# 創建kubelet服務文件
cat > /etc/systemd/system/kubelet.service <<EOF
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/

[Service]
ExecStart=/usr/local/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet

四、Master 節點部署

4.1 導入離線鏡像

cd /opt/k8s-offline
ctr -n k8s.io images import k8s-ixe-images-v1.31.3-arm64.tar
ctr -n k8s.io images import pause-3.10-arm64-single.tar

4.2 kubeadm 初始化集羣

kubeadm init \
  --kubernetes-version=v1.31.3 \
  --apiserver-advertise-address=192.168.10.10 \
  --pod-network-cidr=10.244.0.0/16 \
  --service-cidr=10.96.0.0/12 \
  --image-repository=registry.k8s.io \
  --ignore-preflight-errors=swap

保存輸出的 kubeadm join 命令,用於 Node 節點加入集羣

4.3 配置 kubectl

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

4.4 部署 Calico 網絡

kubectl apply -f calico-v3.31.3-arm64.yaml

五、Node 節點部署

5.1 導入鏡像

cd /opt/k8s-offline
ctr -n k8s.io images import k8s-ixe-images-v1.31.3-arm64.tar
ctr -n k8s.io images import pause-3.10-arm64-single.tar

5.2 加入集羣

# 使用Master初始化輸出的join命令
kubeadm join 192.168.10.10:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx

六、實戰踩坑:核心問題及解決方案

問題 1:Node 節點 NotReady,calico-node 報錯Failed to get sandbox image "registry.k8s.io/pause:3.8"

原因:kubelet 默認使用 pause:3.8,離線環境無法拉取,覆蓋 containerd 配置。

sed -i 's#podInfraContainerImage:.*#podInfraContainerImage: "registry.k8s.io/pause:3.10"#' /var/lib/kubelet/config.yaml
systemctl restart containerd kubelet
kubectl delete pod -n kube-system calico-node-xxx

問題 2:ctr 導入鏡像報錯content digest not found

原因:ctr 不支持多架構鏡像導入。
解決方案:必須使用--platform linux/arm64導出單架構鏡像。

例如
ctr -n k8s.io images export  --platform linux/arm64  kube-proxy.tar.gz  registry.k8s.io/kube-proxy:v1.31.3

問題 3:coredns 一直 Pending

原因:未部署 CNI 網絡插件。
解決方案:執行 Calico 部署命令,等待 1-2 分鐘自動恢復。

七、部署驗證

7.1 節點狀態檢查

kubectl get nodes

0e74f7b7-485b-4ea6-b5ae-af9a7842be2e

7.2 系統 Pod 檢查

kubectl get pods -n kube-system

7418768c-b51f-4535-a98d-65456eb1ca4b

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.