實踐環境#
- Ubuntu 22.04
- Docker 20.10.13
- K3s v1.23.13+k3s1
本文將使用 Ubuntu 系統,如選擇 Centos 系統,亦可作為參考,其步驟與命令大同小異,萬變不離其宗。
安裝 Docker#
K3s 包含並默認為 containerd, 一個行業標準的容器運行時。本文將使用 Docker 作為容器運行時,需要提前安裝 Docker 環境。
# 更新軟件源
sudo apt update
# 切換 root 用戶
sudo su -
# 安裝 docker
apt install docker.io
# 啟動 docker daemon
systemctl enable --now docker
systemctl status docker
# 驗證 docker 環境
docker version && docker info
docker ps
後續啟動 K3s 時使用--docker
选项激活。參考使用 Docker 作為容器運行時文檔。
安裝 K3s#
K3s 是一個高可用的、經過 CNCF 認證的輕量級 Kubernetes 發行版,專為物聯網及邊緣計算設計。
k3s
將安裝 Kubernetes 所需的一切打包進僅有 60MB
大小的二進制文件中,並且完全實現了 Kubernetes API。為了減少運行 Kubernetes 所需的內存,k3s
刪除了很多不必要的驅動程序,並用附加組件對其進行替換。由於它只需要極低的資源就可以運行,因此它能夠在任何 512MB
內存以上的設備上運行集群。
我們先從簡單的 K3s 上手,體驗下 K8s 的一半 K3s。待 K3s 大法修煉成功後,我們再採用 kubeadm 進行部署高可用 Kubernetes 集群,其部署架構幾乎一樣,只是個別核心組件的變化,萬變不離其宗,可依葫蘆畫瓢。
方案一:一鍵安裝(官方源,需外網)#
因 K3s 的核心組件鏡像需從 gcr.io 拉取(國內網絡不通),所以需具備外網訪問的環境,適用於伺服器均在國外的環境選用,簡單粗暴一鍵安裝。
# 一鍵默認安裝
curl -sfL https://get.k3s.io | sh -
方案二:一鍵安裝(國內源)推薦#
國內用戶,可以使用以下方法加速安裝,內置阿里雲鏡像源:
# 指定 K3s 版本
export INSTALL_K3S_VERSION=v1.23.13+k3s1
# 自定義啟動執行命令
export INSTALL_K3S_EXEC="--docker"
# 只安裝不啟動
export INSTALL_K3S_SKIP_START=true
# https://docs.rancher.cn/docs/k3s/installation/installation-requirements/_index#先決條件
# 為您添加到集群的每個節點設計一個獨特的名稱
export K3S_NODE_NAME=k3s-node-01
###
# agent 需加上,其他保持一致
###
# 設置了 K3S_URL,它將默認為“agent”。如果未設置K3S_URL,它將默認為“server”
export K3S_URL=
# 用於將 server 或 agent 加入集群的共享 secret
export K3S_TOKEN=
# 使用阿里雲鏡像源安裝
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
# 啟動 K3s 服務
systemctl enable --now k3s
# 查看 K3s 服務狀態
systemctl status k3s
方案三:離線安裝#
前提條件#
- 在安裝 K3s 之前,完成上面的部署私有鏡像倉庫或手動部署鏡像,導入安裝 K3s 所需要的鏡像。本小節將演示手動部署鏡像的方式。
- 從 K3s GitHub Release 頁面下載 K3s v1.23.13+k3s1 二進制文件,K3s 二進制文件需要與離線鏡像的版本匹配。將二進制文件放在每個離線節點的
/usr/local/bin
中,並確保這個二進制文件是可執行的。 - 下載 K3s 安裝腳本,將安裝腳本放在每個離線節點的任意地方,並命名為
install.sh
。
當使用 INSTALL_K3S_SKIP_DOWNLOAD
環境變量運行 K3s 腳本時,K3s 將使用本地的腳本和二進制。
手動部署鏡像#
假設您已經在離線 / 國內環境中創建了節點。這種方法需要您手動將必要的鏡像部署到每個節點,適用於運行無法部署鏡像倉庫的邊緣部署場景。參考官方手動部署鏡像文檔。
-
從 K3s GitHub Release 頁面獲取需安裝的 K3s v1.23.13+k3s1 的鏡像 tar 文件。
-
將 tar 文件放在
images
目錄下,例如:# 為每個節點創建離線鏡像的存儲文件夾 sudo mkdir -p /var/lib/rancher/k3s/agent/images/ # $ARCH 是當前伺服器的 CPU 架構 sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/
-
需手動將鏡像部署到每個節點,在每個節點執行上述操作。
下載 K3s v1.23.13+k3s1 二進制文件#
從 K3s GitHub Release 頁面下載 K3s v1.23.13+k3s1 二進制文件,K3s 二進制文件需要與離線鏡像的版本匹配。將二進制文件放在每個離線節點的 /usr/local/bin
中,並確保這個二進制文件是可執行的。
使用腳本安裝#
安裝腳本可從下面任一地址下載:
腳本地址 | 說明 |
---|---|
https://get.k3s.io/ | 官方地址,需要外網環境 |
https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | 阿里源,內置阿里雲鏡像源 |
https://raw.githubusercontent.com/k3s-io/k3s/master/install.sh | GitHub 地址,同官方源 |
# 下載腳本
curl -sfL https://get.k3s.io > install.sh
# 切換 root 用戶
sudo su -
# 赋予執行權限
chmod +x install.sh
# 安裝 K3s,跳過下載二進制文件,只安裝,不啟動
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_SKIP_START=true ./install.sh
# 啟動 K3s
systemctl enable --now k3s
驗證 K3s#
檢查集群#
# 查看集群的運行情況
kubectl get nodes -owide
kubectl get all -A -owide
kubectl describe nodes k3s-node-01
kubectl -n kube-system describe deploy coredns
# 使用 Docker 作為運行時,會使用 docker 拉取鏡像與運行容器
docker images
docker ps
牛刀小試#
啟動 whoami 服務#
# 快速部署 whoami 應用,指定副本為 2,默認副本為 1
kubectl create deploy whoami --image=traefik/whoami --replicas=2
kubectl describe deploy whoami
# 監控 pod 狀態,通過擴縮容可直觀看到 pod 的調度情況
kubectl get pods --watch
# 嘗試下對 whoami 應用進行擴縮容
kubectl scale deploy whoami --replicas=5
請求鏈路說明#
讓我們嘗試著理解下 k8s 的請求鏈路:
request public-ip -> node-port -> svc-port -> pod-port -> container
通過 Service 暴露給集群內部訪問#
默認為 NodePort 模式,會在每個節點監聽
kubectl expose deploy whoami --port=80
kubectl get svc -owide
kubectl describe svc whoami
# 在本地通過 service 多訪問幾次,出輪詢訪問 container
# curl http://<external-ip>:<port>
$ curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`
Hostname: whoami-84d974bbd6-shqsr
IP: 127.0.0.1
IP: 10.42.0.13
RemoteAddr: 10.42.0.1:42158
GET / HTTP/1.1
Host: 10.43.181.167
User-Agent: curl/7.68.0
Accept: */*
通過 Service 暴露給集群外網訪問#
指定 LoadBalancer 模式並指定公網 IP
# 自行替換 <PUBLIC_IP> 為當前節點的公網 IP
kubectl expose deploy whoami --type=LoadBalancer --port=80 --external-ip <PUBLIC_IP>
$ kubectl get svc whoami -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
whoami LoadBalancer 10.43.77.116 123.123.123.123 80:32101/TCP 16s app=whoami
# 集群內部仍可正常訪問
curl 10.43.77.116
curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`
# 通過外網瀏覽器訪問,需要開啟雲服務商的防火牆配置
# Ctrl + F5 多刷新幾次查看效果
http://123.123.123.123:32101
快速清理實驗環境#
kubectl delete all --all
卸載 K3s#
# 一鍵卸載 server
k3s-uninstall.sh
# 一鍵卸載 agent
k3s-agent-uninstall.sh