文章目录

    • 环境说明
    • 目标
    • 步骤与问题解决
      • 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),使用 gingorm 等依赖,计划构建为 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/sessionsgolang.org/x/text)下载卡住。原因可能是国内网络对 golang.orggithub.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 集群

由于只安装了 kubectldocker,需要一个本地 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 refusedhttp://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:

  1. 配置 Go 代理(goproxy.cn)解决依赖下载问题。
  2. 使用阿里云镜像源解决 Docker 和 Minikube 镜像拉取问题。
  3. 将用户添加到 Docker 用户组,解决 Minikube 权限问题。
  4. 优化 k8s-webook-deployment.yaml,加载本地镜像并部署。
  5. 创建 Service 暴露应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87565.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87565.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87565.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio-Git的使用指南

一、git的基本使用流程 git clone 克隆远程资源到本地目录&#xff0c;作为工作目录&#xff1b;然后在本地的克隆目录上添加或修改文件&#xff1b;如果远程修改了&#xff0c;需要同步远程的内容&#xff0c;直接git pull就可以更新本地的文件&#xff1b;本地在修改之后&…

【github】想fork的项目变为私有副本

在 GitHub 上&#xff0c;所有的 fork 都会继承其上游仓库&#xff08;upstream&#xff09;的可见性&#xff08;visibility&#xff09;设置&#xff1a; 可见性继承 如果你 fork 的原仓库是 public&#xff0c;那么你的 fork 也必须是 public。如果原仓库是 private&#xf…

微软发布新一代存储优化型虚拟机:Azure Laosv4、Lasv4 和 Lsv4 系列

微软宣布&#xff0c;全新一代存储优化型虚拟机——Azure Laosv4、Lasv4 和 Lsv4 系列已正式面世。 与前一代虚拟机系列相比&#xff0c;全新的 L 系列虚拟机实现了重大突破。它支持高达 23TB 的本地 NVMe SSD&#xff0c;在 CPU、网络以及远程存储性能方面均有显著提升。该系…

python调用pybind11导出的pyd,出现UnicodeDecodeError

python调用pybind11导出的pyd&#xff0c;出现UnicodeDecodeError 1. 问题描述 举个例子&#xff0c;当有以下C代码以及Pybind11的绑定代码时&#xff0c;在python访问包含中文的Name和Value会有UnicodeDecodeError的异常&#xff01; class VxUserProp{public:VxUserProp();…

MySQL别名在GROUP BY中的使用规则

-- 设置变量&#xff1a;SET earliest_date ... 用于定义并赋值一个用户变量 earliest_date。 -- 用户定义的变量必须以 符号开头&#xff0c;例如 earliest_date。 -- 符号是MySQL中用户变量的标识符&#xff0c;用于区分系统变量和用户变量。 SET earliest_date (SELECT …

2025.7.4总结

感恩环节:感谢今日工作顺利度过&#xff0c;明天终于能美美的睡个懒觉了。感谢这周有个美好的双休。今日去实验室参观设备&#xff0c;感谢我的一个同事解答了我关于硬件设备与所做软件业务之间的关系&#xff0c;通过控制器控制网元等相关设备&#xff0c;同时&#xff0c;虽然…

Prompt 精通之路(五)- 构建你的“AI 指令系统”:超越简单提问的 CRISPE 与 APE 框架

&#x1f680; Prompt 精通之路&#xff1a;系列文章导航 第一篇&#xff1a;[本文] AI 时代的新语言&#xff1a;到底什么是 Prompt&#xff1f;为什么它如此重要&#xff1f;第二篇&#xff1a;告别废话&#xff01;掌握这 4 个黄金法则&#xff0c;让你的 Prompt 精准有效第…

#NFT艺术品哈希值唯一性与《民法典》“网络虚拟财产”认定的冲突

首席数据官高鹏律师数字经济团队创作&#xff0c;AI辅助 一、当区块链的「绝对唯一」遇上法律的「弹性空间」 每个NFT艺术品背后的哈希值&#xff0c;都像用数学密码刻在区块链上的指纹——世界上没有任何两个完全相同的编码。这种由0和1构筑的「数字DNA」&#xff0c;被技术信…

【arXiv2025】计算机视觉|即插即用|LBMamba:革新视觉模型效率,性能炸裂

论文地址&#xff1a;https://arxiv.org/pdf/2506.15976 代码地址&#xff1a;https://github.com/CiaoHe/bi-mamba 关注UP CV缝合怪&#xff0c;分享最计算机视觉新即插即用模块&#xff0c;并提供配套的论文资料与代码。 https://space.bilibili.com/473764881 摘要 Mamba…

【狂飙AGI】第7课:AGI-行业大模型(系列1)

目录 &#xff08;一&#xff09;服装史的GPT时刻&#xff08;二&#xff09;AI多学科诊疗系统&#xff08;三&#xff09;医疗大模型&#xff08;四&#xff09;生物医药大模型&#xff08;五&#xff09;教育大模型&#xff08;六&#xff09;心理大模型&#xff08;七&#…

(LeetCode 每日一题) 3307. 找出第 K 个字符 II (位运算、数学)

题目&#xff1a;3307. 找出第 K 个字符 II 思路&#xff1a;位运算&#xff0c;时间复杂度0(logk)。 当2^(i-1) <k 且 2^i>k &#xff0c;说明k在K2^i的右半段 &#xff0c;k和其前半段的某个字符有关系 即当k>K时&#xff0c;k是由k-K位置上的字符变化而来&#xf…

国产MCU学习Day4——CW32F030C8T6:独立看门狗功能全解析

CW32F030C8T6 看门狗功能概述 CW32F030C8T6 是芯源半导体&#xff08;WCH&#xff09;推出的 Cortex-M0 内核微控制器&#xff0c;内置独立看门狗&#xff08;IWDG&#xff09;和窗口看门狗&#xff08;WWDG&#xff09;&#xff0c;用于检测和恢复系统异常状态。 一.独立看门…

SAP升级过程中如何确保数据安全?

目录 升级过程中可能遇到的数据风险 升级前的准备工作 升级过程中的保护措施 升级后的验证工作 在数字化转型浪潮中&#xff0c;SAP系统作为企业核心业务运营的系统&#xff0c;其升级过程不仅关乎技术架构的革新&#xff0c;更直接关系到企业最宝贵的资产——数据安全。一…

Vue 3 + Element Plus 常见开发问题与解决方案手册

&#x1f31f;Vue 3 Element Plus 常见开发问题与解决方案手册 &#x1f9e0; 本文整理了常见但容易混淆的几个 Vue 3 前端开发问题&#xff0c;包括插槽、原型链、响应式数据处理、v-model 报错、样式阴影控制等&#xff0c;建议收藏学习&#xff01; &#x1f4cc;一、动态插…

Spring Boot + 本地部署大模型实现:安全性与可靠性保障

在将大语言模型集成到 Spring Boot 应用中时&#xff0c;安全性和可靠性是两个关键因素。本地部署的大模型虽然提供了强大的功能&#xff0c;但也可能带来一些安全风险&#xff0c;如数据泄露、模型被恶意利用等。本文将介绍如何在 Spring Boot 应用中保障本地部署大模型的安全…

Zookeeper 客户端 .net访问框架 ZookeeperNetEx项目开发编译

一、项目简介 ZooKeeperNetEx 项目是一个针对.NET开发的异步客户端库&#xff0c;旨在为开发者提供高效且可靠的分布式协调服务。‌ 该项目完全基于任务异步编程&#xff0c;兼容.NET 4.61及以上版本&#xff0c;包括.NET Core。ZooKeeperNetEx严格遵循官方Java客户端的逻辑&am…

【学习笔记】因果推理导论第2课

因果推理导论第2课 因果推断假设 前言一、假设1、 Ignorability / Exchangeability2、条件可交换 二、估计 前言 第一节课通过一些例子说明了为什么要做因果推断,以及通过控制混杂因素计算因果效应;这一节课将围绕为何控制混杂因素计算因果效应这一方法成立,讲述其涉及到的一些…

VASP 教程:VASP 机器学习力场微调

机器学习力场&#xff08;Machine-Learned Force Fields, MLFFs&#xff09;作为一种新兴的计算方法&#xff0c;已在第一性原理分子动力学&#xff08;Ab Initio Molecular Dynamics, AIMD&#xff09;模拟中展现出独特优势&#xff08;参见 VASP Wiki&#xff1a;Category:Ma…

Java+Vue开发的仓库管理系统,实时监控库存,精准统筹货物出入与调配

前言&#xff1a; 在当今竞争激烈的商业环境中&#xff0c;高效的仓库管理对于企业的运营和成本控制至关重要。一个完善的仓库管理系统能够帮助企业实现货物的精准存储、快速出入库、实时库存监控以及全面的数据分析&#xff0c;从而提升整体运营效率、降低库存成本、增强客户…