部署、扩缩与监控有状态应用

Kubernetes 入门

Frank Heilmann

Platform Architect and Freelance Instructor

无状态应用回顾

  • 简要回顾:无状态应用在 Kubernetes 中对应 "Deployment"
  • 适用于每个 Pod 执行完全相同任务的场景
  • 有状态应用需要彼此关联的一组 Pod,但可处理不同任务和数据
  • 之前关于 Deployment 的许多概念,同样适用于 StatefulSet
Kubernetes 入门

有状态应用

  • 有状态应用:

    • 基本概念
    • 与 Kubernetes 高度契合
    • 会保存状态
  • 被中断或停止时,新副本(Pod)可读取已保存的状态并继续运行

  • 示例:
    • 一个数据库后端(如 PostgreSQL)通过 3 个 Pod 向前端提供数据
    • 每次通过任一 Pod 更新数据,都需要持久化
    • 当某个 Pod 终止时,新建的 Pod 需接续已保存的状态
Kubernetes 入门

Kubernetes StatefulSet

  • 有状态应用对应 "Kubernetes StatefulSet"
  • 示例清单包含与以下相同的部分:
    • apiVersionkindmetadataspectemplate
  • replicas 定义 StatefulSet 中 Pod 的数量
  • selector 稍后介绍
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: <deployment name>
  labels:
    app: <a label for the application>
spec:
  replicas: <number of initial replicas>
  selector:
    matchLabels:
      app: <matches the label above>
  template:
    metadata:
      labels:
        app: <label to be given to each pod>
    spec:
      containers:
      - name: <container name>
        image: <the image to be used>
        ports:
        - containerPort: <ports for networking>
Kubernetes 入门

在 Kubernetes 集群中部署

  • 部署 StatefulSetDeployment 类似: kubectl apply -f <manifest.yml>
  • 但创建过程不同:
    • Pod 按顺序逐个创建,而非同时创建
    • Pod 具有可预测的名称,如 pod-0pod-1pod-2
  • 这意味着:与 Deployment 的 Pod 不同,StatefulSet 的 Pod 具有身份与状态
  • 因此,同一 StatefulSet 中不同身份的 Pod 可在应用中承担不同角色
Kubernetes 入门

扩缩 StatefulSet

  • 与 Deployment 类似,StatefulSet 可扩容或缩容:
    • 修改清单中的 replicas 并重新应用
    • 或使用命令 kubectl scale statefulsets ...
  • 扩容时,新 Pod 将依次创建:
    • 例如,先有 pod-0pod-1pod-2,再添加 pod-3, 然后是 pod-4
  • 缩容时,最后创建的 Pod 将先被删除:
    • 例如,先删 pod-4,再删 pod-3
Kubernetes 入门

监控 StatefulSet

  • 与 Deployment 一样,监控可应对宕机、流量峰值或存储不足等问题
  • 这里用 kubectl 执行基本监控任务
  • 常用命令:与 Deployment 相同
  • 示例 1:kubectl get pods 返回 StatefulSet 中所有 Pod 及其状态
  • 示例 2:kubectl get services 返回 StatefulSet 可能使用的所有 Service
Kubernetes 入门

Passons à la pratique !

Kubernetes 入门

Preparing Video For Download...