主题
第1章 Kubernetes 核心概念快速回顾
本章为零基础读者准备。如果你已经熟悉 Pod、Deployment、Label、Namespace 等概念,可以快速浏览或跳过。
1.1 什么是 Kubernetes
Kubernetes(常简称为 K8s)是一个用于自动部署、扩展和管理容器化应用的开源平台。它把一堆物理机或虚拟机抽象成一个统一的计算资源池,让你可以用声明式的方式(YAML)告诉集群“我想要什么”,集群负责帮你实现。
核心能力
| 能力 | 说明 |
|---|---|
| 调度 | 把容器放到合适的节点上运行 |
| 自愈 | 容器挂了自动重启、重新调度 |
| 扩缩容 | 根据负载自动或手动增加/减少副本 |
| 服务发现 | 让应用互相找到彼此 |
| 配置管理 | 管理配置、密钥、存储 |
1.2 Pod:最小的调度单元
Pod 是 Kubernetes 中最小可部署单元。一个 Pod 可以包含一个或多个容器,这些容器:
- 共享同一个网络命名空间(IP 地址、端口空间)
- 共享存储卷(Volume)
- 被一起调度到同一个节点上
Pod 示例
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80Pod 的特点
- 生命周期短暂:可能因扩缩容、节点故障、滚动更新被销毁重建。
- IP 不固定:Pod 重建后通常会获得新的 IP。
- 数量动态变化:Deployment 可以随时调整副本数。
正是因为 Pod 的这些特点,我们才需要 Service 来提供稳定的访问入口。
1.3 Deployment:管理 Pod 的副本
通常不会直接创建 Pod,而是通过 Deployment 来管理一组相同的 Pod 副本。
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80Deployment 会保证集群中始终有 3 个 app=web 标签的 Pod 在运行。
1.4 Label 与 Selector
Label(标签) 是附加在 Kubernetes 对象上的键值对,用于标识和选择对象。
yaml
metadata:
labels:
app: web
tier: frontend
env: productionSelector(选择器) 用于根据 Label 找到匹配的对象。Service 就是通过 selector 来决定哪些 Pod 是自己的后端。
1.5 Namespace:资源隔离
Namespace 用于在同一个集群中划分不同的逻辑空间,比如按团队、项目或环境划分。
bash
# 查看所有命名空间
kubectl get namespaces
# 在指定命名空间创建资源
kubectl apply -f my-service.yaml -n production同一个 Namespace 内的 Service 可以通过短名称访问,跨 Namespace 需要加命名空间后缀。
1.6 kubectl 基础命令
| 命令 | 作用 |
|---|---|
kubectl get pods | 查看 Pod |
kubectl get svc | 查看 Service |
kubectl apply -f file.yaml | 应用 YAML |
kubectl delete -f file.yaml | 删除 YAML 对应的资源 |
kubectl describe svc <name> | 查看 Service 详情 |
kubectl logs <pod-name> | 查看 Pod 日志 |
kubectl exec -it <pod-name> -- sh | 进入 Pod 容器 |
1.7 本章小结
- Kubernetes 通过 Pod 运行容器,Pod 是动态、短命、IP 不固定的。
- Deployment 管理一组 Pod 副本。
- Label 和 Selector 是 Kubernetes 中对象关联的核心机制。
- Namespace 提供逻辑隔离。
- 下一章将解释:既然 Pod 这么不稳定,应用之间如何稳定通信?
本章练习
- 创建一个包含 2 个副本的 Nginx Deployment。
- 查看 Pod 的 IP 地址,然后删除一个 Pod,观察新 Pod 的 IP 是否变化。
- 思考:如果另一个应用需要访问这些 Nginx Pod,直接写 Pod IP 有什么问题?