Skip to content

Kubernetes(K8s)

什么是 Kubernetes

Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它能让你以声明式方式管理大规模集群中的应用,保证高可用、负载均衡与自动恢复。

Kubernetes 的基本架构组件

  • etcd: 一个分布式键值存储,用于保存集群状态数据。
  • kube-apiserver: 集群的控制中心,所有组件通过 API 进行交互。
  • kube-scheduler: 根据资源需求与调度策略,将 Pod 分配到合适的节点上。
  • kube-controller-manager: 负责管理集群状态,运行各种控制器来保持预期状态。
  • kubelet: 每个节点上的代理,负责与 API Server 交互并管理本机容器。
  • kube-proxy: 处理网络代理和负载均衡,确保服务之间的通信畅通。

什么是 Pod

Pod 是 Kubernetes 中最小的部署单元,它封装了一个或多个紧密关联的容器,这些容器共享网络、存储和运行环境。Pod 内的容器通常协同工作,共享同一个 IP 地址和端口空间。

什么是 Deployment

Deployment 是一种用于声明式管理 Pod 副本集的资源对象。它的主要作用包括:

  • 自动化部署与更新: 支持滚动更新与回滚,确保无缝版本切换。
  • 扩缩容: 通过调整副本数量,满足业务负载需求。
  • 高可用性: 自动检测失败的 Pod 并进行重建,保持系统稳定。

解释 Pod 和 Deployment 的关系

  • Pod:最小调度单元(就像单个快递盒,里面可以装多个容器)
  • Deployment:管理 Pod 的副本和更新策略(像物流中心管理多个快递盒)
yaml
# 前端 Deployment 示例(管理 3 个 React Pod)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: react-app
        image: my-react:latest
        ports:
        - containerPort: 3000

记忆点:Pod = 单个盒子,Deployment = 盒子管理员

什么是 Service?它在 Kubernetes 中起什么作用

Service 是对外提供稳定访问接口的抽象层,用于解决 Pod IP 动态变化带来的问题。主要作用:

  • 服务发现: 为客户端提供固定的访问入口。
  • 负载均衡: 自动将流量分配到多个 Pod 上,保证请求均衡。
    常见类型有 ClusterIP(集群内访问)、NodePort(外部访问节点端口)、LoadBalancer(云环境中分配外部负载均衡器)等。

什么是 ConfigMap 和 Secret?

  • ConfigMap: 用于存储非敏感配置信息,如配置文件或环境变量。
  • Secret: 用于存储敏感数据(如密码、令牌),会进行 Base64 编码处理。
    两者都可以在 Pod 中挂载或以环境变量形式使用,但 Secret 针对安全性做了特殊设计,避免敏感信息明文暴露。

前端项目如何通过 ConfigMap 管理环境变量

  • 创建 ConfigMap
yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: frontend-config
data:
  API_ENDPOINT: "https://api.example.com"
  ENV: "production"
  • Pod 中使用
yaml
env:
  - name: REACT_APP_API_URL
    valueFrom:
      configMapKeyRef:
        name: frontend-config
        key: API_ENDPOINT

场景:不同环境(开发/生产)使用不同接口地址

如何实现 Kubernetes 的水平扩展(Scale)

可以通过两种方式实现:

  • 手动扩缩容: 修改 Deployment 中的 replicas 数量,调整 Pod 数量。
  • 自动扩缩容: 使用 Horizontal Pod Autoscaler (HPA),根据 CPU、内存或自定义指标自动增加或减少 Pod 数量,确保资源利用最优化。

什么是 StatefulSet?它与 Deployment 有何不同

StatefulSet 用于部署有状态应用,它能保证每个 Pod 拥有唯一标识、稳定的网络标识和有序部署与更新。与 Deployment 不同,StatefulSet 主要用于需要保持持久状态的数据服务,如数据库,而 Deployment 则适合无状态的应用。

如何实现 Kubernetes 的滚动更新与回滚

  • 滚动更新: 通过 Deployment 的更新策略,逐步替换旧版本 Pod 为新版本,确保在更新过程中服务不中断。
  • 回滚: 如果更新出现问题,可以使用 Kubernetes 提供的回滚命令(如 kubectl rollout undo deployment <deployment-name>)恢复到先前稳定的版本,保证系统快速恢复。

什么是 Ingress?它如何帮助管理外部访问

Ingress 是一种 API 对象,用于管理外部用户对集群内服务的访问。它通过配置路由规则、SSL 终止和负载均衡等功能,将外部请求转发到正确的 Service。使用 Ingress Controller(如 Nginx Ingress Controller)来实现具体流量的路由和管理,有效降低集群外部暴露的复杂度。

Ingress 在前端部署中的作用

  • 路由管理:根据域名/path 分发流量
  • SSL 终止:统一管理 HTTPS 证书
  • 灰度发布:按权重分流(金丝雀发布)
yaml
# 前端 Ingress 示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend-ingress
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80

记忆点:智能路由器 + SSL 证书管理器

如何实现前端滚动更新和回滚?

  • 滚动更新(默认策略):
bash
kubectl set image deployment/frontend react-app=my-react:v2
  • 查看状态
bash
kubectl rollout status deployment/frontend
  • 回滚操作
bash
kubectl rollout undo deployment/frontend

策略参数

yaml
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 25%        # 最多新增 Pod 数
    maxUnavailable: 25%  # 最大不可用比例

如何限制前端容器的资源使用

yaml
resources:
  requests:    # 最低保障
    memory: "256Mi"
    cpu: "100m"
  limits:      # 硬限制
    memory: "512Mi"
    cpu: "500m"

解释

  • 100m = 0.1 核 CPU
  • 内存超过 limit 会被 OOMKill
  • 前端建议:合理设置 limit 防止单页应用内存泄漏影响集群

如何通过 HPA 实现前端自动扩缩容?

yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: frontend-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: frontend
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60

场景:电商大促期间自动扩容前端实例

前端如何安全地管理敏感信息

  • 使用 Secret
bash
# 创建 Secret
kubectl create secret generic frontend-secret \
  --from-literal=API_KEY=supersecret123
  • 挂载使用
yaml
env:
- name: API_KEY
  valueFrom:
    secretKeyRef:
      name: frontend-secret
      key: API_KEY

安全实践

  • 加密存储(etcd 加密)
  • 最小权限访问
  • 定期轮换(前端对接的第三方密钥)

解释 PV 和 PVC 在前端的应用场景

  • PV (PersistentVolume):集群存储资源(如 NAS)
  • PVC (PersistentVolumeClaim):应用存储需求声明
yaml
# 前端日志收集场景示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: frontend-logs-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

使用场景

  • 前端 SSR 日志持久化
  • 文件上传临时存储

如何快速排查前端 Pod 故障?

bash
# 查看 Pod 状态
kubectl get pods -l app=frontend

# 查看日志
kubectl logs <pod-name> -f

# 进入容器调试
kubectl exec -it <pod-name> -- sh

# 查看事件记录
kubectl describe pod <pod-name>

常见问题

  • CrashLoopBackOff:容器启动失败(检查镜像/启动命令)
  • ImagePullBackOff:镜像拉取失败(检查镜像权限)
  • Pending:资源不足(检查 requests/limits)

记忆地图

K8s 核心概念四层结构:
POD → Deployment → Service → Ingress
(容器盒)  (副本管理)  (网络暴露) (智能路由)

前端重点关注:
1. 部署(Deployment)
2. 配置(ConfigMap/Secret)
3. 暴露(Service/Ingress)
4. 扩缩(HPA)
5. 安全(非 root 用户)

实战技巧

  1. 使用 kubectl apply -f 代替 create
  2. 给资源打标签:app: frontend
  3. 开发环境使用 minikubekind 本地测试
  4. 生产环境配合 CI/CD 实现自动发布(如 ArgoCD)

Released under the AGPL-3.0 License