共计 3604 个字符,预计需要花费 10 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 Kubernetes 服务中 StatefulSets 有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
StatefulSets 在 v1.5 时还是个 beta 特性,它取代了 v1.4 的 PetSets 特性。PetSets 的用户可以参考 v1.5 的升级指导,将正在运行的 PeetSets 升级到 StatefulSets。
StatefulSet 是一个给 Pod 提供唯一标志的控制器,它可以保证部署和扩展的顺序。
使用 StatefulSet
当应用有以下任意要求时,StatefulSet 的价值就体现出来了。
● 稳定的、唯一的网络标识。
● 稳定的、持久化的存储。
● 有序的、优雅的部署和扩展。
● 有序的、优雅的删除和停止。
上面提到的点中,在 Pod 调度时,稳定性和持久化是同一个意思。如果一个应用不需要任何稳定的标识或顺序的部署、删除和扩展,那么你应该使用提供无状态备份的控制器来部署你的应用。诸如 Deployment 或者 ReplicaSet 可能更适合你的无状态服务需求。
限制
● StatefulSet 还是 beta 版本,Kubernetes v1.5 之前不可用。
● 和所有的 alpha/beta 资源一样,可以将 –runtime-config 选项传递给 apiserver,来禁止 StatefulSet。
● 给定 Pod 的存储必须是:基于请求存储等级(Storage Class)的 PersistentVolume Provisioner,或者是由管理员预先配置。
● 删除和(或)减少 StatefulSet 副本,不会删除 StatefulSet 相关的卷。这样做是为了保证数据安全,比自动的清除 StatefulSet 相关资源更有价值。● 当前 StatefulSet 需要 Headless 服务来负责 Pod 的网络一致性。你需要创建该服务。
● 当前,更新已经存在的 StatefulSet 需要手动执行。
组件
下面的示例演示了 StatefulSet 的组件。
● 一个 Headless 服务,名为 nginx,用来控制网络域。
● StatefulSet,名为 web,在同一个 Pod 中起 3 个 nginx 容器的副本。
● volumeClaimTemplates 使用 PV 供应商的 PV 来提供稳定的存储。
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: gcr.io/google_containers/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.beta.kubernetes.io/storage-class: anything
spec:
accessModes: [ ReadWriteOnce ]
resources:
requests:
storage: 1Gi
Pod 一致性
StatefulSet Pod 有着唯一的一致性,该一致性包含次序(启动和停止次序)、稳定的网络一致性,和稳定的网络。该一致性和 Pod 紧密相关,无论 Pod 被调度到哪个 node 节点上。
次序索引
对于有 N 个副本的 StatefulSet,StatefulSet 的每个 Pod 都被分配了一个数字序号,序号在 [0,N) 的范围内,并且在 Set 中是唯一的。
稳定的网络 ID
StatefulSet 中每个 Pod 都从 StatefulSet 的名称和 Pod 的序号派生其主机名。组成的 hostname 的模式为 $(statefulset 名称)-$(序号)。上面的例子会创建名为 web-0,web-1,web-2。StatefulSet 可以以使用 Headless 服务来控制 Pod 的域,这个域使用的格式为:$(service name).$(namespace).svc.cluster.local,其中,“cluster.local”指的是集群域。Pod 被创建后,每个 Pod 都会得到一个匹配的 DNS 子域,格式为 $(podname).$(governing service domain),其中的“governing service”是在 StatefulSet 中通过 serviceName 字段来定义的。
这里有几个示例,可以展示 StatefulSet 的 Pod 的 DNS 组成。
Cluster DomainService (ns/name)StatefulSet (ns/name)StatefulSet DomainPod DNSPod Hostnamecluster.localdefault/nginxdefault/webnginx.default.svc.cluster.localweb-{0..N-1}.nginx.default.svc.cluster.localweb-{0..N-1}cluster.localfoo/nginxfoo/webnginx.foo.svc.cluster.localweb-{0..N-1}.nginx.foo.svc.cluster.localweb-{0..N-1}kube.localfoo/nginxfoo/webnginx.foo.svc.kube.localweb-{0..N-1}.nginx.foo.svc.kube.localweb-{0..N-1} 注意:除非另外的配置,集群域就会被设置为 cluster.local。
稳定的存储
Kubernetes 为每个 VolumeClaimTemplate 创建一个 PV。在上面的 nginx 例子中,每个 Pod 会得到一个 PV,该 PV 的存储等级 (storagee class) 为 anything,大小为 1Gb。当 Pod 被调度到其他 node 节点上时,volumeMounts 会重新映射对应的 PVC。注意,当 Pod 或者 StatefulSet 被删除时,对应的 PV 和 PVC 不会被删除,这个删除操作必须手动来执行。
部署和扩展
● 对于拥有 N 个拷贝的 StatefulSet,当部署 Pod 时,它们会被顺序地创建(从 0 到 N -1)。
● 当 Pod 被删除时,它们被终止的顺序是从 N - 1 到 0。
● 当对 Pod 执行扩展操作时,它前面的 Pod 必须都处于 Running 和 Ready 状态。
● 当 Pod 被终止时,它所有的 successors 都必须被完全地关闭。
不应该将 StatefulSet 的 pod.Spec.TerminationGracePeriodSeconds 值设置为 0,因为该操作不安全,强烈不建议使用。若需要更深层次的解释,请参考强制删除 StatefulSet Pod。
当创建了上面的 nginx 示例后,会按顺序部署三个 Pod,名字依次为 web-0、web- 1 和 web-2。web–1 在 web- 0 变为 Running and Ready 之后才会再部署,同理,web- 2 也会等 web- 1 变为 Running and Ready 状态后才部署。如果在 web- 1 变为 Running and Ready 之后,但 web- 2 还没有启动之前,此时 web- 0 运行失败了,那么直到 web- 0 再次成功启动并变为 Running and Ready 之前,web- 2 都不会启动。
如果用户希望改变上面例子中 Pod 的个数,比如修改 replicas=1,那么 web- 2 首先被终止。直到 web- 2 完全被关闭和删除后,web- 1 才会被终止。如果在 web- 2 被终止和完全关闭后,但 web- 1 还没有被终止之前,此时 web- 0 运行出错了,那么直到 web- 0 再次变为 Running and Ready 状态之后,web- 1 才会被终止。
以上是“Kubernetes 服务中 StatefulSets 有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!