DevOps实践的核心在于将应用部署、扩缩容、故障恢复全流程自动化。Kubernetes容器编排已成为这一领域的事实标准,从Docker镜像构建到K8s集群运维,每个环节都需要精确配置。本文以一个Java微服务项目为例,覆盖完整的CI/CD流水线和监控体系搭建。
一、Docker镜像构建规范与优化
Docker自动化部署的第一步是构建高质量镜像。生产环境镜像需要满足三个条件:体积小、构建可复现、运行安全。多阶段构建是减小镜像体积的核心手段。
# Dockerfile - 多阶段构建Java应用
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline # 依赖缓存层
COPY src/ ./src/
RUN mvn package -DskipTests
FROM eclipse-temurin:17-jre-alpine
RUN addgroup -S app && adduser -S app -G app
WORKDIR /app
COPY --from=builder /build/target/app.jar .
USER app
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget -qO- http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", "-XX:MaxRAMPercentage=75.0", "-jar", "app.jar"]
镜像构建优化要点:基础镜像选用alpine变体可将体积从800MB压缩到200MB以下;依赖单独复制利用Docker缓存层加速重复构建;非root用户运行是安全基线要求;HEALTHCHECK指令让K8s能正确判断容器存活状态。
二、Kubernetes容器编排部署清单
K8s部署资源包括Deployment、Service、ConfigMap、Secret等。以下是一个生产级部署清单,包含资源限制、探针配置和滚动更新策略。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
namespace: production
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: order-service
image: registry.yunthe.com/order-service:v2.1.0
ports:
- containerPort: 8080
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1024Mi"
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 15
periodSeconds: 5
envFrom:
- configMapRef:
name: order-service-config
- secretRef:
name: order-service-secret
资源requests和limits的设置需要基于实际监控数据。CPU limit设置过低会导致throttling(节流),表现为接口延迟突增;memory limit设置过低会触发OOMKilled。建议通过压力测试确定合理值。
三、CI/CD流水线配置
CI/CD流水线的目标是代码合并到主分支后自动构建、测试、部署。以下为GitLab CI配置示例,涵盖构建、扫描、部署三个阶段:
# .gitlab-ci.yml
stages:
- build
- test
- scan
- deploy
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
build:
stage: build
script:
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
only:
- main
test:
stage: test
image: maven:3.9-eclipse-temurin-17
script:
- mvn verify -B
only:
- main
scan:
stage: scan
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL $IMAGE_TAG
only:
- main
deploy:
stage: deploy
script:
- kubectl set image deployment/order-service
order-service=$IMAGE_TAG -n production
- kubectl rollout status deployment/order-service
-n production --timeout=300s
only:
- main
when: manual # 生产环境手动触发
故障应急响应的关键是快速回滚。K8s原生支持一键回滚:
# 查看发布历史
kubectl rollout history deployment/order-service -n production
# 回滚到上一版本
kubectl rollout undo deployment/order-service -n production
# 回滚到指定版本
kubectl rollout undo deployment/order-service -n production --to-revision=2
四、监控告警体系搭建
监控告警体系是SRE稳定性工程的基础设施。Prometheus + Grafana + AlertManager是当前主流方案。监控指标分为四个黄金信号:延迟、流量、错误、饱和度。
Prometheus ServiceMonitor配置示例:
# 监控Java微服务的JVM指标
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: order-service-monitor
namespace: production
spec:
selector:
matchLabels:
app: order-service
endpoints:
- port: metrics
path: /actuator/prometheus
interval: 15s
scrapeTimeout: 10s
核心告警规则示例:
# Prometheus告警规则
groups:
- name: service-alerts
rules:
# Pod频繁重启
- alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total[15m]) > 0
for: 5m
labels:
severity: critical
annotations:
summary: "Pod {{ $labels.pod }} 频繁重启"
# HTTP 5xx错误率超阈值
- alert: HighErrorRate
expr: |
sum(rate(http_server_requests_seconds_count{status=~"5.."}[5m]))
/ sum(rate(http_server_requests_seconds_count[5m])) > 0.05
for: 2m
labels:
severity: warning
annotations:
summary: "{{ $labels.application }} 5xx错误率超过5%"
# CPU饱和度
- alert: HighCPUUsage
expr: |
avg(rate(container_cpu_usage_seconds_total[5m]))
by (pod) * 100 > 80
for: 10m
labels:
severity: warning
五、混沌工程与日志分析
混沌工程通过主动注入故障验证系统韧性。Chaos Mesh是K8s生态的主流混沌测试工具,支持网络延迟、Pod杀除、磁盘填充等故障注入:
# 注入200ms网络延迟到order-service
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: order-service-delay
spec:
action: delay
mode: all
selector:
namespaces:
- production
labelSelectors:
app: order-service
delay:
latency: "200ms"
correlation: "100"
jitter: "50ms"
duration: "60s"
日志分析依赖EFK(Elasticsearch + Fluentd + Kibana)或Loki方案。Fluentd以DaemonSet方式部署在每个节点,收集容器stdout/stderr日志:
# Fluentd DaemonSet核心配置
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
format json
read_from_head true
</source>
<filter kubernetes.**>
@type kubernetes_metadata
</filter>
<match kubernetes.**>
@type elasticsearch
host elasticsearch.logging.svc.cluster.local
port 9200
logstash_format true
logstash_prefix k8s-logs
</match>
Kubernetes容器编排的运维工作是一个持续优化的过程。从Docker自动化部署到监控告警体系的每个环节都需要根据实际业务负载不断调整。日志分析和混沌工程作为上层能力,帮助运维团队从被动响应转向主动预防。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-rong-qi-bian-pai-shi-zhan-cong-docker-zi-dong/