文章目录
-
- 环境说明
- 目标
- 步骤与问题解决
-
- [1. 构建 Go 应用和 Docker 镜像](#1. 构建 Go 应用和 Docker 镜像)
-
- [问题 1:Go 依赖下载卡住](#问题 1:Go 依赖下载卡住)
- [问题 2:Docker 镜像拉取失败](#问题 2:Docker 镜像拉取失败)
- [2. 设置 Minikube 集群](#2. 设置 Minikube 集群)
-
- [安装 Minikube](#安装 Minikube)
- [问题 3:Minikube 启动失败](#问题 3:Minikube 启动失败)
- [问题 4:Minikube 镜像拉取失败](#问题 4:Minikube 镜像拉取失败)
- [3. 部署 Kubernetes 资源](#3. 部署 Kubernetes 资源)
-
- [优化 YAML](#优化 YAML)
- 加载镜像并部署
- [问题 5:kubectl 连接失败](#问题 5:kubectl 连接失败)
- [4. 暴露服务](#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
内容如下:
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 模块代理:
bashgo env -w GOPROXY=https://goproxy.cn,direct go mod download
-
如果仍卡住,尝试其他代理(如
https://goproxy.io
)或临时禁用校验和验证:bashgo env -w GOSUMDB=off go mod download go env -w GOSUMDB=sum.golang.org
-
然后构建:
bashgo 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 镜像源配置:
bashcat /etc/docker/daemon.json
-
更新为可靠镜像源(如阿里云或中科大):
json{ "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"] }
-
重启 Docker:
bashsudo systemctl daemon-reload sudo systemctl restart docker
-
验证镜像拉取:
bashdocker pull ubuntu:20.04
2. 设置 Minikube 集群
由于只安装了 kubectl
和 docker
,需要一个本地 Kubernetes 集群。我选择了 Minikube,因为它易于安装且与 Docker 集成良好。
安装 Minikube
bash
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
:bashsudo usermod -aG docker lizhi newgrp docker
-
解决
/tmp
权限问题:bashsudo sysctl fs.protected_regular=0
-
以普通用户启动 Minikube:
bashminikube start --driver=docker
问题 4:Minikube 镜像拉取失败
Minikube 默认拉取 gcr.io/k8s-minikube/kicbase:v0.0.46
,但因网络限制失败。
解决方法:
-
从阿里云拉取镜像并重新标记:
bashdocker 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,指定镜像:
bashminikube start --driver=docker --base-image=registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.46
3. 部署 Kubernetes 资源
k8s-webook-deployment.yaml
内容如下:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webook-live
spec:
replicas: 3
selector:
matchLabels:
app: webook-live
template:
metadata:
labels:
app: webook-live
spec:
containers:
- name: webook
image: flycash/webook-live:v0.0.1
ports:
- containerPort: 8080
优化 YAML
为确保使用本地镜像并提高稳定性,添加 imagePullPolicy
和资源限制:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webook-live
spec:
replicas: 3
selector:
matchLabels:
app: webook-live
template:
metadata:
labels:
app: webook-live
spec:
containers:
- name: webook
image: flycash/webook-live:v0.0.1
imagePullPolicy: Never
ports:
- containerPort: 8080
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
加载镜像并部署
-
加载镜像到 Minikube:
bashminikube image load flycash/webook-live:v0.0.1
-
应用部署:
bashkubectl apply -f k8s-webook-deployment.yaml
-
检查 Pod 状态:
bashkubectl get pods -l app=webook-live
问题 5:kubectl 连接失败
初次运行 kubectl apply
时,报错 connection refused
(http://localhost:8080
)。原因是未运行 Kubernetes 集群。
解决方法:
-
Minikube 启动后,
~/.kube/config
自动配置为正确的 API 服务器地址(https://<ip>:8443
)。 -
验证:
bashkubectl cluster-info
4. 暴露服务
为访问应用,创建 Service
:
yaml
apiVersion: v1
kind: Service
metadata:
name: webook-live-service
spec:
selector:
app: webook-live
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
-
保存为
k8s-webook-service.yaml
,应用:bashkubectl apply -f k8s-webook-service.yaml
-
访问服务:
bashminikube service webook-live-service --url
总结
通过以下步骤,我成功在 Ubuntu 22.04 上部署了 Go 应用到 Minikube:
- 配置 Go 代理(
goproxy.cn
)解决依赖下载问题。 - 使用阿里云镜像源解决 Docker 和 Minikube 镜像拉取问题。
- 将用户添加到 Docker 用户组,解决 Minikube 权限问题。
- 优化
k8s-webook-deployment.yaml
,加载本地镜像并部署。 - 创建
Service
暴露应用。