关注

一、云原生介绍-3-cloud-native--core-technologies

1.3 云原生代表技术

目录


1.3.1 微服务

定义与核心概念

微服务 (Microservices) 是一种架构风格,将原本单体应用拆分为多个独立自治的组件,每个组件都可以独立设计、开发、测试、部署和运维。

单体架构 vs 微服务架构
特征单体架构微服务架构
结构单一代码库,所有功能耦合多个小型服务,松耦合
部署整体部署,牵一发而动全身独立部署,快速迭代
扩展整体扩展,资源浪费按需扩展,精准扩容
技术栈统一技术栈多语言、多技术栈
容错单点故障影响全局服务隔离,故障隔离

微服务的核心优势

1. 独立性和自治性

每个微服务都是独立自治的:

  • 独立开发 - 小团队负责特定服务
  • 独立部署 - 不影响其他服务
  • 独立扩展 - 根据负载精准扩容
  • 技术选型自由 - 选择最适合的技术栈
2. 围绕业务能力组织

微服务按照业务能力而非技术层次组织:

传统分层架构:
┌─────────────────────┐
│   表现层 (UI)        │
├─────────────────────┤
│   业务逻辑层         │
├─────────────────────┤
│   数据访问层         │
└─────────────────────┘

微服务架构:
┌──────────┬──────────┬──────────┐
│用户服务  │订单服务  │支付服务  │
├────────────────────┼──────────
│用户数据  │订单数据  │支付数据  │
└──────────┴──────────┴──────────┘
3. 轻量级通信机制

各组件之间通过轻量级的 RESTful 风格接口进行交互和协同:

  • HTTP/REST - 基于 HTTP 协议的 RESTful API
  • gRPC - 高性能 RPC 框架,基于 HTTP/2
  • 消息队列 - 异步通信,如 Kafka、RabbitMQ
  • GraphQL - 灵活的查询接口

实际应用示例

早期 SUNET WEB 部署架构

例如:早期的 SUNET WEB 部署架构,使用微服务后,每一个组件都可以独立自治、运行、扩容、缩容等。

# Kubernetes 中的微服务部署示例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
      - name: user-service
        image: myapp/user-service:1.0.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"

微服务设计原则

原则说明实践建议
单一职责每个服务只做好一件事按业务领域划分服务边界
高内聚低耦合服务内部高度相关,服务间依赖最小化定义清晰的 API 契约
去中心化治理没有统一的技术管控允许团队自主选择技术
去中心化数据管理每个服务管理自己的数据库避免共享数据库
容错设计服务故障不影响整体实现熔断、降级、限流
可演进性支持持续重构和演进版本化 API,向后兼容

1.3.2 容器化

容器化的核心价值

容器化 是一种轻量级的虚拟化技术,将应用及其依赖打包成一个独立的运行单元。

容器 vs 虚拟机
┌─────────────────────────────────────────────────┐
│              虚拟机架构                          │
├─────────────┬─────────────┬─────────────┐
│   App A     │   App B     │   App C     │
│ Guest OS    │ Guest OS    │ Guest OS    │
├─────────────┴─────────────┴─────────────┤
│          Hypervisor                      │
├─────────────────────────────────────────┤
│          Infrastructure                  │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│              容器架构                            │
├─────┬─────┬─────┬─────┬─────┬─────┐
│App A│App B│App C│App D│App E│App F│
├─────┴─────┴─────┴─────┴─────┴─────┤
│         Docker Engine              │
├────────────────────────────────────┤
│      Host Operating System         │
├────────────────────────────────────┤
│         Infrastructure             │
└────────────────────────────────────┘

1.3.2.1 Docker 容器

Docker 概述

Docker 容器 属于基础设施层概念,是比虚拟机更轻量化的隔离工具,是微服务最佳载体。

Docker 于 2013 年开源,迅速成为容器技术的标准实现。

Docker 的核心组件
组件说明作用
Docker Engine容器运行时引擎容器的创建、运行和管理
Docker Image容器镜像应用的打包格式,包含运行环境和代码
Docker Container容器实例镜像的运行态
Docker Registry镜像仓库存储和分发镜像,如 Docker Hub
Docker 镜像分层结构
┌─────────────────────┐
│  可写容器层          │ ← 容器运行时创建
├─────────────────────┤
│  应用层              │ ← 应用代码
├─────────────────────┤
│  依赖层              │ ← 库和依赖
├─────────────────────┤
│  运行时层            │ ← Java/Python/Node 等
├─────────────────────┤
│  基础镜像层          │ ← Ubuntu/Alpine 等
└─────────────────────┘
Dockerfile 示例
# 基础镜像
FROM openjdk:11-jre-slim

# 设置工作目录
WORKDIR /app

# 复制应用 jar 包
COPY target/myapp.jar app.jar

# 暴露端口
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
Docker 的优势
  • 轻量级 - 共享内核,无 Guest OS 开销
  • 秒级启动 - 快速部署和扩展
  • 一致性 - 开发、测试、生产环境一致
  • 可移植 - 一次构建,到处运行
  • 资源利用率高 - 更高的服务器密度

1.3.2.2 Kubernetes 资源调度与容器编排

Kubernetes 概述

Kubernetes (简称 K8s) 是 Google 开源的容器编排平台,已成为容器编排的事实标准。

使用 Kubernetes 的资源调度与容器编排,可以实现 Docker 容器最优管理,进一步实现其 PaaS 层能力。

Kubernetes 的核心能力
能力说明
服务发现和负载均衡自动分配 IP,DNS 解析,负载均衡
存储编排自动挂载存储系统 (本地、云存储等)
自动部署和回滚滚动更新,自动回滚到稳定版本
自动扩缩容基于 CPU、内存等指标自动扩缩容
健康检查自动重启失败容器,移除不健康实例
密钥和配置管理集中管理敏感信息和配置
Kubernetes 架构
┌─────────────────────────────────────────────┐
│            Control Plane (控制平面)          │
├─────────────┬─────────────┬───────────────┤
│  API Server │  Scheduler  │  Controller   │
│             │             │  Manager      │
├─────────────┴─────────────┴───────────────┤
│              etcd (分布式存储)              │
└─────────────────────────────────────────────┘
                    ↓
┌─────────────────────────────────────────────┐
│            Worker Nodes (工作节点)           │
├─────────────┬─────────────┬───────────────┤
│   Kubelet   │  Kube-proxy │  Container    │
│             │             │  Runtime      │
└─────────────┴─────────────┴───────────────┘
核心资源对象
1.3.2.2.1 Pod - 最小调度单元
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: myapp:1.0.0
    ports:
    - containerPort: 8080
1.3.2.2.2 Deployment - 无状态应用
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
1.3.2.2.3 Service - 服务发现和负载均衡
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer
1.3.2.2.4 StatefulSet - 有状态应用

用于管理有状态应用,如数据库、分布式存储等。

1.3.2.2.5 ConfigMap 和 Secret - 配置管理
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database.url: "jdbc:mysql://db:3306/mydb"
  log.level: "INFO"
1.3.2.2.6 自动扩缩容示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

当 CPU 使用率超过 70% 时,自动增加 Pod 副本数 (最多 10 个);低于 70% 时自动减少。


1.3.3 服务网格

1.3.3.1 服务网格的定义

服务网格 (Service Mesh) 是用于处理服务间通信的基础设施层,提供去中心化的服务治理框架。

1.3.3.2 为什么需要服务网格

传统微服务的挑战

在没有服务网格的情况下:

┌─────────┐     ┌─────────┐     ┌─────────
│ Service │────▶│ Service │────▶│ Service │
│    A    │     │    B    │     │    C    │
└─────────┘     └─────────     └─────────┘
     │               │               │
     ▼               ▼               ▼
  熔断逻辑        熔断逻辑        熔断逻辑
  重试逻辑        重试逻辑        重试逻辑
  监控代码        监控代码        监控代码

问题:

  • 每个服务都要实现相同的治理逻辑
  • 代码重复,维护困难
  • 多语言实现复杂
  • 升级治理逻辑需要修改所有服务
服务网格的解决方案
┌─────────────────────────────────────────────┐
│          Control Plane (控制平面)            │
│         (Istio, Linkerd 等)                  │
└─────────────────────────────────────────────┘
              ↓ 配置下发
┌─────────┐     ┌─────────┐     ┌─────────
│ Service │────▶│ Service │────▶│ Service │
│    A    │     │    B    │     │    C    │
└────┬────┘     └────┬────┘     └────┬────┘
     │               │               │
     ▼               ▼               ▼
┌─────────┐   ┌─────────┐   ┌─────────
│ Sidecar │   │ Sidecar │   │ Sidecar │
│  Proxy  │   │  Proxy  │   │  Proxy  │
└─────────   └─────────┘   └─────────

优势:

  • ✅ 治理逻辑与业务逻辑分离
  • ✅ 统一实现,无需重复编码
  • ✅ 透明升级,无需重启服务
  • ✅ 多语言支持

1.3.3.3 服务网格的核心功能

功能说明实现方式
流量管理路由、负载均衡、熔断智能路由规则
安全认证mTLS、身份认证、授权加密通信、JWT
可观测性监控、日志、追踪指标收集、分布式追踪
策略执行限流、配额管理访问控制策略

1.3.3.4 主流服务网格实现

1. Istio

最流行的服务网格实现,功能最全面:

  • 数据平面: Envoy Proxy
  • 控制平面: Pilot, Citadel, Galley
  • 特性: 流量管理、安全、可观测性
2. Linkerd

轻量级服务网格,性能优异:

  • 数据平面: linkerd-proxy (Rust 编写)
  • 控制平面: 简单的 Kubernetes 部署
  • 特性: 简单易用,资源占用少

1.3.3.5 服务网格应用场景

以往需要对微服务或 API 接口去做治理和管理,一般会用到 REST 服务总线或 API 网关,将 API 接口注册和接入到 API 网关。

由于 API 网关本身是一个中心化的架构,所以所有的请求流量都可以通过 API 网关,由 API 网关实现对后端的负载均衡、熔断限流等功能。

服务网格 vs API 网关:

维度API 网关服务网格
位置系统入口,南北向流量服务之间,东西向流量
架构中心化去中心化
功能路由、认证、限流服务间通信治理
部署独立部署Sidecar 模式

1.3.4 不可变基础设施

1.3.4.1 概念定义

不可变基础设施 (Immutable Infrastructure) 是一种基础设施管理范式:

服务器一旦部署就不再修改,任何变更都通过替换整个服务器来实现。

1.3.4.2 可变 vs 不可变

传统可变基础设施
部署 → 配置 → 补丁 → 升级 → 修复 → ...
  ↓      ↓      ↓      ↓      ↓
 服务器状态持续变化,难以追踪和复现

问题:

  • ❌ 配置漂移 (Configuration Drift)
  • ❌ 环境不一致
  • ❌ 难以回滚
  • ❌ 故障排查困难
不可变基础设施
部署 v1.0 → 运行 → 发现问题
                    ↓
              部署 v1.1 (替换) → 运行

优势:

  • ✅ 环境一致性
  • ✅ 可重复部署
  • ✅ 快速回滚
  • ✅ 简化管理

1.3.4.3 实现不可变基础设施的关键技术

技术作用工具示例
容器化应用打包和隔离Docker, containerd
编排调度自动化部署和替换Kubernetes
基础设施即代码版本化基础设施定义Terraform, Ansible
持续交付自动化部署流程Jenkins, GitLab CI
镜像管理镜像版本控制Docker Registry, Harbor

1.3.4.4 不可变基础设施实践

1. 容器镜像版本化
# 使用具体版本号,避免使用 latest
FROM nginx:1.21.0-alpine

# 镜像标签包含应用版本
# myapp:1.0.0, myapp:1.0.1, myapp:1.1.0
2. Kubernetes 滚动更新
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1       # 最多超出 1 个 Pod
      maxUnavailable: 0 # 最少可用 Pod 数
  template:
    spec:
      containers:
      - name: myapp
        image: myapp:1.1.0  # 更新版本号触发替换
3. 基础设施即代码
# Terraform 示例
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  
  user_data = <<-EOF
              #!/bin/bash
              echo "Hello, World" > /var/www/html/index.html
              EOF
}

1.3.4.5 不可变基础设施的优势

优势说明实际收益
一致性开发、测试、生产环境完全一致减少环境相关问题
可靠性每次部署都是全新的干净环境降低配置错误
可追溯性所有变更通过版本控制审计和合规更容易
简化运维无需管理配置变更降低运维复杂度
快速恢复直接替换故障实例缩短 MTTR

1.3.5 声明式 API

1.3.5.1 声明式 vs 命令式

命令式 API (Imperative)

描述如何达到目标状态:

# 命令式:一步步执行操作
kubectl run nginx --image=nginx
kubectl expose deployment nginx --port=80
kubectl scale deployment nginx --replicas=3

特点:

  • 关注过程和步骤
  • 需要人工干预和排序
  • 难以保证最终状态
  • 不适合自动化
1.3.5.2 声明式 API (Declarative)

描述期望的目标状态:

# 声明式:定义期望状态
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
# 应用声明式配置
kubectl apply -f nginx-deployment.yaml

特点:

  • 关注结果而非过程
  • 系统自动实现目标
  • 幂等性 (多次应用结果一致)
  • 适合自动化和 GitOps

1.3.5.3 声明式 API 的核心优势

优势说明实际价值
简洁性只需定义目标状态降低复杂度
幂等性多次执行结果一致安全可靠
自愈性系统自动维持期望状态高可用性
可版本化YAML 文件可纳入版本控制审计和回滚
可组合性多个配置可以组合模块化设计

1.3.5.4 Kubernetes 中的声明式管理

1. 期望状态 vs 实际状态
┌─────────────────────────────────────┐
│   声明式配置 (期望状态)              │
│   replicas: 3                       │
└─────────────────────────────────────┘
              ↓
    Kubernetes 控制器
              ↓
┌─────────────────────────────────────┐
│   实际运行状态                       │
│   Pod-1 ✓                           │
│   Pod-2 ✓                           │
│   Pod-3 ✓                           │
└─────────────────────────────────────┘

如果实际状态偏离期望状态,控制器会自动纠正:

# 期望:3 个副本
spec:
  replicas: 3

# 如果一个 Pod 故障
# 控制器自动创建新的 Pod 维持 3 个副本
2. kubectl apply 工作流
# 1. 创建资源
kubectl apply -f config.yaml

# 2. 更新配置 (修改 YAML 后)
kubectl apply -f config.yaml

# 3. 查看差异
kubectl diff -f config.yaml

# 4. 回滚到之前版本
kubectl rollout undo deployment/myapp

1.3.5.5 声明式 API 设计原则

1. 资源导向
# 定义"是什么"而不是"怎么做"
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  # 期望的服务状态
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8080
2. 期望状态驱动
spec:
  replicas: 5  # 期望有 5 个副本
  # Kubernetes 自动创建/删除 Pod 来维持这个状态
3. 控制器模式
┌─────────────┐
│  期望状态   │
└──────┬──────┘
       ↓
┌─────────────┐
│  控制器     │ ← 持续对比期望 vs 实际
└──────┬──────┘
       ↓
┌─────────────┐
│  实际状态   │
└─────────────┘

1.3.5.6 GitOps - 声明式 API 的最佳实践

┌──────────┐     ┌──────────     ┌──────────┐
│  Git     │────▶│  CD      │────▶│Kubernetes│
│  Repo    │     │  Agent   │     │ Cluster  │
└──────────     └──────────┘     └──────────┘
     ↓                ↓                  ↓
  声明式配置     自动同步状态       运行工作负载
  (YAML 文件)

GitOps 原则:

  1. 所有配置存储在 Git 中
  2. Git 作为唯一事实来源
  3. 自动化工具确保集群状态与 Git 一致
  4. 自动检测和纠正漂移

1.3.6 DevOps

1.3.6.1 DevOps 概述

DevOps 是开发 (Development) 和运维 (Operations) 的组合,强调开发人员和运维人员的合作、沟通和持续改进。

1.3.6.2 DevOps 的核心理念

┌─────────────────────────────────────────┐
│            DevOps 文化                   │
│                                         │
│  开发团队 ←────合作────→ 运维团队        │
│     ↓                        ↓          │
│  快速迭代                  稳定可靠      │
│     └──────────┬───────────┘            │
│                ↓                        │
│         持续改进和优化                   │
└─────────────────────────────────────────┘

1.3.6.3 DevOps 三大支柱

支柱说明实践
文化协作、共享、责任打破部门墙,共同承担责任
自动化减少人工干预CI/CD、基础设施即代码
度量数据驱动改进监控指标、反馈循环

1.3.6.4 DevOps 实践体系

1. 持续集成 (CI)
┌────────┐   ┌────────┐   ┌────────┐   ┌────────┐
│  Code  │──▶│ Build  │──▶│  Test  │──▶│ Report │
└────────┘   └────────┘   └────────┘   └────────┘
     ↓            ↓            ↓            ↓
  代码提交    自动构建      自动测试      反馈结果

关键实践:

  • ✅ 频繁提交代码到主干
  • ✅ 自动化构建和测试
  • ✅ 快速发现问题和修复
  • ✅ 保持代码始终可部署
2. 持续部署 (CD)
┌────────┐   ┌────────┐   ┌────────┐   ┌────────┐
│  CI    │──▶│ Staging│──▶│ Prod   │──▶│Monitor │
│        │   │        │   │        │   │        │
└────────┘   └────────┘   └────────┘   └────────┘
     ↓            ↓            ↓            ↓
  通过测试     预发布验证    生产部署      持续监控

关键实践:

  • ✅ 自动化部署流程
  • ✅ 渐进式发布 (金丝雀、蓝绿)
  • ✅ 快速回滚能力
  • ✅ 部署即日常操作
3. 基础设施即代码 (IaC)
# Terraform 示例
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "public" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
}

关键实践:

  • ✅ 用代码定义基础设施
  • ✅ 版本控制基础设施
  • ✅ 可重复部署
  • ✅ 自动化配置管理

1.3.6.5 DevOps 工具链

阶段工具作用
计划Jira, Trello需求管理和任务跟踪
编码Git, GitHub版本控制和协作开发
构建Maven, Gradle项目构建和依赖管理
测试JUnit, Selenium自动化测试
发布Jenkins, GitLab CI持续集成和部署
部署Kubernetes, Ansible自动化部署
运维Prometheus, Grafana监控和告警
反馈ELK, Splunk日志分析和问题定位

1.3.6.6 DevOps 关键指标

DORA 四大指标
指标说明精英团队标准
部署频率多久部署一次代码按需 (每天多次)
变更前置时间代码提交到部署的时间< 1 小时
服务恢复时间故障恢复到正常的时间< 1 小时
变更失败率部署导致故障的比例0-15%

1.3.6.7 DevOps 与云原生的关系

┌─────────────────────────────────────┐
│         云原生技术栈                 │
│  (容器、微服务、K8s 等)              │
└──────────┬──────────────────────────┘
           ↓ 支撑
┌─────────────────────────────────────┐
│         DevOps 实践                  │
│  (CI/CD、自动化、监控等)             │
└──────────┬──────────────────────────┘
           ↓ 实现
┌─────────────────────────────────────┐
│         业务价值                     │
│  (快速交付、高质量、低成本)          │
└─────────────────────────────────────┘

云原生为 DevOps 提供:

  • 标准化的部署目标 (容器)
  • 自动化的编排平台 (K8s)
  • 可观测性基础设施 (监控、日志、追踪)

DevOps 为云原生提供:

  • 高效的交付流程
  • 自动化运维能力
  • 持续改进文化

1.3.7 总结

1.3.7.1 六大技术全景图

┌─────────────────────────────────────────────────┐
│              云原生代表技术                      │
├─────────────┬─────────────┬─────────────────────┤
│   微服务    │   容器化    │    服务网格         │
│  架构风格   │  运行载体   │   通信治理          │
├─────────────┼─────────────┼─────────────────────┤
│ 不可变基础  │  声明式 API  │      DevOps         │
│   设施      │  管理方式   │    文化实践         │
└─────────────┴─────────────┴─────────────────────┘

1.3.7.2 技术关系梳理

技术定位与其他技术的关系
微服务架构风格容器化部署,服务网格治理
容器化运行载体微服务的最佳载体,K8s 编排
服务网格通信层服务间通信治理,补充微服务
不可变设施管理范式容器化的自然延伸
声明式 API接口设计K8s 的核心设计哲学
DevOps文化实践贯穿所有技术和流程

1.3.7.3 核心价值主张

  1. 提高交付速度 - 快速迭代和部署
  2. 提升系统质量 - 容错、易管、可观察
  3. 降低运维成本 - 自动化和标准化
  4. 优化资源利用 - 弹性伸缩和高效调度
  5. 增强创新能力 - 降低试错成本

1.3.7.4 下一步学习路径

  • 📚 深入学习 Kubernetes 架构和实践
  • 🔧 掌握至少一种服务网格 (推荐 Istio)
  • 🚀 实践 GitOps 和 DevOps 工具链
  • 🏗️ 设计微服务架构和拆分策略
  • 📊 建立可观测性体系

本文档属于容器云和云原生架构师课程体系
最后更新:2026 年 3 月

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/m0_74823507/article/details/158847853

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--