- 一、環境準備
- 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(公鑰)
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公鑰
2.3.4、新增公鑰
標題無所謂
公鑰貼上剛才在主機上覆制的內容
每次新增公鑰都需要輸入賬號密碼(與 Github 流程一致)
每個節點都需要新增哦,不然部署網路外掛時報(ImagePullBackOff)
2.4、將主機公鑰新增到 Github
2.4.1、點選頭像 --> settings
https://github.com/dashboard
2.4.2、左側列表中找到 SSH and GPG keys 點選 New SSH key
新增過程與 Gitee 一致,這裡不再演示
3、阿里雲的映象加速地址
3.1、映象加速器地址
這裡請在指令碼中替換為自己的
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
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、硬體準備
2、**,啟動!
hostnamectl set-hostname <hostname>
bash
hostname
3、建立指令碼檔案(CV大法)
vim k8s-install.sh
4、執行指令碼
bash k8s-install.sh
5、判斷並關閉完firewalld、selinux、swap 後輸入目標主機名
輸入 k8s-master |
---|
輸入 k8s-node1 |
輸入 k8s-node2 |
6、master節點將預設的叢集列表一個個追加到/etc/hosts檔案中,所有節點執行判斷邏輯
7、所有節點設定 sysctl 引數,安裝 ntpdate 並同步時間
8、安裝 wget git curl zsh...(pass)
不截圖,太長了
9、清除原有的 yum 倉庫,下載新的倉庫檔案
當然了,涉及到 rm 刪除操作可以新增備份的邏輯
我就懶得搞(快照)
10、安裝,配置 Docker 、新增 Kubernetes 倉庫(pass)
硬編碼一般沒什麼問題
11、輸入想要安裝的 k8s 版本
此指令碼只適用 k8s < 1.24.0 版本的
想要高版本自行修改
12、安裝三件套kubelet、kubeadm、kubectl(pass)
13、node節點:克隆映象倉庫
輸入 yes |
---|
輸入 yes |
14、載入 Docker 映象
k8s-node1: 我滴使命完成啦 |
---|
k8s-node2: 我滴使命也完成啦 |
15、master 節點 kubeadm 初始化好了以後儲存 kubeadm join 命令為環境變數、建立 .kube 目錄並複製 admin.conf 檔案以及設定 KUBECONFIG 環境變數、kubectl 設定命令補全
16、克隆映象倉庫,部署網路外掛
17、master 節點配置免密登入
需要輸入 k8s-node1、k8s-node2 的登入密碼
18、透過 SSH 登入 node 節點執行 join 操作
k8s-master:done
19、每十秒檢查叢集狀態,都為 Ready 即可退出指令碼
20、小坑:node節點是需要 admin.conf 檔案並且設定 export KUBECONFIG=/etc/kubernetes/admin.conf 環境變數才可以使用kubectl命令操作叢集的
解決辦法詳見這篇:centos7.9部署k8s的幾種方式
想最佳化指令碼的自己最佳化吧,我後續會把坑補上並且設定花裡胡哨的 oh-my-zsh + p10k
畢竟這指令碼寫的還是比較拉的