Docker: Kubernetes基础

最后更新:2026-08-26

⚠️ 推荐阅读条件: 仅当你遇到以下情况时才需要学习本课:

  • 单机 Docker 已无法承载流量
  • 需要自动扩缩容、自愈、多节点高可用
  • 团队已决定迁移到 K8s

如果你的项目用 Docker + Compose 就够用,跳过本课直接看第 24 课

1. 你将学到


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) 架构总览

100%
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。

📖 小节


📝 作业

  1. 基础题(难度⭐):用 minikube 启动本地 K8s 集群,部署一个 Nginx 并用 port-forward 访问。
  2. 进阶题(难度⭐⭐):用 YAML 文件创建 Deployment 和 Service,kubectl apply -f 部署并暴露端口。
  3. 挑战题(难度⭐⭐⭐):执行一次滚动更新(nginx:1.25→1.26),观察 kubectl rollout status,然后 kubectl rollout undo 回滚。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏