部署環境:Ubuntu 24.04
前置條件:
-
開啓ipv4轉發
# 設置所需的 sysctl 參數,參數在重新啓動後保持不變 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.ipv4.ip_forward = 1 EOF # 應用 sysctl 參數而不重新啓動 sudo sysctl --system # 驗證 sysctl net.ipv4.ip_forward - 編輯fstab關閉swap(直接註釋掉即可)
分為四個部分
一、containerd的部署
參考連接:https://github.com/containerd/containerd/blob/main/docs/getting-started.md
下載的話可能會需要github加速,家人們自行搜索即可。
二、master的部署
- 安裝kubeadm:https://kubernetes.io/zh-cn/docs/setup/production-environment...
-
編寫kubeadm配置yaml文件:
apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration nodeRegistration: kubeletExtraArgs: cgroup-driver: "systemd" --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: "v1.34.2" clusterName: "exmple-cluster" controllerManager: extraArgs: horizontal-pod-autoscaler-sync-period: "10s" node-monitor-grace-period: "10s" apiServer: extraArgs: runtime-config: "api/all=true" - 執行int命令之前可以先把鏡像拉取到本地:kubeadm config images pull
- 執行init命令:kubeadm init --config kubeadm.yaml
- 鏡像可能會拉取失敗,可以先看下有哪些鏡像,然後手動拉取:kubeadm config images list --kubernetes-version=v1.34.2
-
通過國內加速鏡像網站拉取(AI寫的腳本):
#!/bin/bash set -e # 遇到錯誤時退出 # --- 配置 --- # 指定需要的 Kubernetes 及相關組件版本 KUBE_VERSION="v1.34.2" COREDNS_VERSION="v1.12.1" PAUSE_VERSION="3.10.1" ETCD_VERSION="3.6.5-0" # 阿里雲鏡像倉庫前綴 ALIYUN_REGISTRY="registry.aliyuncs.com/google_containers" # 目標(官方)鏡像倉庫前綴 OFFICIAL_REGISTRY="registry.k8s.io" # 定義需要拉取和重標記的鏡像映射 (key: 阿里雲suffix -> value: 官方full_tag) # 注意 coredns 的路徑和 pause/etcd 的標籤格式 declare -A IMAGES_MAP=( ["kube-apiserver:$KUBE_VERSION"]="$OFFICIAL_REGISTRY/kube-apiserver:$KUBE_VERSION" ["kube-controller-manager:$KUBE_VERSION"]="$OFFICIAL_REGISTRY/kube-controller-manager:$KUBE_VERSION" ["kube-scheduler:$KUBE_VERSION"]="$OFFICIAL_REGISTRY/kube-scheduler:$KUBE_VERSION" ["kube-proxy:$KUBE_VERSION"]="$OFFICIAL_REGISTRY/kube-proxy:$KUBE_VERSION" ["coredns:$COREDNS_VERSION"]="$OFFICIAL_REGISTRY/coredns/coredns:$COREDNS_VERSION" # 路徑 coredns/coredns ["pause:$PAUSE_VERSION"]="$OFFICIAL_REGISTRY/pause:$PAUSE_VERSION" # 標籤不含 v ["etcd:$ETCD_VERSION"]="$OFFICIAL_REGISTRY/etcd:$ETCD_VERSION" # 標籤不含 v ) # Containerd 命名空間 NAMESPACE="k8s.io" # --- 腳本主體 --- echo "===============================================" echo "準備拉取並重新標記 Kubernetes 鏡像..." echo "Kubernetes 版本: $KUBE_VERSION" echo "CoreDNS 版本: $COREDNS_VERSION" echo "Pause 版本: $PAUSE_VERSION" echo "Etcd 版本: $ETCD_VERSION" echo "===============================================" for source_suffix in "${!IMAGES_MAP[@]}"; do target_full="${IMAGES_MAP[$source_suffix]}" # 構造阿里雲全稱 source_full="$ALIYUN_REGISTRY/$source_suffix" echo "" echo "--- 處理鏡像: $source_full ---" # 1. 從阿里雲拉取鏡像 echo "正在拉取: $source_full" crictl pull "$source_full" if [ $? -ne 0 ]; then echo "錯誤: 拉取 $source_full 失敗。" exit 1 fi # 2. 使用 ctr 重新標記為官方格式 echo "正在標記: $source_full -> $target_full" ctr -n "$NAMESPACE" images tag "$source_full" "$target_full" if [ $? -ne 0 ]; then echo "錯誤: 標記 $source_full -> $target_full 失敗。" exit 1 fi # 3. 清理:刪除阿里雲的原始標籤 (僅刪除別名,不刪除鏡像數據) echo "正在刪除臨時標籤: $source_full" # 使用 ctr images remove/del 刪除標籤。如果該鏡像_digest_只被這一個標籤引用,則鏡像數據也會被GC。 # 如果擔心誤刪,可以註釋掉下面這行,手動清理或讓containerd GC處理。 ctr -n "$NAMESPACE" images remove "$source_full" if [ $? -ne 0 ]; then echo "警告: 刪除臨時標籤 $source_full 失敗 (可能已被刪除或有其他引用)。" # 不因警告退出 fi echo "完成: $target_full" done echo "" echo "===============================================" echo "所有指定的 Kubernetes 鏡像均已成功拉取、重新標記並清理了臨時標籤!" echo "你現在可以運行 'kubeadm init --kubernetes-version=$KUBE_VERSION' 了。" echo "===============================================" echo "如果發現有加速下載的鏡像沒有被刪除可以手動刪除:" echo "ctr -n k8s.io images list | grep aliyuncs | awk '{print $1}'" echo "ctr -n k8s.io images list | grep aliyuncs | awk '{print $1}' | xargs -r ctr -n k8s.io images remove" -
再次執行:kubeadm init --config kubeadm.yaml,此時就會執行成功
執行成功後會提示如何配置本地訪問k8s環境以及如何添加work node:(注意閲讀並保存以下信息) Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.17.128:6443 --token lhi0x7.h112hy5shyadhb8a \ --discovery-token-ca-cert-hash sha256:cf18396416f7844991017dd6df69e255134a15f4442c015acf5665fa467341b5 -
配置用户kube環境
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config -
驗證執行結果
(這是安裝網絡插件之後的狀態,正常還有兩個容器處於pending狀態。) root@ubuntu01:~# kubectl get node NAME STATUS ROLES AGE VERSION ubuntu01 Ready control-plane 23h v1.34.2 root@ubuntu01:~# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-66bc5c9577-gglfn 1/1 Running 2 (161m ago) 23h coredns-66bc5c9577-q7ztg 1/1 Running 2 (161m ago) 23h etcd-ubuntu01 1/1 Running 3 (161m ago) 23h kube-apiserver-ubuntu01 1/1 Running 3 (161m ago) 23h kube-controller-manager-ubuntu01 1/1 Running 3 (161m ago) 23h kube-proxy-ld5rp 1/1 Running 3 (161m ago) 23h kube-scheduler-ubuntu01 1/1 Running 3 (161m ago) 23h weave-net-6xqq8 2/2 Running 5 (161m ago) 23h -
安裝網絡插件
我安裝的是weave,國內源加速不了,最後選擇的是付費加速源。
master節點的containerd沒有login功能,需要在個人PC安裝docker,然後docker login後,docker pull, docker save, scp ..., 在master節點import個人PC: docker pull docker.xuanyuan.run/rajchaudhuri/weave-kube:2.9.0 docker pull docker.xuanyuan.run/rajchaudhuri/weave-npc:2.9.0 docker tag docker.xuanyuan.run/rajchaudhuri/weave-kube:2.9.0 rajchaudhuri/weave-kube:2.9.0 docker tag docker.xuanyuan.run/rajchaudhuri/weave-npc:2.9.0 rajchaudhuri/weave-npc:2.9.0 docker save rajchaudhuri/weave-kube:2.9.0 rajchaudhuri/weave-npc:2.9.0 > weave-net-2.9.0.tar scp weave-net-2.9.0.tar root@192.168.17.128:/tmp # 拷貝到目標機器 -
在目標機器(master)導入上面scp的鏡像
ctr -n k8s.io images import /tmp/weave-net-2.9.0.tar 注意導入鏡像到k8s.io名稱空間 -
安裝網絡插件(wearve):
kubectl apply -f https://reweave.azurewebsites.net/k8s/v1.34/net.yaml - 查看所有的pod是否都處於running狀態
kubectl get pods -n kube-system
三、node的部署
- worker node同樣要滿足前面列出的前置條件;
- 使用前面的方法拉取kube-proxy和weave容器;
-
確保token沒有過期,可以在master查看可用token,如果為空需要重新生成:
kubeadm token list kubeadm token create - 確保master節點的主機名和IP在worker節點可以被解析(修改hosts文件)
-
直接執行master上kubeadm init執行成功後提示的命令:
kubeadm join 192.168.17.128:6443 --token lhi0x7.h112hy5shyadhb8a \ --discovery-token-ca-cert-hash sha256:cf18396416f7844991017dd6df69e255134a15f4442c015acf5665fa467341b5 若token過期,需要重新生成。 -
在master節點查看worker節點是否添加成功:
root@ubuntu01:~# kubectl get node NAME STATUS ROLES AGE VERSION ubuntu01 Ready control-plane 24h v1.34.2 ubuntu02 Ready <none> 13s v1.34.2
四、須確保containerd和kubernetes使用了相同的cgroup驅動
查看containerd的cgroup驅動(推薦systemd)
crictl info | grep -i "cgroup"
若"SystemdCgroup": false,説明為cgroupsf驅動
若"SystemdCgroup": true,説明為systemd驅動
查看kubelet的cgroup驅動
cat /var/lib/kubelet/config.yaml | grep -i "cgroup"
輸出類似cgroupDriver: systemd
若containerd和kubelet cgroup配置不同,須修改為相同
比如可以修改containerd的cgroup驅動為systemd:
生成並編輯文件containerd配置文件:
mkdir -p /etc/containerd/
containerd config default > /etc/containerd/config.toml(若已存在,請忽略)
vim /etc/containerd/config.toml --> SystemdCgroup = true
systemctl restart containerd # 重啓運行時
crictl info | grep -i "cgroup" # 驗證
systemctl restart kubelet