最近公司上了一个新项目,前后端分离架构,微服务拆得七七八八。刚开始部署时还用传统方式一台台配服务器,没几天就扛不住了。服务一多,版本更新频繁,网络配置错一次,整个链路就卡住。后来干脆全切到容器化运维,用 Docker + Kubernetes 搞了一套自动化流程,才算真正松了口气。
容器不是万能药,但确实省事不少
很多人觉得容器就是打包镜像扔上去跑起来就行,其实真没那么简单。比如我们之前有个服务,本地跑得好好的,一上生产就连不上数据库。查了半天才发现是容器内部网络模式没设对,默认的 bridge 模式跟宿主机网络隔离太狠,跨节点通信还得额外配 overlay 网络。
后来改成 host 模式,问题解决了,但又发现端口冲突。最后折中用了自定义 bridge,配合 docker-compose 统一编排:
version: '3.8'
services:
app:
image: myapp:v1.2
ports:
- "8080:80"
networks:
- app-net
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
networks:
- app-net
networks:
app-net:
driver: bridge
K8s 的 Service 和 Ingress 得搭配着用
小团队一开始可能直接用 NodePort 暴露服务,简单粗暴。但我们用户量上来之后,发现外网 IP 变动频繁,域名解析老断。后来上了 Ingress-Nginx,统一入口转发,配合 cert-manager 自动续 HTTPS 证书,访问稳定多了。
比如这个 ingress 配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- app.mydomain.com
secretName: app-tls-cert
rules:
- host: app.mydomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
这样一来,前端、API、后台管理全走同一个域名,路径分流,运维不用再一个个开公网端口,安全也更有保障。
日志和监控不能省
容器跑着跑着挂了,总得知道为啥吧?我们一开始没接集中日志,出问题只能进 pod 手动看 logs,效率极低。后来上了 ELK(Elasticsearch+Fluentd+Kibana),所有容器日志自动采集,按服务名和时间过滤,排查速度提升明显。
监控方面,Prometheus 抓 metrics,Grafana 做面板,CPU、内存、请求延迟一目了然。比如某个服务突然 500 错误飙升,一看 dashboard 就发现是数据库连接池被打满,立马扩容 sidecar 容器,问题快速收敛。
别忽视网络策略(NetworkPolicy)
很多人只关注服务能不能通,不关心谁该通谁不该通。我们吃过亏——一个内部统计服务被意外暴露在公网,差点被扫走数据。现在默认所有 Pod 不允许外部访问,只通过 Ingress 开放必要路径,其他服务间调用靠 NetworkPolicy 控制。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-api-only
spec:
podSelector:
matchLabels:
app: payment-service
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: api-gateway
ports:
- protocol: TCP
port: 80
这种白名单机制,虽然配置麻烦点,但出了事责任清晰,审计也方便。
现在我们上线新版本,CI/CD 流水线自动构建镜像、推仓库、滚动更新,全程十分钟搞定。中间网络切换平滑,用户几乎无感。容器化运维管理搞顺了,人轻松多了,半夜告警少了,周末也能安心带娃出门玩了。