Skip to content

今天我会带你把《模块八:虚拟化和其他》中涉及的课后练习题,逐一讲解,并给出每一讲练习题的解题思路和答案。 练习题详解 37 | 虚拟化技术介绍:VMware 和 Docker 的区别? 【问题】自己尝试用 Docker 执行一个自己方向的 Web 程序:比如 Spring/Django/Express 等? 【解析】关于如何安装 Docker,你可以参考官方文档。然后这里还有一个不错的 SpringBoot+MySQL+Redis 例子,你可以参考这个项目。 其他方向可以参考上面例子中的 Compose.yml 去定义自己的环境。一般开发环境喜欢把所有工具链用 Compose 放到一起,上线的环境数据库一般不会用 Docker 容器。Docker-Compose 是一个专门用来定义多容器任务的工具。 国内镜像可以用 Aliyun 的,具体可以参考这篇文档。(注:需要一个账号并且登录)

下面给出一个简单的 Docker Compose 示例,用于运行一个 Express 应用:

yaml
version: '3'
services:
  web:
    image: node:16
    working_dir: /app
    volumes:
      - ./app:/app
    ports:
      - "3000:3000"
    command: npm start
  redis:
    image: redis:alpine
    ports:
      - "6379:6379"

38 | 容器编排技术:如何利用 K8s 和 Docker Swarm 管理微服务? 【问题】为什么会有多个容器共用一个 Pod 的需求? 【解析】Pod 内部的容器共用一个网络空间,可以通过 localhost 进行通信。另外多个容器还可以共享一个存储空间。 比如一个 Web 服务容器,可以将日志、监控数据不断写入共享的磁盘空间,然后由日志服务、监控服务处理将日志上传。 再比如说一些跨语言的场景,比如一个 Java 服务接收到了视频文件传给一个 OpenCV 容器进行处理。 以上这种设计模式,我们称为边车模式(Sidecar),边车模式将数个容器放入一个分组内(例如 K8s 的 Pod),让它们可以分配到相同的节点上。这样它们彼此间可以共用磁盘、网络等。

在边车模式中,有一类容器,被称为 Ambassador Container,翻译过来是使节容器。对于一个主容器(Main Container)上的服务,可以通过 Ambassador Container 来连接外部服务。如下图所示:

┌─────────────────────────────────────┐
│           K8s Pod                    │
│  ┌──────────┐    ┌──────────────┐ │
│  │Main Container│───│Ambassador    │ │
│  │(Java服务)  │    │Container     │ │
│  └──────────┘    │(数据库连接)   │ │
│                   └───────┬───────┘ │
│                          │         │
│                   ┌───────▼───────┐ │
│                   │ Remote DB     │ │
│                   │ (外部服务)    │ │
│                   └──────────────┘ │
└─────────────────────────────────────┘

我们在开发的时候经常会配置不同的环境。如果每个 Web 应用都要实现一套环境探测程序,比如判断是开发、测试还是线上环境,从而连接不同的 MySQL、Redis 等服务,那么每个项目都需要引入一个公用的库,或者实现一套逻辑。这样我们可以使用一个边车容器,专门提供数据库连接的服务。让连接服务可以自动探测环境,并且从远程读取全局配置,这样每个项目的开发者不需要再关心数据库有多少套环境、如何配置了。

除了边车模式,Pod 中容器的常见协作模式还包括:

  • Adapter Container:将主容器的输出转换为统一的格式,供其他系统消费
  • Sidecar Container:为主容器提供辅助功能,如日志收集、监控

39 | Kubernetes 入门:为什么 K8s 是云原生架构的基础? 【问题】K8s 的核心概念有哪些?它们之间的关系是什么? 【解析】K8s 的核心概念包括:

  1. Pod:K8s 的最小调度单元,一个 Pod 可以包含一个或多个容器
  2. Service:为一组 Pod 提供稳定的访问入口,通过 Label Selector 关联 Pod
  3. Deployment:管理 Pod 的部署,支持滚动更新、回滚等
  4. Namespace:隔离不同环境或项目的资源
  5. ConfigMap/Secret:管理配置数据和敏感信息

它们的关系是:Deployment 管理 Pod 的生命周期,Service 为 Pod 提供负载均衡,ConfigMap/Secret 为 Pod 提供配置。

一个典型的 K8s 部署结构:

Deployment → ReplicaSet → Pod ← Service

                        ConfigMap/Secret

40 | 实战:如何通过 Docker 和 K8s 部署微服务? 【问题】如何设计一个高可用的微服务部署架构? 【解析】高可用微服务部署需要考虑以下要点:

  1. 多副本部署:每个微服务至少部署 2-3 个副本,分布在不同的节点上
  2. 健康检查:配置 livenessProbe 和 readinessProbe,自动剔除不健康的 Pod
  3. 资源限制:为每个容器设置合理的 CPU 和内存限制
  4. 反亲和性:将同一服务的 Pod 调度到不同的节点,避免单点故障
  5. 滚动更新:使用 RollingUpdate 策略,确保服务不中断

示例 Deployment 配置:

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-service
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - my-service
      containers:
        - name: my-service
          image: my-service:v1
          resources:
            limits:
              memory: "256Mi"
              cpu: "500m"
          livenessProbe:
            httpGet:
              path: /health
              port: 8080

总结 本模块我们学习了虚拟化技术和容器编排的核心知识。Docker 解决了应用打包和隔离的问题,而 K8s 则在容器之上提供了服务编排、自我修复、水平扩展等能力。边车模式是 K8s 中非常重要的设计模式,它允许我们通过添加辅助容器来增强主容器的功能,而不需要修改主容器的代码。

我们在开发的时候经常会配置不同的环境。如果每个 Web 应用都要实现一套环境探测程序,比如判断是开发、测试还是线上环境,从而连接不同的 MySQL、Redis 等服务,那么每个项目都需要引入一个公用的库,或者实现一套逻辑。这样我们可以使用一个边车容器,专门提供数据库连接的服务。让连接服务可以自动探测环境,并且从远程读取全局配置,这样每个项目的开发者不需要再关心数据库有多少套环境、如何配置了。

基于 VitePress 构建