在 Ubuntu 22.04 上使用 Minikube 部署 Go 應用到 Kubernetes

文章目錄

    • 環境說明
    • 目標
    • 步驟與問題解決
      • 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;從而提升整體運營效率、降低庫存成本、增強客戶…