Kubernetes 核心组件
学习目标
- 掌握 Kubernetes 的核心资源对象
- 理解 Pod、Deployment、Service 的作用
- 了解 Namespace 和 ConfigMap/Secret 的用途
核心概念
核心资源对象
┌─────────────────────────────────────────────────────────────┐
│ 核心资源对象 │
├─────────────────────────────────────────────────────────────┤
│ 工作负载:Pod, Deployment, StatefulSet, DaemonSet, Job │
│ 服务发现:Service, Ingress │
│ 配置存储:ConfigMap, Secret │
│ 存储:PersistentVolume, PersistentVolumeClaim │
│ 命名空间:Namespace │
└─────────────────────────────────────────────────────────────┘
Pod
定义:
• 最小部署单元
• 一个或多个容器的集合
• 共享网络和存储
特点:
┌─────────────────────────────────────┐
│ Pod │
│ ┌────────────┐ ┌────────────┐ │
│ │ Container 1│ │ Container 2│ │
│ │ │ │ │ │
│ │ 共享: │ │ 共享: │ │
│ │ • Network │ │ • Network │ │
│ │ • IPC │ │ • IPC │ │
│ │ • Volume │ │ • Volume │ │
│ └────────────┘ └────────────┘ │
└─────────────────────────────────────┘
示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: nginx:latest
ports:
- containerPort: 80
Deployment
定义:
• 声明式管理 Pod
• 支持滚动更新和回滚
• 自动维护副本数
核心功能:
┌─────────────────────────────────────┐
│ Deployment │
│ • 声明期望状态 (3 个副本) │
│ • 自动创建 ReplicaSet │
│ • ReplicaSet 创建 Pod │
│ • 监控并维持副本数 │
│ • 支持滚动更新 │
└─────────────────────────────────────┘
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: nginx:1.24
ports:
- containerPort: 80
Service
定义:
• 稳定的网络访问入口
• 负载均衡
• 服务发现
类型:
┌─────────────────────────────────────┐
│ ClusterIP (默认) │
│ • 集群内部访问 │
│ • 分配虚拟 IP │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ NodePort │
│ • 通过节点端口外部访问 │
│ • 端口范围: 30000-32767 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ LoadBalancer │
│ • 云厂商负载均衡器 │
│ • 自动分配外部 IP │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ ExternalName │
│ • 映射到外部 DNS │
└─────────────────────────────────────┘
示例:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 80
type: ClusterIP
Namespace
定义:
• 资源隔离机制
• 虚拟集群
默认命名空间:
┌─────────────────────────────────────┐
│ default - 默认命名空间 │
│ kube-system - 系统组件 │
│ kube-public - 公共资源 │
│ kube-node-lease - 节点心跳 │
└─────────────────────────────────────┘
使用场景:
• 多团队共享集群
• 环境隔离 (dev/staging/prod)
• 资源配额管理
示例:
apiVersion: v1
kind: Namespace
metadata:
name: development
ConfigMap 和 Secret
ConfigMap:
• 存储非敏感配置
• 键值对或文件
• 可挂载为卷或环境变量
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: production
LOG_LEVEL: info
config.json: |
{"key": "value"}
Secret:
• 存储敏感数据
• Base64 编码
• 可挂载为卷或环境变量
示例:
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64 编码
password: cGFzc3dvcmQ= # base64 编码
资源关系图
┌─────────────────────────────────────────────────────────────┐
│ 资源关系图 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Deployment │
│ ↓ (管理) │
│ ReplicaSet │
│ ↓ (创建) │
│ Pod ←──── ConfigMap/Secret (配置) │
│ ↓ │
│ Container │
│ ↓ (暴露) │
│ Service ←──── Ingress (外部访问) │
│ │
└─────────────────────────────────────────────────────────────┘
实践练习
练习 1:理解组件
回答以下问题:
- Pod 和容器的关系是什么?
- Deployment 如何管理 Pod?
- Service 的三种主要类型有什么区别?
练习 2:编写 YAML
编写以下资源的 YAML 文件:
- 一个包含两个容器的 Pod
- 一个 3 副本的 Deployment
- 一个 ClusterIP 类型的 Service
练习 3:资源关系
画出以下资源的关系图:
- Deployment
- ReplicaSet
- Pod
- Service
- ConfigMap
常见误解
1. "Pod 是容器"
错误理解:Pod 就是容器
正确理解:
• Pod 是容器的集合
• 通常一个 Pod 一个容器
• Pod 是最小调度单位
2. "Deployment 直接管理 Pod"
错误理解:Deployment 直接创建 Pod
正确理解:
• Deployment 创建 ReplicaSet
• ReplicaSet 创建 Pod
• 间接管理关系
3. "Service 是负载均衡器"
错误理解:Service 是独立的负载均衡设备
正确理解:
• Service 是虚拟 IP 和端点
• kube-proxy 实现网络规则
• 负载均衡在节点级别实现
小结
| 要点 | 说明 |
|---|---|
| Pod | 最小部署单元,容器集合 |
| Deployment | 声明式管理,滚动更新 |
| Service | 稳定入口,负载均衡 |
| Namespace | 资源隔离 |
| ConfigMap | 非敏感配置存储 |
| Secret | 敏感数据存储 |
| 核心关系 | Deployment → ReplicaSet → Pod |
练习编辑器
bash
Loading...