将 Go 部署到 Kubernetes:初学者基础指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 Go 和 Kubernetes 是完美搭档



Go (Golang) 和 Kubernetes (K8s) 是天生一对。Kubernetes 本身就是用 Go 编写的,因此原生工具链、高性能和部署的简便性使这对组合成为现代微服务的标准。如果您刚刚开始您的 DevOps 之旅,或者想要自动化部署您的 Go 应用,本指南将帮助您完成所有步骤:从编写一个简单的 Go HTTP 服务器到在 Kubernetes 集群中运行它。



在本文中,我们将介绍:

  • 将 Go 应用构建成 Docker 镜像
  • 创建最小的 Kubernetes 清单文件 (Deployment, Service, Ingress)
  • 部署并检查运行状态


假设您已经安装了 docker、kubectl 和 minikube(或者可以访问任何 K8s 集群)。



步骤 1:编写一个简单的 Go 应用



我们将创建一个基础的 HTTP 服务器,用于响应请求。创建文件 main.go:



package main

import ( "fmt" "net/http" "os")

func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "来自 Go 的问候!版本: %s", os.Getenv("APP_VERSION")) })

port := os.Getenv("PORT") if port == "" { port = "8080" }

fmt.Printf("服务器已在端口 %s 上启动", port) http.ListenAndServe(":"+port, nil)}


这个应用会读取环境变量 APP_VERSION(可以在部署时设置),并监听 PORT 指定的端口。现在在本地测试一下:



go run main.go# 在浏览器中打开 http://localhost:8080


创建 Go 模块

初始化模块以便于构建:

go mod init my-go-app


步骤 2:使用 Docker 进行容器化



为了部署到 Kubernetes,需要将应用打包成 Docker 镜像。我们使用多阶段构建 (multi-stage build) 来使镜像尽可能小。



创建文件 Dockerfile:



# 构建阶段FROM golang:1.22-alpine AS builderWORKDIR /appCOPY go.mod ./COPY main.go ./RUN go build -o my-app .

# 最终镜像FROM alpine:3.19WORKDIR /appCOPY --from=builder /app/my-app .EXPOSE 8080CMD ["./my-app"]


构建镜像并验证:

docker build -t my-go-app:v1 .docker run -p 8080:8080 my-go-app:v1# http://localhost:8080


步骤 3:Kubernetes 清单文件



现在准备用于在集群中部署的 YAML 文件。我们将创建三个资源:Deployment(管理 Pod)、Service(网络访问)和 Ingress(外部访问)。



3.1. Deployment

创建文件 deployment.yaml:



apiVersion: apps/v1kind: Deploymentmetadata:  name: go-app-deployment  labels:    app: go-appspec:  replicas: 2  selector:    matchLabels:      app: go-app  template:    metadata:      labels:        app: go-app    spec:      containers:      - name: go-app        image: my-go-app:v1        ports:        - containerPort: 8080        env:        - name: APP_VERSION          value: "1.0.0"        - name: PORT          value: "8080"        livenessProbe:          httpGet:            path: /            port: 8080          initialDelaySeconds: 5          periodSeconds: 10


这里我们设置了 2 个副本、存活探针 (liveness probe) 和环境变量。



3.2. Service

创建文件 service.yaml 用于内部访问:



apiVersion: v1kind: Servicemetadata:  name: go-app-servicespec:  selector:    app: go-app  ports:  - protocol: TCP    port: 80    targe                

博客

书籍推荐