10.3.1 创建应用和容器镜像

Web Server:

  • POST: 接收数据并写入文件
  • GET: 返回主机名和数据

10.3.2 通过 Statefulset 部署应用

需要创建的对象:

  • 持久卷
    • 持久卷的动态供应
    • 手动创建 (不支持动态时使用该方法)
  • Service
  • Statefulset

创建持久化存储卷

手动创建.

image.png

List 对象是在同一 yaml 文件中定义多个资源对象的另一种方法.

手动创建持久卷可以参考第6章.

创建控制 Service

headless Service:

  • 用于在有状态的 pod 之间提供网络标识 (pod 之间可以彼此发现)

image.png

创建 Statefulset 详单

image.png
image.png

Statefulset 创建指定 pod 时, 会自动添加 PersistentVolumeClaim 到 pod 详述中, 然后将这个卷关联到一个声明上.

这里再放一下直接使用持久卷声明的例子:

image.png

不太清楚持久卷声明模板创建的持久卷声明是如何与持久卷进行关联的. 这里提到 k8s 将它们进行关联.

创建 Statefulset

  1. $ kubectl create -f kubia-statefulset.yaml

列出 pod:

$ kubectl get po

Statefulset 是顺序创建 pod 的, 不是同时启动所有 pod.

  • 原因是有状态的 pod 可能会产生竞态条件

检查生成的有状态 pod

image.png

与代码清单6.12类似.

检查生成的持久卷声明

image.png

10.3.3 使用你的 pod

通过 API 服务器与 pod 通信

API 服务器与 pod 通信过程繁琐 (需授权令牌), 所以使用 proxy 来与 API 服务器通信:

  • proxy -> API -> pod

启动代理:

image.png

访问 pod:

image.png

image.png

发送 POST 请求:

image.png

再次访问 pod:

image.png

删除一个有状态的 pod 来检查重新调度的 pod 是否关联了相同的存储

删除:

image.png

列出 pod 状态:

image.png
image.png

image.png

好奇 ip 是怎么保留的.

验证 是否保留了数据:

image.png

扩缩容 Statefulset

  • 缩容和删除的表现是没有区别的
  • 会删除拥有最高索引值的 pod

通过一个普通的非 headless 的 Service 暴露 Statefulset 的 pod

客户端通常不会直接连接 pod.

  • ClusterIP Service

image.png

通过 API 服务器访问集群内部的服务

image.png

image.png