通過 Vagrant 一鍵初始化 K8S 集群

起因

去年初我開始系統(tǒng)學(xué)習(xí) K8S,就想能生成一個(gè)集群環(huán)境。查看了一下官方文檔,步驟很多。網(wǎng)上的一些資源已經(jīng)過期或者不可用,再加上各種資源的變更和國內(nèi)不可訪問。

不得不說,在家按照官方文檔搭建一個(gè)標(biāo)準(zhǔn)的 K8S 集群真是太難了!

所以我就自己構(gòu)建了一個(gè)最小的 K8S 集群環(huán)境,放在了我的 provisioner 代碼庫里?,F(xiàn)在這個(gè)開源代碼庫可以自動(dòng)一鍵建立一個(gè)擁有一個(gè)控制節(jié)點(diǎn)和兩個(gè)工作節(jié)點(diǎn)的最小K8S集群,可以反復(fù)銷毀和啟動(dòng)。

過年在家的時(shí)間就對(duì)相關(guān)的腳本進(jìn)行了完善,項(xiàng)目地址可參考:https://github.com/wizardbyron/provisioners,本文是對(duì)相關(guān)腳本的說明。

關(guān)于 Provisioner 項(xiàng)目

Provisioners 是我個(gè)人用于構(gòu)建“最小可用集群”的一站式自動(dòng)化腳本庫。是我練習(xí)構(gòu)建各種系統(tǒng)工具的一站式腳本收集倉庫。它默認(rèn)會(huì)通過 vagrant啟動(dòng)三個(gè)虛擬機(jī),分別是管理節(jié)點(diǎn)(admin)和兩個(gè)工作節(jié)點(diǎn)(node-1和node-2,最大支持到node-9)。管理節(jié)點(diǎn)的 IP 是192.168.56.10。工作節(jié)點(diǎn)是192.68.56.11~192.168.56.19。你可以通過修改Vagrantfile調(diào)整數(shù)量。

Provisioners 分為solution(解決方案)和facility(設(shè)施)兩個(gè)腳本目錄。

facility 里面則是單個(gè)工具的初始化腳本,包含各個(gè)工具的一鍵式初始化腳本。

solution 則是利用facility里的工具腳本組合成的解決方案,包括管理節(jié)點(diǎn)和工作節(jié)點(diǎn)。

此外,essential里包含了init.sh腳本,這是用于統(tǒng)一初始化 Linux 節(jié)點(diǎn)的統(tǒng)一基礎(chǔ)腳本。而對(duì)于管理節(jié)點(diǎn)和工作節(jié)點(diǎn)的自動(dòng)化初始配置則在solution目錄里每個(gè)解決方案下的admin/setup.shworker/setup.sh里。

Vagrantfile 配置說明

這個(gè) Vagrantfile 的核心配置都寫在了文件的前面。修改其中的參數(shù)可以改變集群相關(guān)配置。

SOLUTION = "k8s" # default/devops/k8s
BOXES ={
  "ubuntu" => "ubuntu/focal64",
  "centos" => "centos/7"
}

# 支持BOXES里面列出的 vbox 虛擬機(jī)鏡像
DISTRO = "centos" 

# Linux 發(fā)行版軟件鏡像源:空(官方)/tencent(騰訊軟件源)/aliyun(阿里云軟件源)
MIRROR = "aliyun" 

# 最新的 Vagrant 版本強(qiáng)制了 CIDR,我保留了 1-9 的IP,并且將這個(gè)初始IP作為管理節(jié)點(diǎn)IP
ADMIN_IP = "192.168.56.10" 

# 調(diào)整工作節(jié)點(diǎn)數(shù),根據(jù)你的資源增加,一般學(xué)習(xí)的話兩個(gè)夠了。
NODES = 2 

# 用于登錄 Docker 鏡像倉庫,默認(rèn)為docker.io
DOCKER_REGISTRY = "<>"
DOCKER_USERNAME = "<username for docker registry>"
DOCKER_PASSWORD = "<password for docker registry>"

默認(rèn)控制面的主機(jī)名是admin,IP 是192.168.56.10。工作節(jié)點(diǎn)是node-<數(shù)字>,根據(jù)你的內(nèi)存資源,你可以增加節(jié)點(diǎn)的數(shù)量。

最后只要運(yùn)行vagrant up就可以啟動(dòng)你的集群,如果因?yàn)橄螺d某些東西超時(shí)(比如鏡像或者安裝包),可以切換鏡像重新試一下。

如果虛擬機(jī)全部初始化完成,你可以通過kubectl get nodes看到多個(gè)集群。

我一般會(huì)在搭建完控制面之后用watch kubectl get ndoes持續(xù)跟蹤集群的搭建情況。

還是再說一句,在家按照官方文檔搭建一個(gè)標(biāo)準(zhǔn)的 K8S 集群真是太難了!

K8S 解決方案配置腳本說明

K8S 解決方案腳本主要分控制面配置和工作節(jié)點(diǎn)配置兩個(gè)腳本,每個(gè)腳本都需要安裝 kubeadm,kubeletkubectl。

控制面配置完成以后才可以配置工作節(jié)點(diǎn),因?yàn)樾枰尤肟刂泼娴膖oken等一些信息。

控制面節(jié)點(diǎn)配置腳本 solution/k8s/admin.sh 說明

控制面安裝要在管理節(jié)點(diǎn)上先通過/facility/k8s/install.sh安裝安裝 kubeadm 再進(jìn)行通過 kubeadm配置。

#!/usr/bin/env bash
PATH=$PATH:/home/$(whoami)/.local/bin
export CONTROL_PANEL_IP=$1
echo "CONTROL PANEL IP: $CONTROL_PANEL_IP"

MIRROR="aliyun" # <empty>/aliyun
KUBE_VERSION="1.23.0-0"
sh -c "/vagrant/facility/k8s/install.sh $KUBE_VERSION $MIRROR"
sh -c "/vagrant/facility/k8s/setup-control-panel.sh $CONTROL_PANEL_IP $MIRROR"

參數(shù)說明:

  • CONTROL_PANEL_IP: K8S控制面的IP地址,由外部傳入。
  • MIRROR: K8S所用的A鏡像,除了apt源和yum源,還有k8s集群所需要的docker鏡像,目前僅支持阿里云(唯一提供免費(fèi)k8s鏡像源)。如果為空,則會(huì)去查找官方鏡像。
  • KUBE_VERSION: K8S 的版本,可以指定版本版本。

工作節(jié)點(diǎn)腳本配置腳本 /solution/k8s/node.sh 說明

工作節(jié)點(diǎn)配置腳本和控制面配置腳本類似,都是先通過/facility/k8s/install.sh安裝kubeadm,然后才進(jìn)行配置。只是工作節(jié)點(diǎn)要在控制面配置完之后啟動(dòng)。

#!/usr/bin/env bash
PATH=$PATH:/home/$(whoami)/.local/bin
export CONTROL_PANEL_IP=$1
echo "CONTROL PANEL IP: $CONTROL_PANEL_IP"

MIRROR="aliyun" # <empty>/aliyun
KUBE_VERSION="1.23.0-0"

sh -c "/vagrant/facility/k8s/install.sh $KUBE_VERSION $MIRROR"
sh -c "/vagrant/facility/k8s/setup-worker-node.sh $CONTROL_PANEL_IP"

參數(shù)說明:

  • CONTROL_PANEL_IP: K8S控制面的IP地址,由外部傳入。
  • MIRROR: K8S所用的A鏡像,除了apt源和yum源,還有k8s集群所需要的docker鏡像,目前僅支持阿里云(唯一提供免費(fèi)k8s鏡像源)。如果為空,則會(huì)去查找官方鏡像。
  • KUBE_VERSION: K8S 的版本,可以指定版本,但要和控制面的版本一致,否則會(huì)出問題。

K8S facility 腳本說明

K8S facility 腳本包括三個(gè)腳本:

初始安裝腳本 /facility/k8s/install.sh 說明

install.sh是初始化 linux 配置并安裝 kubeadm,kubeletkubectl 的腳本。完全按照官方kubeadm 安裝文檔執(zhí)行。

install.sh有兩個(gè)參數(shù):K8S 版本和安裝包鏡像。安裝包鏡像可以為空,采用默認(rèn)的packages.k8s.io或阿里云鏡像源。

install.sh的執(zhí)行步驟如下:

  1. 修改 docker 的配置,使用 systemd 來管理容器的 cgroup。
  2. 配置網(wǎng)絡(luò), 允許 iptables 檢查橋接流量。
  3. 關(guān)閉系統(tǒng)交換區(qū)(swap area)。
  4. 自動(dòng)識(shí)別aptyum并安裝kubeadm相關(guān)軟件包。

控制面配置腳本 /facility/k8s/setup-control-panel.sh 說明

setup-control-panel.sh是用來配置控制面的腳本。必須在/facility/k8s/install.sh安裝之后執(zhí)行。

setup-control-panel.sh主要做以下幾件事:

  1. 通過firewall-cmd配置k8s 集群所用端口。
  2. 安裝配置 K8S 等控制面組件:kube-apiserver。
  3. 安裝配置 Pod 網(wǎng)絡(luò)插件。支持calicofannel,默認(rèn)選擇calico。
  4. 生成自動(dòng)加入集群的腳本join-cluster.sh并通過8000端口暴露出來,讓工作節(jié)點(diǎn)可以啟動(dòng)后自動(dòng)加入集群。
  5. 安裝 helm。

工作節(jié)點(diǎn)配置腳本 /facility/k8s/setup-work-node.sh 說明

setup-work-node.sh的腳本比較簡(jiǎn)單,除了通過firewall-cmd打開所需端口以外,就是下載并執(zhí)行控制面上的加入集群腳本。

從 MVP 開始

由于目前這是最小可用集群,如果你想增加自定義腳本可以在facility里自動(dòng)化安裝增加并且在solution自動(dòng)化配置。

下一步可能會(huì)減少參數(shù)配置,盡量用內(nèi)部的 DNS 服務(wù)取代 IP 的配置。

歡迎來https://github.com/wizardbyron/provisioners提 Issue 和 PR!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容