概念介绍
-
Pod:
- 书面概念:Kubernetes 中可以创建和管理的最小、最简单的可部署计算单元。
- 实际理解:类似于一台虚拟机,其中可以运行多个容器。容器之间可以通过 localhost 通信,并共享文件目录。同一 Pod 内多个容器监听相同端口会导致冲突。
- 通常每个 Pod 只运行一个容器。如果使用多容器 Pod,这些容器的业务应紧密相关。
- Pod 通常通过 Deployment、StatefulSet 等资源管理,而非直接创建。本文使用 Deployment。
-
Deployment:
- 用于管理 Pod,支持自动创建、更新和扩缩容。
- 自动创建:导入 Deployment 配置文件后,Kubernetes 自动拉取镜像并创建容器。
- 更新 Pod:修改 Deployment 配置中的镜像版本,系统会平滑地启动新 Pod 并终止旧 Pod,过渡方式可配置。
- 扩缩容:通过修改配置参数动态增加或减少 Pod 数量,支持基于 CPU 和内存使用率的自动扩缩容。
- 注意:Deployment 管理的是 Pod 级别。例如,一个 Pod 包含容器 A 和 B,扩容时会复制整个 Pod(包含 A 和 B),而非单独增加容器。
-
Service:
- 书面概念:为一组动态变化的 Pod 提供稳定的访问抽象层。
- 实际理解:提供固定的网络访问入口。Pod IP 是动态分配的,每次重启可能变化。Service 为服务(如 Nginx、Gateway、Nacos)提供固定 IP,并通过负载均衡将流量转发到健康的 Pod(默认轮询)。
-
Volumes:
- 存储卷,生命周期与所属 Pod 相同(Pod 删除则卷消亡),除非使用 PersistentVolume(持久存储卷)。
- 示例:为 Nginx 提供配置文件时,先创建名为 nginx-config 的 ConfigMap,添加 key 为 nginx.conf、value 为配置内容的键值对。然后在 Deployment 中将 nginx-config 定义为 Pod 的 ConfigMap 类型 Volume,并挂载到容器内的 /etc/nginx/nginx.conf。
-
ConfigMap:
- 键值对结构的配置文件对象,用于存储配置文件、环境变量等,实现配置与镜像分离(不存储敏感信息)。
- 注意:ConfigMap 更新后需重新部署 Pod 才能生效。
- 结构:一个 ConfigMap 对象可包含多个键值对。
Deployment 配置
Deployment 配置涵盖基础信息、副本策略、Pod 模板、容器配置、资源配置和存储配置(如 Nginx 配置文件)。
- 基础信息:设置 API 版本、资源类型、名称和标签。
- 副本策略:配置 Pod 选择器和副本数量。
- Pod 模板:定义 Pod 名称和标签(需与 selector 匹配)。
- 容器配置:指定容器镜像、拉取策略、名称和端口。
- 镜像:可使用现有镜像或自定义镜像(通过 Jenkins 等工具构建)。Kubernetes 自动拉取镜像并更新 Pod。
- 镜像拉取策略:可选 IfNotPresent(本地有则不拉取)或 Always(总是拉取最新)。本文使用 IfNotPresent,结合 Jenkins 构建不同标签的镜像(如 nginx:202511291717),确保节点无对应标签时拉取新镜像,避免不必要的下载。
- 资源配置:指定容器所需的 CPU 和内存资源。
- 存储配置:挂载 ConfigMap 作为配置文件(如 Nginx 配置)。
# 基础信息
apiVersion: apps/v1 # 使用 Deployment API 版本
kind: Deployment # 资源类型为 Deployment
metadata:
labels:
app: nginx # Deployment 的标签,用于识别
name: nginx # Deployment 名称
spec:
# 副本策略
replicas: 1 # 只运行 1 个 Pod 副本
selector:
matchLabels:
app: nginx # 选择管理哪些 Pod(匹配 template 中的 labels)
# Pod 模板
template:
metadata:
labels:
app: nginx # Pod 的标签,必须与 selector 匹配
# 容器配置
spec:
containers:
- image: 'registry.xxxxx.com/nginx:xxx' # 私有镜像仓库地址
imagePullPolicy: IfNotPresent # 镜像拉取策略(本地有就不拉取)。如果希望总是拉取新镜像,可设置为 Always。本文通过 Jenkins 部署,镜像标签每次更新(如 nginx:build-123),节点无此镜像时会自动拉取,故使用 IfNotPresent
name: nginx # 容器名称
# 容器暴露的端口(主要起文档作用,非必需配置)
ports:
- containerPort: 80
protocol: TCP
- containerPort: 443
protocol: TCP
# 资源配置
resources:
requests:
cpu: '1' # 请求 1 核 CPU
memory: 2Gi # 请求 2GB 内存
# 存储配置
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.conf # 挂载到容器内的文件路径
subPath: nginx.conf # 只挂载 configMap 中的 nginx.conf 键
volumes:
- name: nginx-config
configMap:
name: nginx-config # 使用的 ConfigMap 名称
Service 配置
Service 用于网络配置。由于 Nginx 涉及外部访问(通过云服务商配置),本文以网关(Gateway)的 Service 为例说明。
- Nginx 外部访问思路:
- 设置 Service 类型为 LoadBalancer。
- 选择私网负载均衡器。
- 创建弹性网卡绑定负载均衡器。
- Gateway Service 配置:
- 类型为 ClusterIP。
- 设置名称、标签。
- 选择器匹配标签为 app:gateway 的 Pod。
- 配置端口映射(Service 端口和目标 Pod 端口)。
# 基础信息
apiVersion: v1 # 使用 Core API,Service 是核心资源
kind: Service # 资源类型为 Service
metadata:
name: gateway # Service 名称
labels:
app: gateway # Service 的标签,用于资源筛选和识别
# 核心配置
spec:
selector:
app: gateway # 关键:选择标签为 app:gateway 的 Pod 作为后端
# 端口映射
ports:
- protocol: TCP
port: 8080 # Service 对外暴露的端口
targetPort: 8080 # 后端 Pod 容器的实际端口
# 服务类型
type: ClusterIP
# 通过云服务商创建外部负载均衡器(公网访问)
整个 Kubernetes 网络流量流向简介(示例之一)
- 外部流量流向:Nginx Service → Nginx Pod → Nginx 服务 → Gateway Service → Gateway Pod → Gateway 服务 → 目标服务 Pod。
- 具体路径:外网 → 弹性网卡 → 私网负载均衡器 → Nginx Service → Nginx Pod → Nginx 服务 → Gateway Service → Gateway Pod → Gateway 服务 → 相应服务 Pod → 相应服务。
备注
网关和其他服务需通过 Nacos 获取配置并注册服务,因此 Nacos 也需配置 Service(方式类似 Gateway)。读者可自行实践。
|