博客 / 詳情

返回

記錄一次K8S個人測試環境的部署過程

部署環境:Ubuntu 24.04

前置條件:

  1. 開啓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
  2. 編輯fstab關閉swap(直接註釋掉即可)

分為四個部分
一、containerd的部署
參考連接:https://github.com/containerd/containerd/blob/main/docs/getting-started.md
下載的話可能會需要github加速,家人們自行搜索即可。

二、master的部署

  1. 安裝kubeadm:https://kubernetes.io/zh-cn/docs/setup/production-environment...
  2. 編寫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"
  3. 執行int命令之前可以先把鏡像拉取到本地:kubeadm config images pull
  4. 執行init命令:kubeadm init --config kubeadm.yaml
  5. 鏡像可能會拉取失敗,可以先看下有哪些鏡像,然後手動拉取:kubeadm config images list --kubernetes-version=v1.34.2
  6. 通過國內加速鏡像網站拉取(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"
  7. 再次執行: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
    
  8. 配置用户kube環境

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  9. 驗證執行結果

    (這是安裝網絡插件之後的狀態,正常還有兩個容器處於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
  10. 安裝網絡插件
    我安裝的是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  # 拷貝到目標機器
  11. 在目標機器(master)導入上面scp的鏡像

    ctr -n k8s.io images import /tmp/weave-net-2.9.0.tar
    注意導入鏡像到k8s.io名稱空間
  12. 安裝網絡插件(wearve):

    kubectl apply -f https://reweave.azurewebsites.net/k8s/v1.34/net.yaml
  13. 查看所有的pod是否都處於running狀態
    kubectl get pods -n kube-system

三、node的部署

  1. worker node同樣要滿足前面列出的前置條件;
  2. 使用前面的方法拉取kube-proxy和weave容器;
  3. 確保token沒有過期,可以在master查看可用token,如果為空需要重新生成:

    kubeadm token list
    kubeadm token create
  4. 確保master節點的主機名和IP在worker節點可以被解析(修改hosts文件)
  5. 直接執行master上kubeadm init執行成功後提示的命令:

    kubeadm join 192.168.17.128:6443 --token lhi0x7.h112hy5shyadhb8a \
         --discovery-token-ca-cert-hash sha256:cf18396416f7844991017dd6df69e255134a15f4442c015acf5665fa467341b5
    若token過期,需要重新生成。
  6. 在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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.