起因
去年初我開始系統(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.sh和worker/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,kubelet和kubectl。
控制面配置完成以后才可以配置工作節(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,kubelet和kubectl 的腳本。完全按照官方kubeadm 安裝文檔執(zhí)行。
install.sh有兩個(gè)參數(shù):K8S 版本和安裝包鏡像。安裝包鏡像可以為空,采用默認(rèn)的packages.k8s.io或阿里云鏡像源。
install.sh的執(zhí)行步驟如下:
- 修改 docker 的配置,使用 systemd 來管理容器的 cgroup。
- 配置網(wǎng)絡(luò), 允許 iptables 檢查橋接流量。
- 關(guān)閉系統(tǒng)交換區(qū)(swap area)。
- 自動(dòng)識(shí)別
apt和yum并安裝kubeadm相關(guān)軟件包。
控制面配置腳本 /facility/k8s/setup-control-panel.sh 說明
setup-control-panel.sh是用來配置控制面的腳本。必須在/facility/k8s/install.sh安裝之后執(zhí)行。
setup-control-panel.sh主要做以下幾件事:
- 通過
firewall-cmd配置k8s 集群所用端口。 - 安裝配置 K8S 等控制面組件:
kube-apiserver。 - 安裝配置 Pod 網(wǎng)絡(luò)插件。支持
calico和fannel,默認(rèn)選擇calico。 - 生成自動(dòng)加入集群的腳本
join-cluster.sh并通過8000端口暴露出來,讓工作節(jié)點(diǎn)可以啟動(dòng)后自動(dòng)加入集群。 - 安裝 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!