Docker: Kubernetes基础
最后更新:2026-08-26
⚠️ 推荐阅读条件: 仅当你遇到以下情况时才需要学习本课:
- 单机 Docker 已无法承载流量
- 需要自动扩缩容、自愈、多节点高可用
- 团队已决定迁移到 K8s
如果你的项目用 Docker + Compose 就够用,跳过本课直接看第 24 课。
1. 你将学到
- K8s 核心架构与概念
- Pod / Deployment / Service 三大对象
- kubectl 常用命令
- 从 Compose 到 K8s 的迁移思路
- minikube 本地集群搭建
2. 一个集群扩容的故事
(1) 痛点:Swarm 不够用了
Alice 部署的 Swarm 集群已经不够用了——5 个副本扛不住流量、滚动更新不够灵活、缺乏自动扩缩容、没有完善的配置管理。团队决定迁移到 Kubernetes,但 Alice 对 K8s 的 Pod、Deployment、Service 一头雾水。
(2) minikube 本地学习的解法
Bob 用 minikube 在 Alice 的笔记本上搭建了一个 K8s 开发环境。
BASH
# Start local K8s cluster
minikube start --driver=docker
# Deploy an application
kubectl create deployment nginx --image=nginx:1.25-alpine --replicas=3
kubectl expose deployment nginx --port=80 --type=NodePort
(3) 收益:5 分钟理解 K8s 核心概念
Alice 发现 K8s 的 Pod 和 Docker container 有很多相似之处,Deployment 就是 Compose 的 replicas,Service 就是 Docker 的网络 + 端口映射。
3. K8s 核心架构
(1) 架构总览
graph TB
K["kubectl CLI"] --> API["API Server<br/>REST API 入口"]
API --> SCHED["Scheduler<br/>Pod 调度"]
API --> ETCD["etcd<br/>集群状态存储"]
API --> CTRL["Controller Manager<br/>Deployment/ReplicaSet"]
API --> KUBELET["Kubelet<br/>节点代理"]
KUBELET --> CRI["Container Runtime<br/>containerd/Docker"]
CRI --> POD["Pod<br/>容器组"]
(2) K8s 核心组件
| 组件 | 作用 | 类比 Docker |
|---|---|---|
| API Server | 集群 API 入口 | Docker Daemon API |
| etcd | 状态存储 | Docker 内部状态 |
| Scheduler | Pod 调度 | Swarm 调度器 |
| Kubelet | 节点代理 | Docker Daemon(单节点) |
| Kube-proxy | 网络代理 | Docker Routing Mesh |
4. K8s 核心概念
(1) Pod / Deployment / Service
| K8s 概念 | 作用 | Docker 类比 |
|---|---|---|
| Pod | 最小调度单元(1+ 容器) | Container(但可包含多个) |
| Deployment | 声明式副本管理 | Compose replicas + restart |
| Service | 稳定网络标识 + 负载均衡 | Docker DNS + Routing Mesh |
| Ingress | HTTP 路由入口 | Nginx reverse proxy |
| ConfigMap | 配置管理 | 环境变量 / env_file |
| Secret | 敏感信息 | Docker Secret |
| PV/PVC | 持久化存储 | Named Volume |
(2) Docker Compose → K8s 概念映射
| Docker Compose | Kubernetes | 说明 |
|---|---|---|
service |
Deployment + Service |
服务定义 |
replicas |
Deployment.spec.replicas |
副本数 |
ports |
Service.spec.ports |
端口映射 |
volumes |
PV + PVC |
持久化存储 |
environment |
ConfigMap + Secret |
配置管理 |
depends_on |
initContainers / 顺序启动 |
依赖控制 |
healthcheck |
livenessProbe + readinessProbe |
健康检查 |
5. kubectl 常用命令
▶ 示例:minikube 启动集群(难度⭐⭐)
BASH
# Start a local K8s cluster
minikube start --driver=docker --kubernetes-version=v1.28.0
# Check cluster status
kubectl cluster-info
kubectl get nodes
💻 输出:
TEXT
📖 仅展示
Kubernetes control plane is running at https://127.0.0.1:32768
CoreDNS is running at https://127.0.0.1:32768/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 60s v1.28.0
▶ 示例:kubectl create deployment(难度⭐⭐)
BASH
# Create a deployment with 3 replicas
kubectl create deployment nginx --image=nginx:1.25-alpine --replicas=3
# Check deployment status
kubectl get deployments
kubectl get pods
💻 输出:
TEXT
📖 仅展示
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 30s
NAME READY STATUS RESTARTS AGE
nginx-6c8b5f4d8f-abc12 1/1 Running 0 30s
nginx-6c8b5f4d8f-def34 1/1 Running 0 30s
nginx-6c8b5f4d8f-ghi56 1/1 Running 0 30s
▶ 示例:kubectl expose service(难度⭐⭐)
BASH
# Expose deployment as a service
kubectl expose deployment nginx --port=80 --type=NodePort
# Get the service URL
minikube service nginx --url
# Or use port-forward for local access
kubectl port-forward svc/nginx 8080:80
▶ 示例:kubectl scale 扩展(难度⭐⭐)
BASH
# Scale to 5 replicas
kubectl scale deployment nginx --replicas=5
# Verify
kubectl get pods
▶ 示例:kubectl rollout 滚动更新(难度⭐⭐⭐)
BASH
# Update the image
kubectl set image deployment/nginx nginx=nginx:1.26-alpine
# Check rollout status
kubectl rollout status deployment/nginx
# Rollback if something goes wrong
kubectl rollout undo deployment/nginx
# View rollout history
kubectl rollout history deployment/nginx
6. YAML 声明式配置
(1) Deployment + Service YAML
YAML
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
resources:
limits:
cpu: "0.5"
memory: "128Mi"
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: NodePort
BASH
# Apply the YAML
kubectl apply -f nginx-deployment.yaml
# Verify
kubectl get all
7. 单节点 vs 多节点 K8s
| 维度 | minikube | kind | 生产集群 |
|---|---|---|---|
| 节点数 | 1 | 1+ | 3+ |
| 用途 | 学习/开发 | CI 测试 | 生产 |
| 安装 | minikube start | kind create cluster | kubeadm / 云服务 |
| 高可用 | ❌ | ❌ | ✅ |
| 自动扩缩 | ❌ | ❌ | ✅ (HPA) |
8. 完整示例:minikube 部署应用
BASH
# ============================================
# Complete walkthrough: K8s on minikube
# Covers: cluster, deploy, service, scale, update
# ============================================
# 1. Start minikube cluster
minikube start --driver=docker
# 2. Create deployment
kubectl create deployment web --image=nginx:1.25-alpine --replicas=2
# 3. Expose as service
kubectl expose deployment web --port=80 --type=NodePort
# 4. Access the application
minikube service web --url
# Or: kubectl port-forward svc/web 8080:80
# 5. Scale to 5 replicas
kubectl scale deployment web --replicas=5
kubectl get pods -w
# 6. Rolling update
kubectl set image deployment/web nginx=nginx:1.26-alpine
kubectl rollout status deployment/web
# 7. Rollback
kubectl rollout undo deployment/web
# 8. Clean up
kubectl delete deployment web
kubectl delete service web
minikube stop
❓ 常见问题
Q K8s 和 Docker Swarm 选哪个?
A Swarm 简单易学,适合小团队(<20 人)和简单场景。K8s 功能强大但复杂,适合大团队、需要自动扩缩容、完善生态。经验法则:单机 3-5 节点用 Swarm,5+ 节点或需要高级功能用 K8s。
Q Pod 和 Container 有什么区别?
A Pod 是 K8s 最小调度单元,可包含 1 个或多个容器。Pod 内的容器共享网络和存储。大多数 Pod 只有一个容器——这种情况下 Pod ≈ Container。多容器 Pod 用于紧密耦合的场景(如 App + Sidecar proxy)。
Q K8s 需要多少台服务器?
A 学习:1 台(minikube)。开发:1-3 台。生产:3+ Master + N Worker。云服务商的托管 K8s(EKS/GKE/AKS)不需要管 Master 节点,最低 1 Worker 即可。
Q 我该从 Compose 直接学 K8s 吗?
A 建议先精通 Docker + Compose(本课 1-22 课),再学 K8s。Compose 覆盖 80% 的使用场景,K8s 只在需要集群时才用。直接学 K8s 容易被概念淹没——先理解容器和编排的基础,再学 K8s 的抽象。
Q minikube 和 kind 哪个适合学习?
A minikube 功能更全(Dashboard、addons、多驱动),适合初学者。kind(Kubernetes in Docker)更轻量、启动更快,适合 CI 和多集群测试。学习阶段推荐 minikube。
📖 小节
- K8s 核心架构:API Server + etcd + Scheduler + Kubelet + Kube-proxy
- Pod(最小调度单元)≈ Container,Deployment(副本管理)≈ Compose replicas,Service(网络)≈ Docker DNS
- kubectl 是 K8s 的 CLI,对应 docker 命令
- minikube 一行命令启动本地 K8s 集群,适合学习
- K8s 的声明式 YAML 配置对应 Compose 的 docker-compose.yml
- 从 Docker 迁移到 K8s:Compose service → Deployment + Service,Volume → PV/PVC,env → ConfigMap + Secret
📝 作业
- 基础题(难度⭐):用 minikube 启动本地 K8s 集群,部署一个 Nginx 并用 port-forward 访问。
- 进阶题(难度⭐⭐):用 YAML 文件创建 Deployment 和 Service,
kubectl apply -f部署并暴露端口。 - 挑战题(难度⭐⭐⭐):执行一次滚动更新(nginx:1.25→1.26),观察
kubectl rollout status,然后kubectl rollout undo回滚。