一、核心概念

1.1 不可变基础设施的核心原则

  • 一次构建,随处运行:镜像构建后不再修改

  • 替换而非修改:更新时创建新实例而非修改现有实例

  • 声明式配置:通过代码定义基础设施状态

  • 版本化与回滚:每个版本都可追溯和恢复

二、关键技术实现

2.1 容器化与镜像管理

dockerfile

复制

下载

# Dockerfile示例 - 构建不可变镜像
FROM alpine:3.18

# 所有依赖在构建时确定
RUN apk add --no-cache nodejs npm

# 复制应用代码
COPY . /app
WORKDIR /app

# 构建时安装依赖
RUN npm ci --only=production

# 固定运行时配置
EXPOSE 3000
USER node
CMD ["node", "server.js"]

2.2 基础设施即代码(IaC)

Terraform实现示例

hcl

复制

下载

# 基础设施定义
resource "aws_instance" "app_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"
  
  # 使用用户数据初始化,而非SSH修改
  user_data = base64encode(templatefile("${path.module}/init.sh.tpl", {
    version = var.app_version
  }))

  tags = {
    Name    = "app-server-${var.app_version}"
    Version = var.app_version
  }
  
  # 防止直接修改
  lifecycle {
    ignore_changes = [
      ami,  # 不允许更新AMI
      user_data # 不允许修改初始化脚本
    ]
    create_before_destroy = true
  }
}

2.3 编排层实现

Kubernetes Deployment配置

yaml

复制

下载

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  replicas: 3
  revisionHistoryLimit: 5  # 保留版本历史
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  
  selector:
    matchLabels:
      app: webapp
      version: "v1.2.3"  # 版本标签
  
  template:
    metadata:
      labels:
        app: webapp
        version: "v1.2.3"  # 镜像版本
        immutable: "true"
    spec:
      containers:
      - name: webapp
        image: registry.example.com/app:v1.2.3  # 完整镜像引用
        imagePullPolicy: Always  # 总是拉取指定版本
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
        # 不可变基础设施不应使用Exec探针修改容器
        resources:
          limits:
            memory: "256Mi"
            cpu: "500m"
        
        # 只读根文件系统
        securityContext:
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          
        # 配置文件通过ConfigMap注入
        volumeMounts:
        - name: config
          mountPath: /etc/app/config
          readOnly: true
      
      # 初始化配置
      initContainers:
      - name: init-config
        image: busybox:1.35
        command: ['sh', '-c', 'cp /config/* /etc/app/config/']
        volumeMounts:
        - name: config
          mountPath: /etc/app/config
        - name: config-volume
          mountPath: /config
      
      volumes:
      - name: config
        emptyDir: {}
      - name: config-volume
        configMap:
          name: app-config-v1

三、完整实现流程

3.1 CI/CD流水线设计

text

复制

下载

开发提交 → 镜像构建 → 安全扫描 → 推送镜像 → 部署更新
    ↑          ↑          ↑          ↑          ↑
  代码库     Docker   漏洞扫描   镜像仓库   编排工具
    ↓          ↓          ↓          ↓          ↓
 GitLab    Kaniko    Trivy    Harbor    ArgoCD
   │         │         │         │         │
   └─────────┴─────────┴─────────┴─────────┘
         不可变基础设施流水线

   篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案
【点击此处即可/免费获取】

3.2 GitOps工作流

yaml

复制

下载

# ArgoCD Application定义
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: production-app
spec:
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  
  source:
    repoURL: git@github.com:company/gitops-repo.git
    targetRevision: main
    path: apps/production
    
    # 启用不可变配置
    directory:
      recurse: true
      jsonnet: {}
  
  syncPolicy:
    automated:
      selfHeal: true  # 自动纠正漂移
      prune: true     # 删除多余资源
    
    syncOptions:
    - CreateNamespace=true
    - PruneLast=true
    - RespectIgnoreDifferences=true
    
    # 防止直接kubectl编辑
    ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
      - /spec/replicas  # 允许HPA调整副本数

四、配置与数据管理

4.1 配置分离策略

yaml

复制

下载

# ConfigMap - 应用配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  annotations:
    "checksum/config": "sha256:abc123..."  # 配置版本校验
data:
  app.properties: |
    database.url=${DB_URL}
    cache.enabled=true
    log.level=INFO
    
  # 环境特定配置
  environment: production

---
# Secret管理
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
type: Opaque
stringData:
  username: admin
  password: ${DB_PASSWORD}  # 从外部注入

4.2 数据持久化方案

yaml

复制

下载

# StatefulSet有状态应用
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: database
spec:
  serviceName: "database"
  podManagementPolicy: OrderedReady
  updateStrategy:
    type: RollingUpdate
  
  template:
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
          
  # 持久化存储
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "ssd"
      resources:
        requests:
          storage: 100Gi

五、安全加固措施

5.1 安全策略实施

yaml

复制

下载

# Pod Security Standards
apiVersion: v1
kind: PodSecurityPolicy
metadata:
  name: immutable-policy
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  volumes:
    - 'configMap'
    - 'secret'
    - 'persistentVolumeClaim'
  readOnlyRootFilesystem: true
  runAsUser:
    rule: 'MustRunAsNonRoot'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535

5.2 网络策略

yaml

复制

下载

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: immutable-app-policy
spec:
  podSelector:
    matchLabels:
      immutable: "true"
  policyTypes:
  - Ingress
  - Egress
  
  # 最小化网络权限
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: ingress-controller
    ports:
    - protocol: TCP
      port: 8080
  
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database
    ports:
    - protocol: TCP
      port: 5432

六、监控与可观测性

6.1 健康检查配置

yaml

复制

下载

# 完整探针配置
livenessProbe:
  httpGet:
    path: /health/live
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
  timeoutSeconds: 5
  failureThreshold: 3

readinessProbe:
  httpGet:
    path: /health/ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5
  timeoutSeconds: 3
  failureThreshold: 1

startupProbe:
  httpGet:
    path: /health/start
    port: 8080
  failureThreshold: 30
  periodSeconds: 10

  篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案
【点击此处即可/免费获取】

6.2 日志与指标收集

yaml

复制

下载

# 结构化日志配置
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluent-bit
spec:
  template:
    spec:
      containers:
      - name: fluent-bit
        image: fluent/fluent-bit:2.1
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi

七、最佳实践建议

7.1 实施检查清单

  • 所有镜像使用特定版本标签(非latest)

  • 启用只读根文件系统

  • 实施最小权限原则

  • 配置与代码分离管理

  • 自动化滚动更新策略

  • 保留足够的版本历史

  • 实施完整的监控覆盖

  • 定期扫描镜像漏洞

7.2 常见模式

  1. 蓝绿部署:通过流量切换实现零停机更新

  2. 金丝雀发布:渐进式验证新版本

  3. 混沌工程:验证不可变基础设施的恢复能力

  4. 自动回滚:基于健康检查的自动恢复机制

7.3 工具推荐

  • 镜像构建:Kaniko, Buildah

  • 安全扫描:Trivy, Grype, Snyk

  • 配置管理:Kustomize, Helm

  • GitOps:ArgoCD, Flux

  • 编排平台:Kubernetes, Nomad

八、挑战与解决方案

8.1 常见挑战

  1. 存储状态管理:使用StatefulSet和持久化存储

  2. 配置热更新:通过Sidecar或外部配置服务

  3. 启动时间优化:使用多阶段构建和层缓存

  4. 回滚复杂性:维护完整的部署历史和数据库迁移版本

8.2 迁移策略

  1. 从可变基础设施逐步迁移

  2. 先在新功能中采用不可变模式

  3. 建立混合运行环境

  4. 逐步淘汰SSH访问和管理员权限

不可变基础设施通过强制性的不变性原则,显著提高了系统的可靠性、安全性和可预测性,是现代云原生架构的核心支柱之一。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐