要安裝 kubeadm 需要使用 Linux 環境,我會使用 VirtualBox 來建立。另外為了快速建立與設定多個 VM,我使用 Vagrant 來快速設定需要的 VM 數量、系統以及使用資源。
先來看個流程:
role | OS | 記憶體 | CPU |
---|---|---|---|
master | Ubuntu | 2 GB | 2 |
worker1 | Ubuntu | 2 GB | 2 |
安裝步驟很簡單,可以直接至官網下載自行安裝。這邊也可以直接在 VirtualBox 啟動兩個 VM 來使用,我使用 Vagrant 來幫我快速建置 VM。
Vagrant 是一個開源的虛擬化工具,用來在本地主機上建立和管理虛擬機器。Vagrant 可以透過 VirtualBox 來建立和管理虛擬機器。除 VirtualBox 外也支援 VMware Fusion 和 Hyper-V。
Vagrant 使用 Vagrantfile
來定義 VM 的設定。Vagrantfile 是一個簡單的 YAML 檔案,包含了 VM 的名稱、作業系統、配置和其他資訊。
意思只要事先設定好 Vagrantfile
,就可以讓 Vagrant 幫我建立 VM,非常輕鬆。
前往官方網站,選擇本機的系統,例如我的是 Windows、x64 型處理器,選擇 AMD64。這裡的 AMD64 是指 64 位元作業系統、i686 是指 32 位元的。(突然從macOS 換到 Windows 是因為拿其他台電腦來安裝 kubeadm)
安裝完會需要重新開機。
開機後輸入指令查看是否安裝成功:
vagrant
以下指令可以看版本:
vagrant version
我這邊主要參考 kubernetes-vagrant 這篇中的 Vagrantfile,把他拉下來、再另外參考 certified-kubernetes-administrator-course 中的內容修改 kunbernetes-vagrant/Vagrantfile
。
Vagrantfile 修改內容如下:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
# Disable check update
config.vm.box_check_update = false
# Change to add more workers
NodeCount = 1
#global requirements
config.vm.provision "shell", path: "requirements.sh", :args => NodeCount
# Kubernetes Master
config.vm.define "master" do |master|
master.vm.box = "ubuntu/bionic64"
master.vm.hostname = "master"
master.vm.network "private_network", ip: "192.168.10.100"
master.vm.network "forwarded_port", guest: 22, host: "#{27100}"
master.vm.provider "virtualbox" do |v|
v.name = "master"
v.memory = 2048
v.cpus = 2
end
master.vm.provision "setup-dns", type: "shell", :path => "set-dns.sh"
# master.vm.provision "shell", path: "master.sh"
master.vm.box_download_insecure = true
end
(1..NodeCount).each do |i|
config.vm.define "worker#{i}" do |worker|
worker.vm.box = "ubuntu/bionic64"
worker.vm.hostname = "worker#{i}"
worker.vm.network "private_network", ip: "192.168.10.#{i+1}"
worker.vm.network "forwarded_port", guest: 22, host: "#{2720 + i}"
worker.vm.provider "virtualbox" do |v|
v.name = "worker#{i}"
v.memory = 2048
v.cpus = 2
end
worker.vm.provision "setup-dns", type: "shell", :path => "set-dns.sh"
# worker.vm.provision "shell", path: "worker.sh"
worker.vm.box_download_insecure = true
end
end
end
除此之外,也參考之前大大的文章前五個步驟,改寫原有的 kunbernetes-vagrant/requirements.sh
:
#!/bin/bash
# Step 1: 更新 repositpories
echo "[STEP 1] update repositpories"
apt-get update
# Step 2: Disable swap
echo "[STEP 2] Disable SWAP"
sed -i '/swap/d' /etc/fstab
swapoff -a
# Step 3: 設定 DNS - 修改 host file
echo "[STEP 3] update hosts"
echo '192.168.10.100 master master' | tee -a /etc/hosts
init=2
stop=$1+1
for ((c = $init; c <= $stop; c++)); do
worker="$(($c - 1))"
echo "192.168.10.$c worker$worker worker$worker" | tee -a /etc/hosts
done
# Step 4: 安裝 ssh
apt-get update && apt-get install openssh-server -y
參考 certified-kubernetes-administrator-course 的 setup-dns.sh
,另新增 kunbernetes-vagrant/set-dns.sh
檔案:
#!/bin/bash
echo "[Setup DNS]"
sed -i -e 's/#DNS=/DNS=8.8.8.8/' /etc/systemd/resolved.conf
service systemd-resolved restart
檔案都準備好後可以開始建立 VM,先查看當前狀態:
這邊特別要注意在使用 Vagrant 之前記得先開啟 VirtualBox,不然很有可能在執行 vagrant up 時卡在 kubemaster: SSH auth method: private key !
cd kubernetes-vagrant
vagrant status
Current machine states:
master poweroff (virtualbox)
worker1 poweroff (virtualbox)
This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
因為我之前建立過,若是還沒建立時會是 not created:
啟動:
vagrant up
查看機器狀態:
vargrant status
Current machine states:
master running (virtualbox)
worker1 running (virtualbox)
此時可以用 ssh 去連線 master 或 worker1,這邊建議開兩個小黑窗待會會個別連過去 VM 進行安裝,如果你是使用 mac 我會推薦一款 Terminal 為 Warp,介面好看功能強大。
連 master:
vagrant ssh master
連 worker1:
vagrant ssh worker1
如果要回到本機 (但等等要開始安裝請先不要執行):
logout
接著就開始相較之前的 kind 更為冗長的安裝過程了。
這邊我們使用 containerd,叢集中的每台機器 (node) 都必須安裝。
以下三個格子請分別到 master、worker1 的終端機裡面執行複製、貼上並執行動作。這邊都是按照官方文件的步驟輸入指令:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# Apply sysctl params without reboot
sudo sysctl --system
lsmod | grep br_netfilter
lsmod | grep overlay
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
安裝步驟可以參考 Getting started with containerd。我這邊是使用第一種二進制檔來安裝(步驟好像比較多),你也可以選擇用 apt-get 來安裝。若使用二進制檔安裝可以在所有 Linux 發行版上執行。
下載 containerd,我這邊是直接在家目錄下載檔案
wget https://github.com/containerd/containerd/releases/download/v1.6.24/containerd-1.6.24-linux-amd64.tar.gz
下載完會建議你要去執行以下指令去比對 checksum(檢查碼),檢查下載的檔案是不是正確的。
sha256sum containerd-1.6.24-linux-amd64.tar.gz
可以與官網上做比對是否有異:containerd-1.6.24-linux-amd64.tar.gz.sha256sum
(下載的檔案後面有 sha256sum 副檔名)
解壓縮到指定目錄下
sudo tar Cxzvf /usr/local containerd-1.6.24-linux-amd64.tar.gz
若透過 systemd 來啟動 containerd,可以下載 containerd.service
並執行
sudo mkdir -p /usr/local/lib/systemd/system
sudo curl -o /usr/local/lib/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
查看 containerd 服務
systemctl status containerd
下載並安裝 runc
wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64
sudo install -m 755 runc.amd64 /usr/local/sbin/runc
cgroup drivers 是用來管理容器資源的一種方式。讓 Kubernetes 可以將容器限制在特定的資源配額中,確保容器間不會相互干擾,資源就像是 CPU、記憶體和磁碟空間。
Container runtime 與 kubelet 都有一個 cgroup driver 的屬性要設定,要特別注意 container runtime 與 kubelet 使用的 driver 必須是同一種,不能一個用 cgroupfs,另一個用 systemd。
目前 Kubernetes 支持兩種 cgroup drivers:
可以在 master 和 worker1 輸入以下指令列出目前系統上所有執行中的程序,查看兩台機器目前使用的 init 系統:
ps -p 1
PID TTY TIME CMD
1 ? 00:00:04 systemd
systemd 是系統的 init 程序,負責啟動和管理其他所有程序。
可以看到系統使用的是 systemd,在此情況時官方文件是建議使用 systemd cgroup driver。
那因為在 v1.22 的版本後,kubeadm 預設將 kubelet 作為 systemd 服務進行管理,故在 container runtime 這邊也是選擇 systemd 較為合適。
先產生 containerd 的預設文件 config.toml 並複製到指定目錄下
sudo mkdir /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
設定 cgroup driver 為 systemd
sudo vi /etc/containerd/config.toml
:%d # 按下 enter 刪除所有內容
替換成以下內容:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
重啟 containerd
sudo systemctl restart containerd
接著安裝 kubeadm、kubelet 跟 kubectl,master 跟 worker1 都要安裝。複習一下:
更新 apt
套件
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl
下載 Kubernetes 資源需要的 public signing key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
新增 repository (其實這邊就是看官方文件複製貼上 XD)
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
安裝 kubelet、kubeadm 和 kubectl
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
查看是否安裝成功
kubeadm
明天接著上...。