i007.cc

i007.cc

优先队列-降维打击

05.价值资料

可以直接执行的操作手册

好,那第一周从 Day 1 开始,我来给你一个可以直接执行的操作手册。


第一周:K8s 从零实操

Day 1:环境搭建,跑通第一个服务

bash
# 第一步:安装工具(Mac)
brew install minikube kubectl

# Windows 用户用这个
# choco install minikube kubernetes-cli

# 第二步:启动本地 K8s 集群
minikube start --cpus=2 --memory=4096

# 验证成功
kubectl get nodes
# 看到这个就对了:
# NAME       STATUS   ROLES           AGE   VERSION
# minikube   Ready    control-plane   1m    v1.28.0

# 第三步:部署你的第一个服务(用现成的 nginx 练手)
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

# 访问它
minikube service nginx --url
# 浏览器打开输出的地址,看到 nginx 欢迎页就成功了

# 第四步:看看刚才发生了什么
kubectl get deployments
kubectl get pods
kubectl get services

 

今天目标:看到 nginx 页面,建立信心。


Day 2-3:部署自己的服务

先写一个最简单的 Python 服务:

python
# app.py
from fastapi import FastAPI
app = FastAPI()

@app.get("/health")
def health():
    return {"status": "ok", "service": "fleet-api"}

@app.get("/vehicles/{vid}")
def get_vehicle(vid: str):
    return {"id": vid, "battery": 85, "online": True}

 

dockerfile
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
RUN pip install fastapi uvicorn
COPY app.py .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8080"]

 

bash
# 用 minikube 自带的 Docker(关键!不然镜像找不到)
eval $(minikube docker-env)
docker build -t fleet-api:v1 .

 

然后写 K8s 配置文件:

yaml
# fleet.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fleet-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: fleet-api
  template:
    metadata:
      labels:
        app: fleet-api
    spec:
      containers:
      - name: fleet-api
        image: fleet-api:v1
        imagePullPolicy: Never      # 用本地镜像
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "200m"
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
  name: fleet-api
spec:
  selector:
    app: fleet-api
  ports:
  - port: 80
    targetPort: 8080
  type: NodePort

 

bash
kubectl apply -f fleet.yaml
kubectl get pods                    # 等 STATUS 变成 Running
minikube service fleet-api --url    # 访问你自己的服务
curl <url>/health
curl <url>/vehicles/v001

 

Day 2 目标:自己的服务跑在 K8s 上
Day 3:加上 ConfigMap 和 Secret:

yaml
# config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: fleet-config
data:
  LOG_LEVEL: "INFO"
  MAX_VEHICLES: "1000"
---
apiVersion: v1
kind: Secret
metadata:
  name: fleet-secret
type: Opaque
stringData:
  DB_PASSWORD: "my-secret-password"

 

yaml
# 在 Deployment 的 containers 里加上:
        env:
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: fleet-config
              key: LOG_LEVEL
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: fleet-secret
              key: DB_PASSWORD

 


Day 4-5:故障排查演练

这是面试最爱考的,每个故障练一遍,建立肌肉记忆:

bash
# 故障一:ImagePullBackOff
# 制造故障
kubectl set image deployment/fleet-api fleet-api=fleet-api:v999
kubectl get pods    # 看到 ImagePullBackOff

# 排查
kubectl describe pod <pod-name>
# 看 Events 段,会看到:
# Failed to pull image "fleet-api:v999": not found

# 恢复
kubectl set image deployment/fleet-api fleet-api=fleet-api:v1

# 故障二:OOMKilled
# 把内存限制改得极小
kubectl set resources deployment/fleet-api \
  --limits=memory=1Mi
kubectl get pods    # 看到 OOMKilled 或 CrashLoopBackOff

# 排查
kubectl describe pod <pod-name>
# 看到:Last State: Terminated, Reason: OOMKilled

# 恢复
kubectl set resources deployment/fleet-api \
  --limits=memory=128Mi

# 故障三:服务不通
# 把 Service 的 selector 改错
kubectl edit service fleet-api
# 把 app: fleet-api 改成 app: wrong-label
kubectl get endpoints fleet-api
# 看到 ENDPOINTS 是 <none>,说明没有 Pod 匹配

# 故障四:手动删 Pod,验证自愈
kubectl delete pod <pod-name>
kubectl get pods -w    # 看到新 Pod 立刻被创建

 


Day 6-7:滚动更新和 HPA

bash
# 滚动更新
# 修改 app.py,改个返回值,重新构建
eval $(minikube docker-env)
docker build -t fleet-api:v2 .

kubectl set image deployment/fleet-api fleet-api=fleet-api:v2
kubectl rollout status deployment/fleet-api  # 看更新过程
kubectl rollout history deployment/fleet-api # 看版本历史

# 出问题了,回滚
kubectl rollout undo deployment/fleet-api
kubectl rollout status deployment/fleet-api  # 确认回滚完成

# HPA 自动扩缩容
minikube addons enable metrics-server   # 先启用指标采集

kubectl autoscale deployment fleet-api \
  --min=2 --max=10 --cpu-percent=50

kubectl get hpa    # 查看 HPA 状态

 


第一周结束时你应该能做到

✅ 本地搭好 K8s 环境
✅ 把自己写的服务部署上去
✅ 用 ConfigMap/Secret 管理配置
✅ 看到 CrashLoopBackOff / OOMKilled 知道怎么排查
✅ 能做滚动更新和回滚
✅ 理解 HPA 自动扩缩容

面试里可以说:“我在本地搭过完整的 K8s 环境,部署过自己的服务,模拟过各种故障场景的排查和恢复。”


第一周搞定后,第二周 FastAPI + Terraform 按之前的计划走。

你现在机器是 Mac 还是 Windows?安装环节有什么问题随时来问。

发表回复