今天我会带你把《模块八:虚拟化和其他》中涉及的课后练习题,逐一讲解,并给出每一讲练习题的解题思路和答案。 练习题详解 37 | 虚拟化技术介绍:VMware 和 Docker 的区别? 【问题】自己尝试用 Docker 执行一个自己方向的 Web 程序:比如 Spring/Django/Express 等? 【解析】关于如何安装 Docker,你可以参考官方文档。然后这里还有一个不错的 SpringBoot+MySQL+Redis 例子,你可以参考这个项目。 其他方向可以参考上面例子中的 Compose.yml 去定义自己的环境。一般开发环境喜欢把所有工具链用 Compose 放到一起,上线的环境数据库一般不会用 Docker 容器。Docker-Compose 是一个专门用来定义多容器任务的工具。 国内镜像可以用 Aliyun 的,具体可以参考这篇文档。(注:需要一个账号并且登录)
下面给出一个简单的 Docker Compose 示例,用于运行一个 Express 应用:
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 的核心概念包括:
- Pod:K8s 的最小调度单元,一个 Pod 可以包含一个或多个容器
- Service:为一组 Pod 提供稳定的访问入口,通过 Label Selector 关联 Pod
- Deployment:管理 Pod 的部署,支持滚动更新、回滚等
- Namespace:隔离不同环境或项目的资源
- ConfigMap/Secret:管理配置数据和敏感信息
它们的关系是:Deployment 管理 Pod 的生命周期,Service 为 Pod 提供负载均衡,ConfigMap/Secret 为 Pod 提供配置。
一个典型的 K8s 部署结构:
Deployment → ReplicaSet → Pod ← Service
↑
ConfigMap/Secret40 | 实战:如何通过 Docker 和 K8s 部署微服务? 【问题】如何设计一个高可用的微服务部署架构? 【解析】高可用微服务部署需要考虑以下要点:
- 多副本部署:每个微服务至少部署 2-3 个副本,分布在不同的节点上
- 健康检查:配置 livenessProbe 和 readinessProbe,自动剔除不健康的 Pod
- 资源限制:为每个容器设置合理的 CPU 和内存限制
- 反亲和性:将同一服务的 Pod 调度到不同的节点,避免单点故障
- 滚动更新:使用 RollingUpdate 策略,确保服务不中断
示例 Deployment 配置:
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 等服务,那么每个项目都需要引入一个公用的库,或者实现一套逻辑。这样我们可以使用一个边车容器,专门提供数据库连接的服务。让连接服务可以自动探测环境,并且从远程读取全局配置,这样每个项目的开发者不需要再关心数据库有多少套环境、如何配置了。