IT 铁人赛 k8s 入门30天 -- day13 Deploying Stateful Apps with StatefulSet

前言

今天主要会介绍 StatefulSet 以及比较其与 Deployment 的不同

StatefulSet

StatefulSet 是 k8s 丛集用来处理有状态的应用布署, 所谓 Stateful applications

举例来说: 资料库(MySql, mongoDB), ElasticSearch

这些应用都需要前面章节讲到的 PersistentVolume 纪录应用的状态,当应用因为问题而重新启动时, 需要透过储存在 PersistentVolume 的资料来回复状态

无状态应用则不需要纪录应用的状态, 每个对应用发出的请求都与状态无关

因为有状态的应用与无状态的应用有所不同, k8s 丛集也使用不同元件来做布署

无状态的应用布署 k8s 丛集使用 Deployment 元件

用来复制布署过无状态的 Pod

有状态的应用布署 k8s 丛集使用 StatefulSet 元件

也可以用来复制布署过的 Pod

StatefulSet vs Deployment

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 在後面即可

Best Practice for StatefulSet

如前述, 因为 StatefulSet 会需要存储应用状态

因此最好的方式是设定 PersistentVolume 给 StatefulSet

让 StatefulSet 可以把状态相关则资讯存储再 PersistentVolume 确保状态不会因为 Pod 或 k8s 丛集不稳定而遗失状态

而最好的 Storage 方式建议是使用 Remote Storage

因为 Local Storage 基本上会绑定在某一个结点, Pod 如果不是再同一个结点则无法存取的到

Pod Identity

参考自官网StatefulSet说明

对於 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 时, 也是会从後面的序号往前删除以维持资料状态的正确性

StatefulSet 的 Pod endpoints

第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)

>>:  第10-1章:监控与管理作业系统上之程序(一)

[Day25] swift & kotlin 游戏篇!(7) 小鸡BB-游戏制作-API与游戏动画

游戏示意 swift - 游戏功能 接下来当我们点击按钮 我们来打个API 并告知道有没有猜对 来看...

[Day05] 第五章- 初探金流API文件-4(IV,加密msg透过nodejs实作)

前言 我朋友认为可以文章可以再补齐一点教学 还有postman的使用方法 目标 今天目标是 post...

[Day21] Esp32用STA mode + AHT10

1.前言 前两天看完AHT10 + APmode 那篇後,是不是对这篇抱有更大的期待与兴趣了,因为S...

日记20

广告练习ad After before Position Absolute Relative Fix...

[Day 21] 2D批次渲染 (三) - Bug!一堆Bug

今日目标 继续完成批次渲染 结果... 今天抓到一堆bug,但是还是没debug完,被我弄丢的小方块...