筆記 | 在 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 sysctl --system

載入 k8s 需要的核心模組

sudo modprobe overlay
sudo modprobe br_netfilter

調整 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

關閉系統交換區
參考 kubeadm 的安裝前說明

sudo swapoff -a
#目的是註解 /etc/fstab 裡的 swap
sudo sed -i '/swap/s/^/#/' /etc/fstab

更新系統套件至最新

sudo apt update
sudo apt upgrade

安裝 Container Runtime

啟動 Container Runtime

sudo systemctl start containerd
sudo systemctl enable containerd

將設定檔中的 SystemdCgroup 改為 true

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

參考說明

產生 containerd 設定檔 (依預設值)

containerd config default | sudo tee /etc/containerd/config.toml

更新套件資訊,安裝 containerd.io

sudo apt update
sudo apt install containerd.io

加入 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

取得 Docker for Ubutnu 的 GPG key

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

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

sudo apt install ca-certificates curl

安裝 kubeadm

更新套件資訊,安裝 kubelet、kubeadm、kubectl

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

加入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

取得 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 Control-Plane Node

安裝 Flannel,負責分配 cluster 中每個 pod 的 IP

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

便於非 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

初始化 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

建立 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

Data Platform 筆記#02:從可行到可承接

Data Platform 筆記#02:從可行到可承接

在初版架構逐漸成形後,時間也差不多過了一年。 架構可以跑、資料可以流動,但我仍然不確定它能不能真正落地。這條路必須要團隊可以承接、可以擴展,數據才有機會真正發揮價值。 很慶幸的是,我的主管願意投資時間,讓這個方向能繼續推進。也正是在那段時間,我的思考開始出現轉變... 前一篇的重點,是讓流程從「能跑」走向「能持續」。 而接下來我開始思考:如果這件事要由團隊一起做下去,現在的做法夠不夠讓人接手? 轉變的核心 回頭看那一年,大多數時間其實是在解問題。 但接下來,我該解的是另一個問題:怎麼讓別人不用再解一次同樣的問題? 於是投入了約莫三個月、壓力值很高的一段時間,開始把原本依賴個人經驗與記憶的做法,收斂成可以被團隊理解與複製的形式。 這個收斂,後來具體落在幾個方向上: * 把 Data Center 的部署方式收斂成一致做法,降低環境轉換成本 * 把資料整理作業轉變為配置驅動,讓流程與部署有規則可循 * 整理 DDL 轉換規則與範本,讓團隊能共用同一套方法 * 把知識系統化交付出去 這些事情的唯一核心是 讓方法大於個人。 從個人經驗,到規則明確 第一個改變:

By Jo
Data Platform 筆記#01:初版技術架構成形

Data Platform 筆記#01:初版技術架構成形

在上篇的 POC 之後,我們整理了一份內部報告,將問題拆成資料蒐集、基礎資料定義、資料量與查詢效能、資料治理、技術架構等幾個面向。 這份整理的目的是先建立邊界,讓我們從發散與模糊,逐步走向具體且聚焦。 在這個基礎上,我開始把關注重點轉向資料流: 如何讓資料自動、穩定、乾淨地進到分析效能較好的資料庫? 同時,也剛好迎來一個契機:與技術能量較高的團隊合作發展數據中台。這讓 Data Center 的推進獲得更多資源與支援,讓我們能更系統化地思考架構問題。 思考階段 這個階段,我們主要思考幾個問題: * 不同來源的資料,能不能用相對一致的方法接進來? * 資料會持續累積,是否有合適的儲存與管理方案? * 資料進來後,分層應該怎麼定義? * 查詢分析時,是否有更適合的查詢引擎? 各資料源的特性不同,接收方式很難完全一致。但若每種來源都設計一套專屬流程,維運成本會快速上升。因此初步的想法是先用一種主要方式處理大多數的情境,讓資料流先跑起來,再逐步優化。 過去常見的分層方式,是將資料分成: * 可追溯的原始資料(Stage) * 清洗整理後的乾淨資料(Data) *

By Jo
Data Platform 筆記#00:在變得具體之前

Data Platform 筆記#00:在變得具體之前

目標要做資料平台(Data Platform) 一開始我不是很能夠想像這件事該長成什麼樣子,既有的認知只有前期參與的團隊有實作過 HR 資料中心,顧問曾指導資料分層為 Stage、Data、Mart,除此之外,我沒有更多掌握,有很多疑問需要找到答案。 做到什麼程度算是Data Platform? 我們期待它能解決什麼、幫助到誰? 它是不是應該包含一套接收資料的方法、能儲存大量資料的資料庫、提供資料服務的能力?   那麼,它是一個平台嗎?該用什麼技術?有哪些其實現在不需要?又該怎麼做,才能保留未來需要的彈性? 這些問題在當下其實都沒有辦法很快有肯定又具體的答案。好像每一個點都應該被考慮到,但同時又覺得過於理想。那段時間,我甚至開始嘗試透過與 AI 的對話,把模糊的想法拆解成可以被檢視的問題。它沒有辦法替我做決定,但確實加速我釐清問題。 只是,在理解問題的過程,即使把想法轉化輸出成一張張架構圖,進展卻不是太明顯,反而有一種無法落地的感覺,沒有讓事情真正往前走,我們仍然缺少可以被驗證的起點。 開始有切入點的時機,是我們在尋找能夠讓用戶自助調整所需報表的工具,剛好從前的工作曾小量接觸

By Jo
筆記 | 自架 Ghost 的 SMTP 設定

筆記 | 自架 Ghost 的 SMTP 設定

部落格荒廢了好一段時間,近期終於想用手機登入管理介面留下些草稿,突然發現無法登入,登入鈕下方出現了如下的一段訊息 EmailError: Failed to send email. Please check your site configuration and try again. 結論先行,原因是我安裝的 ghost 版本,在首次使用新裝置登入時需要 2FA (二階段驗證),也就是說,除了帳號密碼登入之外,還會有一層驗證機制,而這層驗證機制需要輸入 6 碼驗證碼 (Ghost 站台發給登入者註冊信箱的 mail 會提供)。我當時建置 Ghost 時認為自己不會發送電子報,就忽略了 SMTP 的設定,導致 Ghost 站台不能正常發信,在配置好 SMTP 設定後,從新裝置就能正常登入了。 前一篇文章提到我的 Ghost 是架設在

By Jo