iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
DevOps

第一次參賽就學 Kubernetes系列 第 5

[Day 05] kubeadm 建置環境 (上篇)

  • 分享至 

  • xImage
  •  

安裝 kubeadm

要安裝 kubeadm 需要使用 Linux 環境,我會使用 VirtualBox 來建立。另外為了快速建立與設定多個 VM,我使用 Vagrant 來快速設定需要的 VM 數量、系統以及使用資源。

先來看個流程:

  1. 準備實體機或虛擬機
  2. 安裝 Container Runtime (containerd)
  3. 安裝 kubeadm
  4. 初始化 master
  5. 安裝 Container Network Interface (Weave Net)
  6. worker 加入叢集

1. 準備實體機或虛擬機

VM 配置如下

role OS 記憶體 CPU
master Ubuntu 2 GB 2
worker1 Ubuntu 2 GB 2

安裝 VirtualBox

安裝步驟很簡單,可以直接至官網下載自行安裝。這邊也可以直接在 VirtualBox 啟動兩個 VM 來使用,我使用 Vagrant 來幫我快速建置 VM。

安裝 Vagrant

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)

https://ithelp.ithome.com.tw/upload/images/20230920/20162511dOV7hQmwni.png

安裝完會需要重新開機。

開機後輸入指令查看是否安裝成功:

vagrant

https://ithelp.ithome.com.tw/upload/images/20230920/20162511VpHddR5Ny6.png

以下指令可以看版本:

vagrant version

Vagrantfile

我這邊主要參考 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-coursesetup-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 更為冗長的安裝過程了。


2. 安裝 Container Runtime (containerd)

這邊我們使用 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

安裝 containerd

安裝步驟可以參考 Getting started with containerd。我這邊是使用第一種二進制檔來安裝(步驟好像比較多),你也可以選擇用 apt-get 來安裝。若使用二進制檔安裝可以在所有 Linux 發行版上執行。

  1. 下載 containerd,我這邊是直接在家目錄下載檔案

    wget https://github.com/containerd/containerd/releases/download/v1.6.24/containerd-1.6.24-linux-amd64.tar.gz
    
  2. 下載完會建議你要去執行以下指令去比對 checksum(檢查碼),檢查下載的檔案是不是正確的。

    sha256sum containerd-1.6.24-linux-amd64.tar.gz
    

    可以與官網上做比對是否有異:containerd-1.6.24-linux-amd64.tar.gz.sha256sum (下載的檔案後面有 sha256sum 副檔名)

  3. 解壓縮到指定目錄下

    sudo tar Cxzvf /usr/local containerd-1.6.24-linux-amd64.tar.gz
    
  4. 若透過 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
    
  5. 查看 containerd 服務

    systemctl status containerd
    
  6. 下載並安裝 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

cgroup drivers 是用來管理容器資源的一種方式。讓 Kubernetes 可以將容器限制在特定的資源配額中,確保容器間不會相互干擾,資源就像是 CPU、記憶體和磁碟空間。

Container runtime 與 kubelet 都有一個 cgroup driver 的屬性要設定,要特別注意 container runtime 與 kubelet 使用的 driver 必須是同一種,不能一個用 cgroupfs,另一個用 systemd。

目前 Kubernetes 支持兩種 cgroup drivers:

  • cgroupfs:預設的 cgroup driver。
  • systemd:使用 systemd 服務來管理資源配額。

可以在 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 的 cgroup driver

  1. 先產生 containerd 的預設文件 config.toml 並複製到指定目錄下

    sudo mkdir /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    
  2. 設定 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
    
  3. 重啟 containerd

    sudo systemctl restart containerd
    

3. 安裝 kubeadm

接著安裝 kubeadm、kubelet 跟 kubectl,master 跟 worker1 都要安裝。複習一下:

  • kubeadm:操作叢集。
  • kubelet:負責接收來自 API Server 的請求並執行。
  • kubectl:與叢集溝通、從而操作叢集中的資源。
  1. 更新 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
    
  2. 下載 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
    
  3. 新增 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
    
  4. 安裝 kubelet、kubeadm 和 kubectl

    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
    
  5. 查看是否安裝成功

    kubeadm
    

明天接著上...。


參考資源

  1. Kubernetes for the Absolute Beginners - Hands-on
  2. kubernetes-vagrant
  3. certified-kubernetes-administrator-course
  4. 【從題目中學習k8s】-【Day3】建立K8s Cluster環境-以kubeadm為例
  5. Kubernetes - Installing kubeadm
  6. Getting started with containerd
  7. Kubernetes - Container runtime

上一篇
[Day 04] 使用 kind、minikube 建立環境
下一篇
[Day 06] kubeadm 建置環境 (下篇)
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言