文章目錄
- 環境說明
- 目標
- 步驟與問題解決
- 1. 構建 Go 應用和 Docker 鏡像
- 問題 1:Go 依賴下載卡住
- 問題 2:Docker 鏡像拉取失敗
- 2. 設置 Minikube 集群
- 安裝 Minikube
- 問題 3:Minikube 啟動失敗
- 問題 4:Minikube 鏡像拉取失敗
- 3. 部署 Kubernetes 資源
- 優化 YAML
- 加載鏡像并部署
- 問題 5:kubectl 連接失敗
- 4. 暴露服務
- 總結
最近,我嘗試在 Ubuntu 22.04 上使用 Minikube 和 Docker 部署一個 Go 應用到 Kubernetes 集群。過程中遇到了一些問題,包括 Go 依賴下載卡住、Docker 鏡像拉取失敗(
403 Forbidden
)以及 Minikube 啟動時的權限錯誤(
HOST_JUJU_LOCK_PERMISSION
)。這篇博客記錄了我的部署過程、遇到的問題及解決方法,希望對其他開發者有所幫助。
環境說明
- 操作系統:Ubuntu 22.04
- 工具:
- Go 1.24.2
- Docker(命令行版)
kubectl
- Minikube v1.36.0
- 項目:一個 Go 應用(
webook
),使用gin
、gorm
等依賴,計劃構建為 Docker 鏡像flycash/webook-live:v0.0.1
并部署到 Kubernetes。 - Kubernetes 配置:
k8s-webook-deployment.yaml
,定義一個 3 副本的 Deployment,容器監聽 8080 端口。
目標
將 Go 應用編譯為 Docker 鏡像,通過 Minikube 在本地 Kubernetes 集群中部署,并通過 Service
暴露應用。
步驟與問題解決
1. 構建 Go 應用和 Docker 鏡像
項目位于 ~/go/src/3-2/webook
,使用 make docker
構建鏡像。Makefile
內容如下:
docker:go build -o webook .docker build -t flycash/webook-live:v0.0.1 .
問題 1:Go 依賴下載卡住
運行 make docker
時,Go 依賴(如 github.com/gin-contrib/sessions
、golang.org/x/text
)下載卡住。原因可能是國內網絡對 golang.org
或 github.com
的訪問受限。
解決方法:
- 配置 Go 模塊代理:
go env -w GOPROXY=https://goproxy.cn,direct go mod download
- 如果仍卡住,嘗試其他代理(如
https://goproxy.io
)或臨時禁用校驗和驗證:go env -w GOSUMDB=off go mod download go env -w GOSUMDB=sum.golang.org
- 然后構建:
go build -o webook . docker build -t flycash/webook-live:v0.0.1 .
問題 2:Docker 鏡像拉取失敗
在 docker build
時,遇到 403 Forbidden
錯誤,拉取 ubuntu:20.04
失敗。原因是配置的鏡像源(lz2nib3q.mirror.aliyuncs.com
)不可用。
解決方法:
- 檢查 Docker 鏡像源配置:
cat /etc/docker/daemon.json
- 更新為可靠鏡像源(如阿里云或中科大):
{"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"] }
- 重啟 Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
- 驗證鏡像拉取:
docker pull ubuntu:20.04
2. 設置 Minikube 集群
由于只安裝了 kubectl
和 docker
,需要一個本地 Kubernetes 集群。我選擇了 Minikube,因為它易于安裝且與 Docker 集成良好。
安裝 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
問題 3:Minikube 啟動失敗
嘗試以 root 用戶運行 minikube start --driver=docker
,遇到以下錯誤:
HOST_JUJU_LOCK_PERMISSION: Failed to start host: boot lock: unable to open /tmp/juju-mk...: permission denied
原因:
- Ubuntu 22.04 的
fs.protected_regular=2
限制了/tmp
文件訪問。 - Minikube 不建議以 root 身份使用
docker
驅動。
解決方法:
- 將用戶添加到 Docker 用戶組,避免
sudo
:sudo usermod -aG docker lizhi newgrp docker
- 解決
/tmp
權限問題:sudo sysctl fs.protected_regular=0
- 以普通用戶啟動 Minikube:
minikube start --driver=docker
問題 4:Minikube 鏡像拉取失敗
Minikube 默認拉取 gcr.io/k8s-minikube/kicbase:v0.0.46
,但因網絡限制失敗。
解決方法:
- 從阿里云拉取鏡像并重新標記:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.46 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.46 gcr.io/k8s-minikube/kicbase:v0.0.46
- 啟動 Minikube,指定鏡像:
minikube start --driver=docker --base-image=registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.46
3. 部署 Kubernetes 資源
k8s-webook-deployment.yaml
內容如下:
apiVersion: apps/v1
kind: Deployment
metadata:name: webook-live
spec:replicas: 3selector:matchLabels:app: webook-livetemplate:metadata:labels:app: webook-livespec:containers:- name: webookimage: flycash/webook-live:v0.0.1ports:- containerPort: 8080
優化 YAML
為確保使用本地鏡像并提高穩定性,添加 imagePullPolicy
和資源限制:
apiVersion: apps/v1
kind: Deployment
metadata:name: webook-live
spec:replicas: 3selector:matchLabels:app: webook-livetemplate:metadata:labels:app: webook-livespec:containers:- name: webookimage: flycash/webook-live:v0.0.1imagePullPolicy: Neverports:- containerPort: 8080resources:requests:cpu: "200m"memory: "256Mi"limits:cpu: "500m"memory: "512Mi"
加載鏡像并部署
- 加載鏡像到 Minikube:
minikube image load flycash/webook-live:v0.0.1
- 應用部署:
kubectl apply -f k8s-webook-deployment.yaml
- 檢查 Pod 狀態:
kubectl get pods -l app=webook-live
問題 5:kubectl 連接失敗
初次運行 kubectl apply
時,報錯 connection refused
(http://localhost:8080
)。原因是未運行 Kubernetes 集群。
解決方法:
- Minikube 啟動后,
~/.kube/config
自動配置為正確的 API 服務器地址(https://<ip>:8443
)。 - 驗證:
kubectl cluster-info
4. 暴露服務
為訪問應用,創建 Service
:
apiVersion: v1
kind: Service
metadata:name: webook-live-service
spec:selector:app: webook-liveports:- protocol: TCPport: 80targetPort: 8080type: ClusterIP
- 保存為
k8s-webook-service.yaml
,應用:kubectl apply -f k8s-webook-service.yaml
- 訪問服務:
minikube service webook-live-service --url
總結
通過以下步驟,我成功在 Ubuntu 22.04 上部署了 Go 應用到 Minikube:
- 配置 Go 代理(
goproxy.cn
)解決依賴下載問題。 - 使用阿里云鏡像源解決 Docker 和 Minikube 鏡像拉取問題。
- 將用戶添加到 Docker 用戶組,解決 Minikube 權限問題。
- 優化
k8s-webook-deployment.yaml
,加載本地鏡像并部署。 - 創建
Service
暴露應用。