引言:为什么 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