筆記 | 在 Ubuntu 22.04 安裝 Kubernetes Cluster

筆記 | 在 Ubuntu 22.04 安裝 Kubernetes Cluster
Photo by Growtika / Unsplash

許多網路文章中都有安裝 kubernetes cluster 的教學,也因為版本更迭,爬了很多的文章、裝了非常多次,整理以下的筆記,幫自己防忘記。

實作環境

  • 主機 (VM) 3 台,一台 master、兩台 node
    • pve-master
    • pve-node1
    • pve-node2
  • 作業系統 Ubuntu 22.04
  • Container Runtime 選擇 containerd.io

筆記的幾個大步驟,有些是所有節點都要做,有些則否,整理如底下的表格:

Step pve-master pve-node1 pve-node2
安裝前置 V V V
安裝 Container Runtime V V V
安裝 kubeadm V V V
建立 Kubernetes Control-Plane Node V
建立 Kubernetes Worker Node V V

安裝前置

  • 更新系統套件至最新

    sudo apt update
    sudo apt upgrade
  • 關閉系統交換區
    參考 kubeadm 的安裝前說明

    sudo swapoff -a
    #目的是註解 /etc/fstab 裡的 swap
    sudo sed -i '/swap/s/^/#/' /etc/fstab
  • 調整 iptables 規則及啟用 IPv4 封包轉發

    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
  • 載入 k8s 需要的核心模組

    sudo modprobe overlay
    sudo modprobe br_netfilter
  • 重新載入設定以生效

    sudo sysctl --system

安裝 Container Runtime

  • 安裝需要的套件
    OS 預設應該有安裝,但如果在安裝 OS 時有自行選擇套件,就需要再確認

    sudo apt install ca-certificates curl
  • 取得 Docker for Ubutnu 的 GPG key

    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
  • 加入 Docker 套件伺服器

    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 更新套件資訊,安裝 containerd.io

    sudo apt update
    sudo apt install containerd.io
  • 產生 containerd 設定檔 (依預設值)

    containerd config default | sudo tee /etc/containerd/config.toml
  • 將設定檔中的 SystemdCgroup 改為 true

    sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

    參考說明

  • 啟動 Container Runtime

    sudo systemctl start containerd
    sudo systemctl enable containerd

安裝 kubeadm

  • 取得 Kubernetes 的 GPG key

    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
  • 加入Kubernetes 套件伺服器

    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
  • 更新套件資訊,安裝 kubelet、kubeadm、kubectl

    sudo apt update
    sudo apt install -y kubelet kubeadm kubectl
    #設定套件不更新
    sudo apt-mark hold kubelet kubeadm kubectl

建立 Kubernetes Control-Plane Node

  • 初始化 Kubernetes control-plane node

    sudo kubeadm init --pod-network-cidr=10.244.0.0/16

    執行成功後會有一串提示訊息,將最後一段的 kubeadm join 複製備存,如以下的範例 (參考用,實際建置需複製 kubeadm init 成功後的提示訊息),子節點加入 cluster 時使用

    sudo kubeadm join 10.10.1.3:6443 --token diwo8f.sm21fe24mj7c4mv2 --discovery-token-ca-cert-hash sha256:568c62d5c74a8e7b6b57e0fd4268365a896d3f2c78a60616bb6fc47154b4352c
  • 便於非 root 用戶後續使用 kubectl 操作子節點

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 安裝 Flannel,負責分配 cluster 中每個 pod 的 IP

    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

建立 Kubernetes Worker Node

  • 初始化 Kubernetes Worker Node,加入前一步建立好的 kubernetes cluster
    以下範例僅參考,實際應該使用在 master 執行 kubeadm init 成功後產生的指令

    sudo kubeadm join 10.10.1.3:6443 --token diwo8f.sm21fe24mj7c4mv2 --discovery-token-ca-cert-hash sha256:568c62d5c74a8e7b6b57e0fd4268365a896d3f2c78a60616bb6fc47154b4352c

完成前述步驟就已經建置起一個 Kubernetes Cluster 了,回到 Master 執行指令可以查看

kubectl get nodes

參考資料

Read more

部落格遷移紀錄

部落格遷移紀錄

是的,又搬家了。 這次搬家像是一種重新開始,遷移的範圍稍微大些,大致上有兩段變動: * 從功能豐富的 WordPress 到簡潔高效的 Ghost * 從 SugarHosts 搬遷到 Google Cloud Platform (GCP) Wordpress 的功能非常豐富,只是我使用到的部分極少,總想找個簡潔的服務使用,但忙碌的工作很快就澆熄了動力。一次在輸出小組群組中的討論,注意到 Ghost 這個部落格平台,試裝操作看看,體驗還不賴,想著我的文章數也很少 (心虛),就搬吧! 推進這個改變的契機,一部分也來自於 SugarHosts 自 2024 年底在網路社群中的討論,其中也包含了客服回應的議題,必須說,SugarHosts 的價格真的很有吸引力,只是客服回應效率突然發生的落差,我開始擔心這是否對影響到部落格,開始思考搬家的可能。 在年假期間,我利用 GCP 提供的 300 美元三個月試用額度來搭建新服務,並順便將文章搬遷到

By Jo
筆記 | Ubuntu 掛載磁碟

筆記 | Ubuntu 掛載磁碟

最近在 GCP 試玩 Compute Engine (VM),建立時另外新增了一顆磁碟,實際運行了才發現,原來需要自行掛載,記錄執行的指令與過程。 以 Ubuntu 22.04 為例 (多數的 Linux 應該也可以使用) 確認新增的磁碟是否存在 lsblk 大多情況應該會看到新的磁碟還沒有掛載任何分區 格式化 (如果硬碟還沒有格式化) sudo mkfs.ext4 /dev/sdb 配置自動掛載 取得新磁碟的 UUID sudo blkid /dev/sdb 一般會顯示類似以下的結果 /dev/sdb: UUID="一串由-符號串接的英數字" BLOCK_SIZE="4096" TYPE="ext4&

By Jo
筆記 | PostgreSQL v12 CTEs 行為改變

筆記 | PostgreSQL v12 CTEs 行為改變

前段時間,工作環境將 PostgreSQL v10 升級到 v15,升級後發現報表的執行效率從 1 秒變成了 2 分多鐘,也剛好變因太多,排查了很多項後才開始面對 SQL 執行計畫,同一段 SQL v10 跟 v15 有很大的差別,許多人花了一番功夫調整,速度才回到水準,接著進一步從調整方向的線索,再爬網路文章,才發現原來在 PostgreSQL v12 有一項對我們來說蠻重要的改變:CTEs 行為改變。 過去經驗裡,SQL 使用 CTE (Common Table Expression) 能將一段查詢的結果暫存起來,在主查詢語句中使用,能有提升查詢效率的效果 例如: WITH temp AS ( SELECT col1, col2, col3 FROM

By Jo
心得 | 溝通 - 與下屬講話時的 Checklist

心得 | 溝通 - 與下屬講話時的 Checklist

筆記摘自蔡恩全老師在 Master Cheers 的系列課程,章節片段不長,大約 12 分鐘,但有許多讓人省思的地方,也包含了一部分對過去自己答案的肯定,雖然是談管理、對部屬溝通,但除了 coaching 的部分比較屬於帶人的層面,其他的提點也很適用各種溝通場景。 筆記裡已經包含課程大多數內容,我比較想就這個課程中所回憶起的經驗或曾經踩的雷做個回顧,也當成是一次覆盤。 首次擔任管理職是從無到有建立團隊,一一面試選擇團隊夥伴,我想我們應該都同意,不論哪一方,面試時的想像和期待,通常和實際是有些落差的。夥伴的個性不盡相同,對於「了解對方」的能力,我有很多努力的空間,我可以做的,是在每一次的 1 on 1 中,視對方的反應來調整,但仍然是有許多故事。 有一回,和一位剛加入團隊三個月的成員討論工作狀況,我很直接地說:「我發現你的工作進展與我期待的不同,我們過去也定期在檢視跟討論,我想知道是不是有遇到什麼問題,或者需要我協助的地方?」 眼前的大男生回應不到幾句就開始稀裡嘩啦地哭了,一時之間我也有些不知如何是好,遞給他一盒面紙,請他先收拾好情緒後我們再談,在

By Jo