今天主要会介绍 StatefulSet 以及比较其与 Deployment 的不同
StatefulSet 是 k8s 丛集用来处理有状态的应用布署, 所谓 Stateful applications
举例来说: 资料库(MySql, mongoDB), ElasticSearch
这些应用都需要前面章节讲到的 PersistentVolume 纪录应用的状态,当应用因为问题而重新启动时, 需要透过储存在 PersistentVolume 的资料来回复状态
无状态应用则不需要纪录应用的状态, 每个对应用发出的请求都与状态无关
因为有状态的应用与无状态的应用有所不同, k8s 丛集也使用不同元件来做布署
无状态的应用布署 k8s 丛集使用 Deployment 元件
用来复制布署过无状态的 Pod
有状态的应用布署 k8s 丛集使用 StatefulSet 元件
也可以用来复制布署过的 Pod
Deployment 所产生出来的 Pod, Pod Id 是随机杂骤
当做 scale up 时, 每个 Pod 的 Pod Id 无顺序性可以随意掉换取代
StatefulSet 所产生出来的 Pod, Pod Id 具有一定顺序性
当做了 scale up 时, 每个 Pod 的 Pod Id 具有一定顺序性, 无法任意掉换顺序
举例来说:
假设有一个 mysql Pod 使用 StatefulSet 做 scale up
为了维持资料一致性
只会允许第一个 Pod 挂载的 Storage 可以做写入
而第二个 Pod 挂载的 Storage 则慧跟第一个 Pod 的 Storage 做同步, 并且只能读取
因为两个 Pod Storage 可以同时写入会造成资料不一致
除此之外, 每个 mysql Pod 读取的 Storage 也不是相同的
假设另外有一个 my-app-java Pod 使用 Deployment 做 scale up 由於每个 Pod 都是相同且可以替换
所以只要用一个 Service 来做负载平衡然後挂载多个 my-app 的 Pod 在後面即可
如前述, 因为 StatefulSet 会需要存储应用状态
因此最好的方式是设定 PersistentVolume 给 StatefulSet
让 StatefulSet 可以把状态相关则资讯存储再 PersistentVolume 确保状态不会因为 Pod 或 k8s 丛集不稳定而遗失状态
而最好的 Storage 方式建议是使用 Remote Storage
因为 Local Storage 基本上会绑定在某一个结点, Pod 如果不是再同一个结点则无法存取的到
对於 Deployment, Pod Identity 是采用 random hash
对於 StatefulSet, Pod Identity 则是有一组固定顺序的名称由以下模式组成
${statefulset name}-${ordinal}
ordinal 是由 0 开始递增的数列
假设用建立名为 mysql 的 StatefulSet, replicas 设定为 3
则产生出来的 Pod 名称则依序为 mysql-0, mysql-1, mysql-2
而第一个是 Master DB 可做读写, 其他则是 Slave DB 只能做读取
重要的是, StatefulSet 的 replica 会依序建立 Pod
也就是当 mysql-0 还没建立好, mysql-1 不会开始建立
相对的, 当删除 Pod 时, 也是会从後面的序号往前删除以维持资料状态的正确性
第1种, 当使用 Service 挂载 Pod 时使用 loadbalancer service
把所有 Pod 挂载到这个 loadbalancer service
Pod 的 endpoint 就是 loadbalancer service name
第2种, 当使用 Service 挂载 Pod 时使用个别挂载
每个 Pod 的 endpoint 就是以下这个模式
${Pod Name}.${governing Service domain}
1 StatefulSet 的 Pod 名称是可预测的
2 每个 Pod 的 DNS 名称是固定的
每次当 Pod 重起
IP 会改变, 但是名称跟 endpoints 不变
当对於有状态的应用做 Replicas 时
虽然 k8s 丛集有支援
但是仍然需要处理很多事情如下:
. 设定资料复制跟资料同步的机制
. 设定远端存储
. 建立管理备份机制
<<: [Day25] 在 Codecademy 学 React ~ 终於来到 Hook 的世界 ‧ useState 篇 (2)
游戏示意 swift - 游戏功能 接下来当我们点击按钮 我们来打个API 并告知道有没有猜对 来看...
前言 我朋友认为可以文章可以再补齐一点教学 还有postman的使用方法 目标 今天目标是 post...
1.前言 前两天看完AHT10 + APmode 那篇後,是不是对这篇抱有更大的期待与兴趣了,因为S...
广告练习ad After before Position Absolute Relative Fix...
今日目标 继续完成批次渲染 结果... 今天抓到一堆bug,但是还是没debug完,被我弄丢的小方块...