主题
Kubernetes 进阶
单台服务器手动 docker 部署能跑,但扩容、故障恢复、滚动发布都要人肉。Kubernetes(K8s)把这些自动化。面试问到它,能讲清"它解决什么问题 + 核心概念"就够了。
一、K8s 解决什么问题
| 问题 | Docker 手动部署 | K8s |
|---|---|---|
| 流量大了要扩容 | 手动再起容器、改 Nginx | 声明副本数,自动扩容 |
| 容器挂了 | 手动 docker restart | 自动拉起新容器 |
| 发版要停机 | down 再 up,有中断 | 滚动更新,逐批替换不中断 |
| 多台服务器管理 | 每台手动操作 | 集群统一调度 |
一句话:K8s = 容器编排系统,让机器集群像一台机器一样管理。
二、核心概念(面试必背)
┌────────────────────────────────┐
│ Node 服务器节点 │
│ ┌─────────┐ ┌─────────┐ │
│ │ Pod │ │ Pod │ │
│ │ 容器+容器 │ │ ... │ │
│ └─────────┘ └─────────┘ │
└────────────────────────────────┘| 概念 | 类比 | 说明 |
|---|---|---|
| Pod | 跑应用的"豆荚" | K8s 最小调度单位,可含 1~N 个容器 |
| Deployment | 应用的"声明" | 描述"我要 3 个副本"、"滚更新策略" |
| Service | 稳定的入口 | 给一组 Pod 提供固定访问地址,负载均衡 |
| Ingress | 路由/代理 | 按域名把请求分给对应 Service |
| ConfigMap / Secret | 配置文件 | 环境配置/密钥 |
| HPA | 自动扩容阀 | 按 CPU/内存自动增减副本 |
三、部署商城(Deployment + Service)
yaml
# k8s/server-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mall-server
spec:
replicas: 2 # 两个副本
selector:
matchLabels:
app: mall-server
template:
metadata:
labels: { app: mall-server }
spec:
containers:
- name: mall-server
image: ghcr.io/你的账号/mall-server:v1.0.0
ports: [{ containerPort: 8080 }]
env:
- name: SPRING_PROFILES_ACTIVE
value: "prod"
- name: SPRING_DATASOURCE_URL
value: "jdbc:mysql://mysql-service:3306/mall?serverTimezone=Asia/Shanghai"
- name: SPRING_DATASOURCE_PASSWORD
valueFrom: # 从 Secret 读密钥
secretKeyRef:
name: mall-secret
key: db-password
readinessProbe: # 就绪探针:就绪才接流量
httpGet:
path: /api/product/list
port: 8080
resources: # 资源限制
requests: { cpu: "100m", memory: "256Mi" }
limits: { cpu: "500m", memory: "512Mi" }
---
apiVersion: v1
kind: Service
metadata:
name: mall-server
spec:
selector: { app: mall-server }
ports:
- port: 8080
targetPort: 8080四、滚动更新与回滚
滚动更新:kubectl set image 或更新镜像 tag,Deployment 逐批替换副本,期间服务不中断:
bash
kubectl apply -f k8s/server-deployment.yaml
kubectl rollout status deployment/mall-server回滚:出问题一条命令回上一个版本:
bash
kubectl rollout undo deployment/mall-server五、自动扩容(HPA)
按 CPU 超过 50% 自动把副本从 1 扩到 5:
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: mall-server-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: mall-server
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target: { type: Utilization, averageUtilization: 50 }bash
kubectl apply -f k8s/hpa.yaml
kubectl get hpa # 看当前副本数与目标六、Ingress:域名入口
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mall-ingress
spec:
rules:
- host: mall.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service: { name: mall-server, port: { number: 8080 } }
- path: /
pathType: Prefix
backend:
service: { name: mall-web, port: { number: 80 } }证书自动管理(cert-manager)或通过云厂商 Ingress 控制器(阿里云/腾讯云的域名证书)配置 HTTPS。
七、部署方式汇总对比
| Docker(已掌握) | docker-compose | K8s | |
|---|---|---|---|
| 适用规模 | 单容器 | 单机多容器 | 多机集群 |
| 自动扩容 | ✗ | ✗ | ✓ |
| 故障自愈 | ✗ | ✗ | ✓ |
| 滚动发布 | ✗ | 手动 | ✓ |
| 学习成本 | 低 | 低 | 高 |
面试定调:"单机用 Docker Compose,多机/高可用用 K8s。我们教学项目用 Compose 足够,我理解 K8s 的核心概念和配置文件。"——诚实且有分寸。
八、如何实际入门(学习路径)
- 本地装 minikube(Mac/Windows 一键起单节点集群)。
kubectl apply -f上手 Deployment/Service/Ingress。- 玩熟
kubectl get/describe/logs/exec。 - 配合云厂商托管 K8s(阿里云 ACK / 腾讯云 TKE)看生产形态。
bash
# minikube 起步
minikube start
kubectl apply -f k8s/server-deployment.yaml
kubectl get pods
kubectl logs deployment/mall-server九、本章验收
- [ ] 能背出 Pod / Deployment / Service / Ingress 各自职责
- [ ] 能写一个最小 Deployment 文件
- [ ] 用 minikube 把商城后端跑起来并通过 Service 访问
- [ ] 能说清"为什么单机项目用不上 K8s"
进阶方向(了解名词即可)
Helm(K8s 的包管理)、StatefulSet(MySQL/Pod 专属)、Service Mesh(Istio)、Operator。面试提一句"我在了解 Helm 和 StatefulSet"就够。