Skip to content

Kubernetes 进阶

单台服务器手动 docker 部署能跑,但扩容、故障恢复、滚动发布都要人肉。Kubernetes(K8s)把这些自动化。面试问到它,能讲清"它解决什么问题 + 核心概念"就够了。

一、K8s 解决什么问题

问题Docker 手动部署K8s
流量大了要扩容手动再起容器、改 Nginx声明副本数,自动扩容
容器挂了手动 docker restart自动拉起新容器
发版要停机downup,有中断滚动更新,逐批替换不中断
多台服务器管理每台手动操作集群统一调度

一句话: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-composeK8s
适用规模单容器单机多容器多机集群
自动扩容
故障自愈
滚动发布手动
学习成本

面试定调:"单机用 Docker Compose,多机/高可用用 K8s。我们教学项目用 Compose 足够,我理解 K8s 的核心概念和配置文件。"——诚实且有分寸。

八、如何实际入门(学习路径)

  1. 本地装 minikube(Mac/Windows 一键起单节点集群)。
  2. kubectl apply -f 上手 Deployment/Service/Ingress。
  3. 玩熟 kubectl get/describe/logs/exec
  4. 配合云厂商托管 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"就够。

基于 MIT 协议发布,可自由学习与修改