Centos7.9 使用 Kubeadm 自動化部署 K8S 叢集(一個指令碼)

misakivv發表於2024-09-22

目錄
  • 一、環境準備
    • 1、硬體準備(虛擬主機)
    • 2、作業系統版本
    • 3、硬體配置
    • 4、網路
  • 二、注意點
    • 1、主機命名格式
    • 2、網路外掛 flannel 映象拉取
      • 2.1、主機生成公私鑰
      • 2.2、為啥有 Github 還用 Gitee
      • 2.3、將主機公鑰新增到 Gitee
        • 2.3.1、複製主機上的公鑰
        • 2.3.2、登入碼雲
        • 2.3.3、設定 --> 安全設定 --> SSH公鑰
        • 2.3.4、新增公鑰
      • 2.4、將主機公鑰新增到 Github
        • 2.4.1、點選頭像 --> settings
        • 2.4.2、左側列表中找到 SSH and GPG keys 點選 New SSH key
    • 3、阿里雲的映象加速地址
      • 3.1、映象加速器地址
      • 3.2、對應指令碼的修改位置
    • 4、執行指令碼時需要加入叢集的主機都線上
      • 4.1、透過 SSH 配置免密登入
      • 4.2、在 master 節點上執行登入各節點執行加入叢集命令
    • 5、輸入正確的目標主機名
    • 6、指令碼適用性
  • 三、指令碼
  • 四、例項演示
    • 1、硬體準備
    • 2、**,啟動!
    • 3、建立指令碼檔案(CV大法)
    • 4、執行指令碼
    • 5、判斷並關閉完firewalld、selinux、swap 後輸入目標主機名
    • 6、master節點將預設的叢集列表一個個追加到/etc/hosts檔案中,所有節點執行判斷邏輯
    • 7、所有節點設定 sysctl 引數,安裝 ntpdate 並同步時間
    • 8、安裝 wget git curl zsh...(pass)
    • 9、清除原有的 yum 倉庫,下載新的倉庫檔案
    • 10、安裝,配置 Docker 、新增 Kubernetes 倉庫(pass)
    • 11、輸入想要安裝的 k8s 版本
    • 12、安裝三件套kubelet、kubeadm、kubectl(pass)
    • 13、node節點:克隆映象倉庫
    • 14、載入 Docker 映象
    • 15、master 節點 kubeadm 初始化好了以後儲存 kubeadm join 命令為環境變數、建立 .kube 目錄並複製 admin.conf 檔案以及設定 KUBECONFIG 環境變數、kubectl 設定命令補全
    • 16、克隆映象倉庫,部署網路外掛
    • 17、master 節點配置免密登入
    • 18、透過 SSH 登入 node 節點執行 join 操作
    • 19、每十秒檢查叢集狀態,都為 Ready 即可退出指令碼
    • 20、小坑:node節點是需要 admin.conf 檔案並且設定 export KUBECONFIG=/etc/kubernetes/admin.conf 環境變數才可以使用kubectl命令操作叢集的

一、環境準備

1、硬體準備(虛擬主機)

角色 主機名 ip地址
master k8s-master 192.168.112.10
node k8s-node1 192.168.112.20
node k8s-node2 192.168.112.30

2、作業系統版本

CentOS Linux release 7.9.2009 (Core)

相容版本包含7.7~7.9

3、硬體配置

每個虛擬主機都需要至少分配2核CPU、3GB以上記憶體(2C3G)、硬碟20G(VMware Workstation)

4、網路

  • 需要可以訪問外網(ping -c 2 www.baidu.com 測試連通性)
  • 叢集中所有節點之間網路互通(可以提前設定,指令碼里也有相關邏輯)

二、注意點

1、主機命名格式

hostnamectl set-hostname <node-name>

需要與指令碼中預設的叢集列表一一對應,ip地址建議使用靜態ip(nmtui設定)

# 定義主機名與 IP 地址的對映關係
declare -A hosts=(
    ["k8s-master"]="192.168.112.10"
    ["k8s-node1"]="192.168.112.20"
    ["k8s-node2"]="192.168.112.30"
)

2、網路外掛 flannel 映象拉取

主機需要有公鑰私鑰並新增公鑰到 Gitee 的安裝設定中的SSH公鑰

2.1、主機生成公私鑰

ssh-keygen

一路回車即可在 ~/.ssh/ 目錄下發現 id_ras(私鑰)以及id_rsa.pub(公鑰)

image-20240921234533461

2.2、為啥有 Github 還用 Gitee

  • 一方面考慮到 Github 的網路連線不太穩定可能導致克隆倉庫失敗(git clone git@something.git

  • 另一方面就是 Github 對倉庫限制單個檔案大小為 50MB(除非使用 Git LFS 管理檔案),因為有一個映象檔案的大小超過了 50MB

  • 但其實兩者都可以使用(測試過了)

# Github 倉庫地址
git clone git@github.com:misakivv/flannel-needs.git

# Gitee 倉庫地址
git clone git@gitee.com:kurosaki01/flannel-needs.git

對應指令碼修改

替換為你喜歡使用的

# 克隆 Gitee 倉庫
    echo "克隆 Gitee 倉庫..."
    git clone git@gitee.com:kurosaki01/flannel-needs.git

# 檢查克隆倉庫是否成功
if [ $? -ne 0 ]; then
    echo "克隆倉庫失敗,可能的原因包括:"
    echo "1. 目標主機沒有公鑰。"
    echo "2. 公鑰沒有正確設定到 Gitee 上。"
    echo "3. 克隆倉庫時發生網路錯誤。"
    echo "請檢查 SSH 配置和網路連線。"

2.3、將主機公鑰新增到 Gitee

2.3.1、複製主機上的公鑰

cat ~/.ssh/id_rsa.pub

2.3.2、登入碼雲

https://gitee.com/

2.3.3、設定 --> 安全設定 --> SSH公鑰

image-20240921235701220

image-20240921235907042

2.3.4、新增公鑰

標題無所謂

公鑰貼上剛才在主機上覆制的內容

每次新增公鑰都需要輸入賬號密碼(與 Github 流程一致)

每個節點都需要新增哦,不然部署網路外掛時報(ImagePullBackOff)

image-20240922000112559

2.4、將主機公鑰新增到 Github

2.4.1、點選頭像 --> settings

https://github.com/dashboard

image-20240922000653088

2.4.2、左側列表中找到 SSH and GPG keys 點選 New SSH key

新增過程與 Gitee 一致,這裡不再演示

image-20240922001025463

image-20240922000838773

3、阿里雲的映象加速地址

3.1、映象加速器地址

這裡請在指令碼中替換為自己的

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

image-20240922001317387

3.2、對應指令碼的修改位置

# 配置 Docker
echo "配置 Docker..."
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://jzjzrggd.mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://docker.chenby.cn",
    "https://dockerpull.com",
    "https://dockerhub.jobcher.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub.uuuabc.top",
    "https://mirror.baidubce.com",
    "https://mirror.css.tencentyun.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://dockerhub.azk8s.cn",
    "https://registry.cn-hangzhou.aliyuncs.com"
  ]
}
EOF
systemctl daemon-reload && systemctl restart docker.service
echo "Docker 配置完成。"

4、執行指令碼時需要加入叢集的主機都線上

因為指令碼有兩處均需要叢集主機線上(開啟狀態)

4.1、透過 SSH 配置免密登入

# 迴圈遍歷所有節點並複製公鑰,排除 master 節點
for node in "${!hosts[@]}"; do
    if [[ ! $node == *"master"* ]]; then
        ip="${hosts[$node]}"
        echo "複製公鑰到 $node ($ip)"
        ssh-copy-id -i ~/.ssh/id_rsa.pub root@$ip
    else
        echo "跳過 master 節點 $node"
    fi
done

echo "所有非 master 節點的公鑰複製完成。"

4.2、在 master 節點上執行登入各節點執行加入叢集命令

# 從 hosts 對映中獲取所有 worker 節點
for node in "${!hosts[@]}"; do
    if [[ ! $node == *"-master"* ]]; then
        # 在 worker 節點上直接執行 join 命令
        echo "在節點 $node 上執行 join 命令..."
        ssh root@${hosts[$node]} "$JOIN_COMMAND"
    fi
done

5、輸入正確的目標主機名

主要是這塊懶得加邏輯判斷了

別三臺主機執行指令碼還能整出排列組合來:)

這裡只要輸入的主機名在預設的叢集列表中指令碼就繼續執行了,想要最佳化的可以自行新增邏輯

# 迴圈提示使用者輸入主機名,直到輸入正確的主機名
while true; do
    read -p "請輸入目標主機名 (例如: k8s-master/ks8-node1): " hostname

# 檢查輸入的主機名是否存在於對映關係中
    if [[ -n "${hosts[$hostname]}" ]]; then
        break
    else
        echo "錯誤:未知的主機名 '$hostname'。請重新輸入。"
    fi
done

6、指令碼適用性

  • 因為選的 docker 作為容器執行時,使用限定了 k8s 叢集版本必須 < 1.24.x

  • 想要叢集版本大於等於 1.24.x 的自己用換成 containerd吧

# 獲取使用者輸入的 Kubernetes 版本
while true; do
    read -p "請輸入 Kubernetes 版本號(如 1.23.16,建議不超過 1.24.x): " K8S_VERSION

    # 檢查版本號是否符合要求
    if [[ $K8S_VERSION =~ ^1\.([0-9]{1,2})\..* ]] && ((BASH_REMATCH[1] < 24)); then
        break
    else
        echo "錯誤:版本號不符合要求。建議使用 1.23.x 或之前的版本。請重新輸入。"
    fi
done

三、指令碼

vim k8s-install.sh
#!/bin/bash

# 定義停止並禁用 firewalld 的函式
stop_and_disable_firewalld() {
    local max_attempts=$1
    local attempt=0

    while [ $attempt -lt $max_attempts ]; do
        systemctl stop firewalld
        systemctl disable firewalld
        if systemctl is-active --quiet firewalld; then
            echo "Attempt $((attempt+1)): firewalld is still active, attempting to stop and disable again."
            attempt=$((attempt+1))
        else
            echo "firewalld has been successfully disabled and stopped."
            return 0
        fi
    done

    echo "firewalld could not be stopped and disabled after $max_attempts attempts."
    echo "This could be due to:"
    echo "1. A service or process is preventing firewalld from being stopped."
    echo "2. There might be a configuration issue with the firewalld service."
    echo "3. There could be a problem with the system's systemd manager."
    return 1
}

# 主邏輯
check_firewalld_status() {
    if systemctl is-active --quiet firewalld; then
        echo "firewalld is currently active, proceeding to stop and disable."
        if ! stop_and_disable_firewalld 3; then
            echo "Failed to stop and disable firewalld."
        fi
    elif systemctl is-enabled --quiet firewalld; then
        echo "firewalld is not active but is enabled, proceeding to disable."
        systemctl disable firewalld
        echo "firewalld has been successfully disabled."
    else
        echo "firewalld is not active and not enabled, no action needed."
    fi
}

# 執行主邏輯
check_firewalld_status

# 定義一個函式來檢查 SELinux 狀態
check_selinux_status() {
    if getenforce | grep -q "Disabled"; then
        echo "SELinux is already disabled."
        return 0
    else
        echo "SELinux is currently enforcing."
        return 1
    fi
}

# 定義一個函式來更改 SELinux 配置
disable_selinux() {
    # 更改配置檔案中的 SELinux 狀態
    if sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config; then
        echo "SELinux configuration updated in /etc/selinux/config."
    else
        echo "Failed to update SELinux configuration in /etc/selinux/config."
        return 1
    fi

    # 應用更改
    if setenforce 0; then
        echo "SELinux has been temporarily disabled."
    else
        echo "Failed to disable SELinux temporarily."
        return 1
    fi

    return 0
}

# 主邏輯
if check_selinux_status; then
    echo "No action required."
else
    if disable_selinux; then
        echo "SELinux has been disabled."
    else
        echo "Failed to disable SELinux."
    fi
fi

# 臨時關閉 swap
echo "臨時關閉 swap..."
swapoff -a

# 永久關閉 swap (註釋掉 /etc/fstab 中的 swap 行)
echo "永久關閉 swap..."
sed -ri 's/.*swap.*/#&/' /etc/fstab

# 驗證 swap 是否已經被註釋掉
echo "驗證 swap 是否已經被註釋掉..."
cat /etc/fstab | grep swap

# 定義主機名與 IP 地址的對映關係
declare -A hosts=(
    ["k8s-master"]="192.168.112.10"
    ["k8s-node1"]="192.168.112.20"
    ["k8s-node2"]="192.168.112.30"
)

# 迴圈提示使用者輸入主機名,直到輸入正確的主機名
while true; do
    read -p "請輸入目標主機名 (例如: k8s-master/ks8-node1): " hostname

# 檢查輸入的主機名是否存在於對映關係中
    if [[ -n "${hosts[$hostname]}" ]]; then
        break
    else
        echo "錯誤:未知的主機名 '$hostname'。請重新輸入。"
    fi
done

# 遍歷所有主機名與 IP 地址對映關係,並追加到 /etc/hosts 檔案中
for node in "${!hosts[@]}"; do
    ip_address=${hosts[$node]}
    host_line="${ip_address} ${node}"

# 檢查該行是否已經存在於 /etc/hosts 檔案中
    if ! grep -q "$host_line" /etc/hosts; then
# 如果不存在,則追加到 /etc/hosts 檔案中
        echo "$host_line" >> /etc/hosts
        echo "已將 '$node' 新增到 /etc/hosts 檔案中。"
    fi
done

# 驗證使用者輸入的主機名與對應的 IP 地址是否存在於本地的 /etc/hosts 檔案中
ip_address=${hosts[$hostname]}
host_line="${ip_address} ${hostname}"

if grep -q "$host_line" /etc/hosts; then
    echo "主機名 '$hostname' 與對應的 IP 地址 '$ip_address' 已經存在於本地的 /etc/hosts 檔案中。"
else
    echo "主機名 '$hostname' 與對應的 IP 地址 '$ip_address' 未能在本地的 /etc/hosts 檔案中找到,請檢查。"
fi

# 設定 sysctl 引數
echo "設定 sysctl 引數..."
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
echo "sysctl 引數設定完成。"

# 安裝 ntpdate 並同步時間
echo "安裝 ntpdate 並同步時間..."
yum install -y ntpdate
ntpdate time.windows.com
echo "時間同步完成。"

# 安裝 wget
echo "安裝 wget git curl zsh..."
yum install -y wget.x86_64 git curl zsh
echo "wget 安裝完成。"

# 清除原有的 yum 倉庫
echo "清除原有的 yum 倉庫..."
rm -rf /etc/yum.repos.d/*
echo "原有倉庫清除完成。"

# 下載新的倉庫檔案
echo "下載新的倉庫檔案..."
wget -O /etc/yum.repos.d/centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
echo "新的倉庫檔案下載完成。"

# 安裝 Docker
echo "安裝 Docker..."
yum install docker-ce -y
systemctl start docker && systemctl enable docker
echo "Docker 安裝並啟動完成。"

# 配置 Docker
echo "配置 Docker..."
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://jzjzrggd.mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://docker.chenby.cn",
    "https://dockerpull.com",
    "https://dockerhub.jobcher.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub.uuuabc.top",
    "https://mirror.baidubce.com",
    "https://mirror.css.tencentyun.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://dockerhub.azk8s.cn",
    "https://registry.cn-hangzhou.aliyuncs.com"
  ]
}
EOF
systemctl daemon-reload && systemctl restart docker.service
echo "Docker 配置完成。"

# 新增 Kubernetes 倉庫
echo "新增 Kubernetes 倉庫..."
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
echo "Kubernetes 倉庫新增完成。"

# 獲取使用者輸入的 Kubernetes 版本
while true; do
    read -p "請輸入 Kubernetes 版本號(如 1.23.16,建議不超過 1.24.x): " K8S_VERSION

    # 檢查版本號是否符合要求
    if [[ $K8S_VERSION =~ ^1\.([0-9]{1,2})\..* ]] && ((BASH_REMATCH[1] < 24)); then
        break
    else
        echo "錯誤:版本號不符合要求。建議使用 1.23.x 或之前的版本。請重新輸入。"
    fi
done

# 安裝指定版本的 Kubernetes 元件
echo "安裝指定版本的 Kubernetes 元件..."
yum install kubelet-$K8S_VERSION kubeadm-$K8S_VERSION kubectl-$K8S_VERSION -y

# 啟動並啟用 kubelet 服務
echo "啟動並啟用 kubelet 服務..."
systemctl enable kubelet  && systemctl start kubelet

# 檢查 kubelet 是否成功啟動
if systemctl is-active --quiet kubelet; then
    echo "Kubernetes 元件安裝並啟動完成。"
else
    echo "錯誤:kubelet 服務未能成功啟動。請檢查安裝過程是否有誤。"
fi

# 判斷是否為 master 節點
if [[ $hostname == *"-master"* ]]; then
    echo "檢測到當前節點為主節點 '$hostname',執行 kubeadm 初始化..."

# 動態填充 kubeadm init 命令中的引數
    kubeadm init \
        --apiserver-advertise-address=$ip_address \
        --image-repository registry.aliyuncs.com/google_containers \
        --kubernetes-version v$K8S_VERSION \
        --control-plane-endpoint $hostname \
        --service-cidr=172.16.0.0/16 \
        --pod-network-cidr=10.244.0.0/16

# 輸出 kubeadm join 命令並儲存到變數中
    JOIN_COMMAND=$(kubeadm token create --print-join-command)
# 輸出提示資訊
    echo "kubeadm 初始化完成,請記錄以下 join 命令:"
    echo "$JOIN_COMMAND"
	
# 建立 .kube 目錄並複製 admin.conf 檔案
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 設定 KUBECONFIG 環境變數
    export KUBECONFIG=/etc/kubernetes/admin.conf

# 輸出提示資訊
    echo "為了開始使用您的叢集,請執行以下命令:"
    echo "source <(kubectl completion bash)"
	
# 克隆 Gitee 倉庫
    echo "克隆 Gitee 倉庫..."
    git clone git@gitee.com:kurosaki01/flannel-needs.git
	
# 檢查克隆倉庫是否成功
if [ $? -ne 0 ]; then
    echo "克隆倉庫失敗,可能的原因包括:"
    echo "1. 目標主機沒有公鑰。"
    echo "2. 公鑰沒有正確設定到 Gitee 上。"
    echo "3. 克隆倉庫時發生網路錯誤。"
    echo "請檢查 SSH 配置和網路連線。"
else
    # 進入克隆的倉庫目錄
    echo "進入 flannel-needs 目錄..."
    cd flannel-needs || {
        echo "進入 flannel-needs 目錄失敗,可能的原因包括:"
        echo "1. 克隆倉庫未成功建立目錄。"
        echo "2. 當前目錄不存在 flannel-needs 子目錄。"
        echo "請檢查克隆倉庫是否成功。"
    }
fi

# 載入 Docker 映象
    echo "載入 Docker 映象..."
    docker load -i lizhenliang-flannel-v0.11.0-amd64.tar
    docker load -i ranche-mirrored-flannelcni-flannel-cni-plugin.tar

# 應用 Flannel 配置
    echo "應用 Flannel 配置..."
    kubectl apply -f flannel.yaml

# 輸出提示資訊
    echo "Flannel 配置已應用,網路外掛已準備好。"
    
# 迴圈遍歷所有節點並複製公鑰,排除 master 節點
for node in "${!hosts[@]}"; do
    if [[ ! $node == *"master"* ]]; then
        ip="${hosts[$node]}"
        echo "複製公鑰到 $node ($ip)"
        ssh-copy-id -i ~/.ssh/id_rsa.pub root@$ip
    else
        echo "跳過 master 節點 $node"
    fi
done

echo "所有非 master 節點的公鑰複製完成。"

# 從 hosts 對映中獲取所有 worker 節點
for node in "${!hosts[@]}"; do
    if [[ ! $node == *"-master"* ]]; then
        # 在 worker 節點上直接執行 join 命令
        echo "在節點 $node 上執行 join 命令..."
        ssh root@${hosts[$node]} "$JOIN_COMMAND"
    fi
done

# 從預設的叢集列表中獲取預期的節點數量
EXPECTED_COUNT=${#hosts[@]}

# 獲取當前已加入叢集的節點數量
CURRENT_COUNT=$(kubectl get nodes | grep -v NAME | wc -l)

# 獲取當前已加入叢集的節點名稱
CURRENT_NODES=$(kubectl get nodes | awk 'NR>1{print $1}')

# 迴圈檢查直到所有預期的節點都已加入叢集並且狀態為 Ready
while [ $CURRENT_COUNT -ne $EXPECTED_COUNT ]; do
    echo "當前已加入叢集的節點數量 ($CURRENT_COUNT) 與預期數量 ($EXPECTED_COUNT) 不匹配,請等待..."
    sleep 10  # 等待10秒後再次檢查
    CURRENT_COUNT=$(kubectl get nodes | grep -v NAME | wc -l)
    CURRENT_NODES=$(kubectl get nodes | awk 'NR>1{print $1}')
done

# 檢查所有節點的狀態是否為 Ready=True
while true; do
    NODES_STATUS=$(kubectl get nodes -o jsonpath='{range .items[*]}{.status.conditions[-1:].type}{"="}{.status.conditions[-1:].status}{"\n"}{end}')
    
    # 使用陣列儲存每個節點的狀態
    IFS=$'\n' read -d '' -r -a nodeStatusArray <<< "$NODES_STATUS"
    
    # 標記所有節點是否都 Ready
    allReady=true
    
    for status in "${nodeStatusArray[@]}"; do
        if [[ $status != "Ready=True" ]]; then
            allReady=false
            break
        fi
    done
    
    if $allReady; then
        echo "所有節點的狀態均為 Ready,叢集安裝成功。"
        break
    else
        echo "叢集中有節點狀態不是 Ready,請等待..."
        sleep 10  # 等待10秒後再次檢查
    fi
done

# 輸出當前叢集節點狀態
echo "檢查叢集節點狀態..."
kubectl get nodes

else
    echo "檢測到當前節點為 worker 節點 '$hostname',執行命令..."

# "檢測到當前節點為 worker 節點 '$hostname',執行命令..."

# 克隆 Gitee 倉庫
    echo "克隆 Gitee 倉庫..."
    git clone git@gitee.com:kurosaki01/flannel-needs.git

# 檢查克隆倉庫是否成功
if [ $? -ne 0 ]; then
    echo "克隆倉庫失敗,可能的原因包括:"
    echo "1. 目標主機沒有公鑰。"
    echo "2. 公鑰沒有正確設定到 Gitee 上。"
    echo "3. 克隆倉庫時發生網路錯誤。"
    echo "請檢查 SSH 配置和網路連線。"
    
else
    # 進入克隆的倉庫目錄
    echo "進入 flannel-needs 目錄..."
    cd flannel-needs || {
        echo "進入 flannel-needs 目錄失敗,可能的原因包括:"
        echo "1. 克隆倉庫未成功建立目錄。"
        echo "2. 當前目錄不存在 flannel-needs 子目錄。"
        echo "請檢查克隆倉庫是否成功。"
    }
fi

# 載入 Docker 映象
    echo "載入 Docker 映象..."
    docker load -i lizhenliang-flannel-v0.11.0-amd64.tar
    docker load -i ranche-mirrored-flannelcni-flannel-cni-plugin.tar

# 輸出提示資訊
    echo "Docker 映象已載入,worker 節點準備完畢。"
	
# 提示使用者在 master 節點上檢查叢集狀態
    echo "請在 master 節點上執行 'kubectl get nodes' 來檢查叢集狀態。"
fi

四、例項演示

1、硬體準備

image-20240922004359969 image-20240922004425278 image-20240922004452023

2、**,啟動!

hostnamectl set-hostname <hostname>

bash

hostname
image-20240922004845284 image-20240922004820629 image-20240922004757656

3、建立指令碼檔案(CV大法)

vim k8s-install.sh

4、執行指令碼

bash k8s-install.sh

5、判斷並關閉完firewalld、selinux、swap 後輸入目標主機名

輸入 k8s-master
image-20240922005551225
輸入 k8s-node1
image-20240922005608245
輸入 k8s-node2
image-20240922005642113

6、master節點將預設的叢集列表一個個追加到/etc/hosts檔案中,所有節點執行判斷邏輯

image-20240922010253406
image-20240922010401758
image-20240922010422813

7、所有節點設定 sysctl 引數,安裝 ntpdate 並同步時間

image-20240922010546964
image-20240922010623422
image-20240922010654943

8、安裝 wget git curl zsh...(pass)

不截圖,太長了

9、清除原有的 yum 倉庫,下載新的倉庫檔案

當然了,涉及到 rm 刪除操作可以新增備份的邏輯

我就懶得搞(快照)

image-20240922011245695
image-20240922011327439
image-20240922011357208

10、安裝,配置 Docker 、新增 Kubernetes 倉庫(pass)

硬編碼一般沒什麼問題

11、輸入想要安裝的 k8s 版本

此指令碼只適用 k8s < 1.24.0 版本的

想要高版本自行修改

image-20240922012214265
image-20240922012335232
image-20240922012304908

12、安裝三件套kubelet、kubeadm、kubectl(pass)

13、node節點:克隆映象倉庫

輸入 yes
image-20240922013615991
輸入 yes
image-20240922013637960

14、載入 Docker 映象

k8s-node1: 我滴使命完成啦
image-20240922015311806
k8s-node2: 我滴使命也完成啦
image-20240922015423351

15、master 節點 kubeadm 初始化好了以後儲存 kubeadm join 命令為環境變數、建立 .kube 目錄並複製 admin.conf 檔案以及設定 KUBECONFIG 環境變數、kubectl 設定命令補全

image-20240922020036634

16、克隆映象倉庫,部署網路外掛

image-20240922020133551

17、master 節點配置免密登入

需要輸入 k8s-node1、k8s-node2 的登入密碼

image-20240922020511525

18、透過 SSH 登入 node 節點執行 join 操作

k8s-master:done

image-20240922020315496

19、每十秒檢查叢集狀態,都為 Ready 即可退出指令碼

image-20240922020813978

20、小坑:node節點是需要 admin.conf 檔案並且設定 export KUBECONFIG=/etc/kubernetes/admin.conf 環境變數才可以使用kubectl命令操作叢集的

解決辦法詳見這篇:centos7.9部署k8s的幾種方式

image-20240922021302739

想最佳化指令碼的自己最佳化吧,我後續會把坑補上並且設定花裡胡哨的 oh-my-zsh + p10k

畢竟這指令碼寫的還是比較拉的

相關文章