Kubernetes(K8s)作为容器编排领域的核心工具,其应用发布流程体现了自动化、弹性和可观测性的优势。本文将通过一个Tomcat应用的示例,详细讲解从配置编写到高级发布的完整流程,帮助开发者掌握Kubernetes应用部署的核心步骤。
一、编写资源配置文件
1. Deployment配置(核心工作负载)
# deployment-tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 3 # 初始副本数量
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:9.0-jdk11 # 明确版本号,避免latest的不确定性
ports:
- containerPort: 8080
resources:
requests:
memory: "512Mi"
cpu: "0.5"
limits:
memory: "1Gi"
cpu: "1"
livenessProbe: # 存活探针
httpGet:
path: /
port: 8080
initialDelaySeconds: 30
readinessProbe: # 就绪探针
httpGet:
path: /
port: 8080
关键字段解析:
replicas
:定义Pod副本数量,决定应用的冗余能力。resources
:设置资源请求与限制,避免资源争抢。livenessProbe
:K8s通过此检查自动重启异常容器。readinessProbe
:确保流量只转发到已就绪的Pod。
2. Service配置(服务暴露)
# service-tomcat.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
selector:
app: tomcat # 关联Deployment的Pod标签
ports:
- protocol: TCP
port: 80 # Service对外端口
targetPort: 8080 # 容器端口
type: LoadBalancer # 根据环境选择ClusterIP/NodePort/LoadBalancer
Service类型说明:
- ClusterIP:集群内部访问(默认)
- NodePort:通过节点IP+端口暴露
- LoadBalancer:云厂商提供的外部负载均衡器
二、应用配置与验证
1. 部署到集群
kubectl apply -f deployment-tomcat.yaml -f service-tomcat.yaml
2. 状态检查
# 查看Deployment状态(观察READY和AVAILABLE)
kubectl get deployments -l app=tomcat
# 检查Pod是否运行正常(STATUS应为Running)
kubectl get pods -l app=tomcat
# 查看Service端点分配
kubectl get svc tomcat-service
3. 故障排查
# 查看Pod详细事件(定位启动失败原因)
kubectl describe pod <pod-name>
# 实时查看容器日志
kubectl logs -f <pod-name>
三、滚动更新与发布策略
1. 标准滚动更新
# 方法1:直接修改YAML文件中的镜像版本并重新apply
kubectl apply -f deployment-tomcat.yaml
# 方法2:快速更新镜像(无需修改文件)
kubectl set image deployment/tomcat-deployment tomcat=tomcat:9.0.75-jdk11
更新过程观察:
kubectl rollout status deployment/tomcat-deployment
2. 金丝雀发布(Canary)
发布方式参考:Kubernetes生产实战(十三):灰度发布与蓝绿发布实战指南-CSDN博客|金丝雀/灰度/蓝绿发布的详解-CSDN博客
通过创建新版本Deployment并逐步调整流量比例:
# deployment-tomcat-canary.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-canary
labels:
app: tomcat
version: v2 # 新增版本标签
spec:
replicas: 1 # 初始少量副本
# 其他配置与新版本镜像一致...
流量分割策略(需配合Ingress或服务网格工具):
# 示例:使用Istio的VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: tomcat-routing
spec:
hosts:
- "tomcat.example.com"
http:
- route:
- destination:
host: tomcat-service
subset: v1
weight: 90 # 90%流量到旧版
- destination:
host: tomcat-service
subset: v2
weight: 10 # 10%到金丝雀版本
四、监控与回滚
1. 版本历史记录
kubectl rollout history deployment/tomcat-deployment
2. 快速回滚
# 回滚到上一个版本
kubectl rollout undo deployment/tomcat-deployment
# 回滚到指定版本
kubectl rollout undo deployment/tomcat-deployment --to-revision=2
五、高级配置扩展
1. 持久化存储
# 添加至Deployment的Pod模板
volumes:
- name: app-data
persistentVolumeClaim:
claimName: tomcat-pvc # 需预先创建PVC
2. 自动扩缩容(HPA)
kubectl autoscale deployment tomcat-deployment \
--cpu-percent=50 \
--min=2 \
--max=10
3. 配置管理
# 通过ConfigMap注入环境变量
envFrom:
- configMapRef:
name: tomcat-config
# 通过Secret挂载敏感信息
volumes:
- name: credentials
secret:
secretName: db-secret
六、完整发布流程图
[编写YAML] → [应用部署] → [状态验证]
↓ ↗
[更新配置] → [滚动更新]
↓ ↘
[监控指标] ← [金丝雀发布]
↓
[回滚/扩展]
总结
Kubernetes的应用发布流程通过声明式API实现了高度自动化,但实际生产环境中仍需关注以下要点:
- 版本控制:始终明确容器镜像版本,避免使用
latest
标签 - 渐进式交付:结合HPA、金丝雀发布和Istio等服务网格工具降低风险
- 可观测性:集成Prometheus监控和EFK日志体系
- 安全实践:使用NetworkPolicy限制Pod通信,通过RBAC控制权限
通过掌握这些核心步骤,开发者可以构建出健壮的云原生应用交付流水线。后续可进一步探索GitOps(如Argo CD)实现全自动化的持续部署。