容器化部署与Kubernetes运维实战
引言容器技术彻底改变了应用交付的方式而KubernetesK8s已成为容器编排的事实标准。从单机Docker到生产级K8s集群企业正在经历一场基础设施的革命。然而K8s的复杂性也让许多团队望而却步——Pod调度、资源管理、网络配置、存储编排每一个环节都充满挑战。本文将从容器化基础出发深入探讨K8s生产环境的部署、运维和优化实践。一、容器化基础1.1 Dockerfile最佳实践# 多阶段构建减小最终镜像体积 # 阶段1构建 FROM golang:1.21-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED0 GOOSlinux go build -a -installsuffix cgo -o main . # 阶段2运行 FROM alpine:3.18 RUN apk --no-cache add ca-certificates WORKDIR /root/ # 仅复制编译后的二进制文件 COPY --frombuilder /app/main . # 非root用户运行 RUN adduser -D -u 1000 appuser USER appuser EXPOSE 8080 CMD [./main]构建优化对比| 优化项 | 传统方式 | 优化后 | |--------|----------|--------| | 镜像大小 | 1GB | ~20MB | | 攻击面 | 大包含编译工具 | 小仅运行时 | | 构建时间 | 慢每次都全量 | 快缓存依赖层 | | 安全性 | 低root运行 | 高非root用户 |1.2 镜像安全扫描# 使用Trivy扫描镜像漏洞 trivy image --severity HIGH,CRITICAL myapp:latest # 输出示例 # ├── myapp:latest (alpine 3.18.0) # │ ├── CVE-2023-1234: libssl1.1 (HIGH) # │ └── CVE-2023-5678: libcrypto1.1 (CRITICAL) # 集成到CI/CD # .github/workflows/security.yml - name: Scan Docker image uses: aquasecurity/trivy-actionmaster with: image-ref: myapp:${{ github.sha }} format: sarif output: trivy-results.sarif二、Kubernetes核心资源2.1 工作负载资源对比| 资源类型 | 适用场景 | 特点 | |----------|----------|------| | Pod | 单实例应用 | 最小调度单元 | | ReplicaSet | 无状态应用 | 确保副本数 | | Deployment | 无状态应用推荐 | 支持滚动更新 | | StatefulSet | 有状态应用 | 稳定网络标识 | | DaemonSet | 节点级服务 | 每个节点一个 | | Job | 一次性任务 | 完成即退出 | | CronJob | 定时任务 | 基于Job调度 |2.2 生产级Deployment配置apiVersion: apps/v1 kind: Deployment metadata: name: api-service labels: app: api-service spec: replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # 升级时最多超出的Pod数 maxUnavailable: 0 # 升级时最大不可用Pod数 selector: matchLabels: app: api-service template: metadata: labels: app: api-service version: v1.2.0 annotations: prometheus.io/scrape: true prometheus.io/port: 8080 prometheus.io/path: /metrics spec: affinity: # Pod反亲和性避免同一节点部署多个副本 podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - api-service topologyKey: kubernetes.io/hostname # 节点亲和性优先部署在有SSD的节点 nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 50 preference: matchExpressions: - key: disk-type