Go 的理想生活:开发在你本地,跑在 Docker,扩容在 K8s,宕机有副本,世界和平。
🏗️ 一、Go 为什么天然适合容器化?
✅ 编译出来是单个二进制文件
✅ 没有复杂依赖(不像 Java 要 JVM,Node 要 runtime)
✅ 启动快,占用内存小,能直接打包成极简镜像(甚至只有 20MB)
用一句话总结:
Go 项目,天生就是 Docker 和 Kubernetes 的好朋友。
🐳 二、如何用 Docker 打包 Go 项目?
1️⃣ 写一个最简单的 Dockerfile
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o app
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/app .
CMD ["./app"]
解释:
- 分阶段构建:第一阶段编译,第二阶段只保留二进制文件
- 最终镜像基于
alpine,体积只有几 MB
2️⃣ 构建和运行容器
docker build -t myapp .
docker run -p 8080:8080 myapp
访问 localhost:8080,看到熟悉的 Go 服务跑起来啦!
🌍 三、进入 Kubernetes 世界
假设你已经有一个 K8s 集群(可以用 minikube / kind 本地搭建)
1️⃣ 写一个 Deployment 配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 8080
2️⃣ 配一个 Service 让外部访问
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
3️⃣ 部署到集群
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
检查状态:
kubectl get pods
kubectl get svc
📈 四、扩容和高可用
在 K8s 里扩容,不需要改 Go 项目,只要:
kubectl scale deployment myapp --replicas=10
这会自动启动 10 个副本,K8s 会帮你:
- 自动分配到不同节点
- 做负载均衡
- 处理宕机重启
🔐 五、环境变量与配置管理
推荐方式:
- 用
ConfigMap保存业务配置 - 用
Secret保存敏感信息(如数据库密码)
Go 项目内用:
os.Getenv("MYAPP_CONFIG")
在 K8s 部署里声明:
env:
- name: MYAPP_CONFIG
valueFrom:
configMapKeyRef:
name: myapp-config
key: config.yaml
🛡️ 六、实战踩坑提醒
| 坑 | 建议 |
|---|---|
| 容器过大 | 用 alpine 或 scratch 极简镜像 |
| 日志丢失 | 标准输出日志 → K8s 收集 |
| 容器失联 | 加 livenessProbe 和 readinessProbe |
| 配置硬编码 | 改用环境变量或挂载配置文件 |
✅ 总结
- Go 编译 → 二进制,打包简单
- Dockerfile 用分阶段构建,镜像小
- K8s 部署需要写 Deployment 和 Service
- 配置管理、健康检查、自动扩容都是 K8s 的强项
🎬 下一篇预告
下一篇我们将进入性能世界,教你用 pprof 找出 Go 项目里的“猪队友”,让你的服务跑得更快更稳。