文章目录
- 环境说明
- 目标
- 步骤与问题解决
- 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
暴露应用。