目錄

如何在 GCP 上建立自己的 Kubernetes

前言

Google Cloud Platform (GCP) 是由 Google 推出的雲端計算平台,提供各種雲端運算資源,包括虛擬機器、儲存等等。GCP 可以解決使用者本地電腦穩定性不足或是配備不夠的問題,使用者可以透過 GCP 創建屬於自己的虛擬機器,進而進行開發、分析資料或架設系統等等的工作。如果是新帳號使用者可以利用90天或300美金的體驗期來滿足自己短期的需求。

1. 準備

在 GCP 上建立虛擬機

  1. 進入到 GCP 網站 中開始使用,
  2. 啟用 Compute Engine 功能。
  3. 點選 VM 執行個體建立執行個體,區域的部分就近選擇台灣即可
  4. 其餘我採用的配備是
    • e2-medium (2 個 vCPU,4 GB 記憶體)
    • Ubuntu 20.04 LTS (x86/64)
    • 硬碟大小 50GB
  5. 這邊會需要配置兩台 VM 來充當 K8s 的 Master Node 和 Worker Node,配置完成後應該會可以看到跟下圖一樣的畫面
  6. Kubernetes 安裝版本為 1.26.0-00
  1. 點選 SSH 就可以進入到 VM 的終端機操作畫面

到這邊在 GCP 上建立 VM 的內容就結束了,接下來就是如何將 Kubernetes 安裝在這兩台 VM 上面運行

2. Master & Worker node 設定

2.1 更新與安裝套件

1
2
3
sudo apt update -y
sudo apt upgrade -y
sudo apt install vim net-tools wget -y

2.2 Forwarding IPv4 and letting iptables see bridged traffic

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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
  1. 查看是否正常
1
2
lsmod | grep br_netfilter
lsmod | grep overlay
  1. 看剛剛設定的值是否都 =1,最後的結果應該會跟下圖一樣
1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

2.3 Containerd 安裝

這邊還是推薦安裝 containerd,不推薦安裝 Docker,因為 K8s 後面的版本已經捨棄了 Docker。如果一定要安裝 Docker 還會需要多安裝一個 cri-dockerd,會比較複雜

如果有舊版的再執行

移除舊版的 Docker、containerd

1
 for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
  1. 安裝必要的套件
1
2
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
  1. 添加 Docker 的官方 GPG 密鑰
1
2
3
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
  1. 使用以下命令設置存儲庫
1
2
3
4
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安裝 containerd,這邊與官網的不一樣,這邊我們只需要安裝 containerd 就好,不需要安裝 Docker
1
2
sudo apt-get update
sudo apt-get install containerd.io 
  1. 查看 containerd 安裝版本,如果正常安裝成功就會有下圖的樣子
1
sudo ctr version
  1. 產生 containerd 的 config.toml 檔案
1
2
3
4
5
6
# 先進入 root 模式
sudo su
sudo containerd config default > /etc/containerd/config.toml

# 離開 root 模式
exit
  1. 啟動 containerd 並查看狀態
1
2
3
sudo systemctl enable containerd
sudo systemctl restart containerd.service 
sudo systemctl status containerd.service

3. 安裝 Kubeadm、Kubelet、kubectl

  1. 關閉 swap
1
2
sudo swapoff -a
top
  1. 安裝相關套件
1
2
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
  1. Download the Google Cloud public signing key
1
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
  1. Add the Kubernetes apt repository
1
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  1. 更新 apt repository
1
sudo apt-get update
  1. 安裝 kubeadm & kubelet & kubectl

這邊有兩個選擇,一個是安裝最新版本,另一個是安裝指定版本。我這邊是安裝 1.26.0-00


安裝指定版本

  1. 查看可安裝版本
1
apt-cache madison kubeadm
  1. 安裝指定版本
1
2
3
4
5
K_VER="<version>"
# ex : K_VER="1.26.0-00"

sudo apt-get install -y kubelet=${K_VER} kubectl=${K_VER} kubeadm=${K_VER}
sudo apt-mark hold kubelet kubeadm kubectl

安裝最新版本

  1. 直接安裝就可以了
1
2
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

  1. 確認 kubeadm 安裝版本
1
sudo kubeadm version
  1. Worker Node 只需要做到這一步就好,直接接後面的 第五章

啟動 kubelet 並查看狀態,此時沒有 running 是正常的

1
2
3
sudo systemctl enable kubelet
sudo systemctl restart kubelet
sudo systemctl status kubelet
  1. (Master) 拉取初始化需要的 image
1
sudo kubeadm config images pull
  1. (Master) kubernetes 初始化

指令中的 domain 可以由 Kubernetes 官網 獲得,根據自己安裝的 container runtime 來決定要使用哪個

要把最下面的 join... 記錄起來,之後 worker node 加入到 cluster 的時候會用到。如果忘記可以參考這邊

1
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --cri-socket=unix:///var/run/containerd/containerd.sock 
  1. 把剛剛第 10 步獲得的指令輸入
1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 加入 path
1
2
3
4
5
6
7
# 進入 root mod
sudo su

echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc

# 啟用
source ~/.bashrc
  1. 查看 cluster,此時都還是 root mod,後續使用到 k8s 指令的時候都要在 root 模式下使用
1
kubectl get nodes

4. 佈署 Pod Network 插件

  1. 這邊我選擇 Calico,當然還有其他的可以選擇,例如 Flannel 插件。不同的插件在 kubeadm init ...時,--pod-network-cidr輸入的 IP 範圍會不太一樣,如果使用 Flannel,就會是--pod-network-cidr=10.244.0.0/16
1
2
3
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
  1. 查看安裝情況
1
kubectl get pods -A

5. Worker node 加入 Cluster 中

Worker node 只需要做到第三章的第 8 步驟即可。接者,直接輸入剛剛從 Master 中獲得的join...指令

最後在 Master node 的 VM 再次查看 node 的情況就可以看到剛剛加入的 Worker node 就成功了

6. 好用工具

6.1 Kubectl autocomplete

可以直接把打一半的指令直接補全,多案幾次 Tab 還會告訴妳有什麼樣的指令可以輸入,可以節省時間 !

  1. 安裝必要套件 bash-completion
1
sudo apt install bash-completion
  1. 設定 autocomplete
1
2
source <(kubectl completion bash) # set up autocomplete in bash into the current shell, bash-completion package should be installed first.
echo "source <(kubectl completion bash)" >> ~/.bashrc # add autocomplete permanently to your bash shell.
  1. 以後只要打 ‘k’ 就可以表示 ‘kubectl’,比較方便,把指令寫入 bashrc 中,讓所有 user 都可以使用
1
2
3
4
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc

source ~/.bashrc
  1. 之後只需要按 Tab,就可以自動幫妳補上指令,不用自己打完。
Trouble

如果出現這種錯誤

1
_get_comp_words_by_ref: command not found

輸入

1
source /usr/share/bash-completion/bash_completion

6.2 kubens、kubectx

kubectx 可以快速的自由切換 contexts (clusters)

kubens 可以快速的自由切換 Kubernetes 的 namespaces

可以看 Github 的教學比較完整

1
2
3
sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens

7. 備註

1. 重新產生 join 指令

如果 join ... 指令到期或是忘記記錄下來,可以透過這個指令產生新的 join 指令

1
kubeadm token create --print-join-command

🔗參考

  1. Kubernetes 官網
  2. How to Install Kubernetes Cluster on Ubuntu 20.04 with kubeadm – Collabnix
  3. How to Deploy Kubernetes with Kubeadm and containerd - The New Stack
  4. Kubernetes手记(3)- 核心组件/附件_k8s_雪雷_InfoQ写作社区
  5. Install Kubernetes Cluster with kubeadm 2022 (Linux VM/Mac/Windows, x86/Arm) - YouTube
  6. kubectl 补全报错:-bash: _get_comp_words_by_ref: command not found - 点点滴滴的努力 - 博客园 (cnblogs.com)
  7. ahmetb/kubectx: Faster way to switch between clusters and namespaces in kubectl (github.com)
comments powered by Disqus