【硬要手動部署】關於那些部署K8S所踩到過的坑

Hachibye
6 min readJun 4, 2023

--

Summary of problems encountered in manually deploying Kubernetes

這篇文章是承接上一篇硬要手動部署,一路踩過來的坑
內容不一定包含了所有錯誤,但應該有許多新手接觸時的常見錯誤

【安裝篇】

安裝來源失效

需要檢查你獲取安裝套件的位置是否有效,換一種安裝方式

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt-get update
sudo apt-get install -y kubectl kubelet kubeadm

【部署篇】

The connection to the server localhost:8080 was refused — did you specify the right host or port?

剛安裝好的K8S無法正確執行是因為沒有設置環境變量

mkdir -p $HOME/.kube 
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

service

EXTERNAL-IP: pending

集群內相互溝通的IP由K8S創建時自動生成
若要額外配置上外部靜態實體IP時,遇到 pending 的狀態
需要檢查YAML配置是否有誤,外網是否能訪問、防火牆規則是否有通過

# 查詢service
kubectl get service
# 編輯配置檔
sudo vim <輸入你的service配置檔位置>
# 編輯之後套用
kubectl apply -f service.yaml

node

k8s-node-ready

NotReady:節點不可用

需要檢查CNI網路套件是否未安裝、未啟用、配置有誤

# 查看node狀態
kubectl get node

# 查看硬碟
df -m

# 查看CPU
top -c

# 查看CNI網路配置
cat <輸入你的CNI配置檔位置>

# 編輯之後套用
kubectl apply -f <輸入你的CNI配置檔位置>

ROLES顯示<none>:尚未指定節點屬性

kubectl label nodes <你的節點規則,通常指派為worker>

pod

k8s-pods-running

CrashLoopBackOff:記憶體不足、部署的程式碼有誤、部署的YAML配置有誤

需通過查看日誌來排除特定之問題

kubectl get pods
kubectl logs <輸入你的pod名稱>

ImagePullBackOff:鏡像檔拉取失敗

需要通過手動拉取來測試是否正常、或者在配置內打錯字

docker pull <輸入你的倉庫帳號/你的鏡像名稱>

Pending / Waiting / ContainerCreating:硬體資源不足、容器無法啟動、鏡像無法拉取、部署的YAML或網路的YAML配置有誤

需要通過查看日誌來排除特定之問題

kubectl describe pod <輸入你的pod名稱>
journalctl -u kubelet

Error:綜合上述的錯誤、權限不足

需要查看權限角色或資源請求設置是否達到上限

# 查看帳號
kubectl get serviceaccount

# 查看部署的YAML內的 {LimitRange}
cat <輸入你配置的YAML檔位置>

Terminating:運行pod遭到中止

需要查看node節點是否變成不可用

【網路篇】

k8s-flannel-running
# 查看所有pods,檢查網路套件是否在執行
kubectl get pods --all-namespaces

若沒有安裝CNI套件
集群內的node節點會處於NotReady狀態
也無法相互通訊

常見的CNI套件有三種:

# flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# weave
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
# calico
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
kubectl apply -f calico.yaml

以上都是直接通過網上來源抓取並套用的指令
若需要自訂內網網段之類的內容
建議上去複製下來自己新建一個配置YAML檔

# 將網上資源的YAML配置完整複製下來
# 自己新增一個YAML配置檔
sudo vim kube-flannel.yaml
# 貼上之後再修改內容
# 例如:內網網段在 net-conf.json 底下的 Network 裡面

以上,如果有再碰到再繼續補充。

--

--

Hachibye
Hachibye

Written by Hachibye

字幕組退休勞工 ... DevOps/系統/雲端/資安

No responses yet