kubernets之statefulset-创新互联

StatefulSet是控制器的一种,可以创建独特身份的POD。它提供有序的部署和伸缩。

目前成都创新互联已为1000多家的企业提供了网站建设、域名、虚拟空间、网站托管、服务器托管、企业网站设计、太平网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
  • 使用statefulset

  • 使用限制

  • 组成部分

  • pod身份识别

  • 保证部署和伸缩

使用statefulset

statefulset对以下应用是有价值的。

  • 稳定、唯一的网络访问地址

  • 稳定、持久的存储

  • 有序、优雅的部署和伸缩

  • 有序。优雅的删除和终止

上述描述中,稳定等同于在POD再次调度之后可以持久。如果应用不需要稳定的认证或有序的部署、删除、伸缩,你可以使用无状态的副本(例如Deployment或ReplicaSet)来部署你的应用,这将更适合无状态应用。

使用限制

  • Statefulset目前为bate版本,在1.5之前在任何发布版中都不可用

  • 类似所有alpha/beta资源,你可以通过apiserver参数--runtime-config禁用Statefulset

  • POD使用的持久化存储可以是基于storage class的动态卷,也可以是预先管理员分配的

  • 删除或缩减Statefulset不会删除分配的volumes。这是为了确保数据安全,数据比自动清除与statefulset关联的资源更重要

  • Statefulset当前需要一个Headless Service提供网络访问地址

  • 目前需要手动完成更新存在Statefulset

组成部分

  • 下面的示例描述Statefulset的组件。

  • 一个名为nginx的Headless Service,用于控制网络访问

  • 名为web的Statefulset,启动三个副本POD

  • volumeClaimTemplates将提供持久化存储

--- 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: webspec:     serviceName: "nginx"     replicas: 3     template:         metadata:               labels:                  app: nginx         spec:             terminationGracePeriodSeconds: 10             containers:             - name: nginx                p_w_picpath: 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被调度到哪个节点上。

1)序号索引

Statefulset有N个实例,每个POD将被分配一个唯一的整数序号,范围在[1,N]。

2)稳定的网络ID

StatefulSet的每个POD的名称是由StatefulSet的名称和Pod序号组成。POD名称的格式为$(statefulset name)-$(ordinal)。上述示例中创建的POD名称为web-0,web-1,web-2。statefulset使用Headless Service控制POD的域名。service域名的格式为$(service name).$(namespace).svc.cluster.local,cluster.local为cluster domain。每个POD创建后会有一个匹配的域名,格式为$(podname).$(service_domain)。下表为示例,描述cluster domain、service name和statefulset name如何相互作用。

Cluster Domain     Service (ns/name)       StatefulSet (ns/name)     StatefulSet Domain   Pod DNS   Pod Hostname

cluster.local   default/nginx   default/web   nginx.default.svc.cluster.local   web-{0..N-1}.nginx.default.svc.cluster.local   web-{0..N-1}

cluster.local   foo/nginx   foo/web   nginx.foo.svc.cluster.local   web-{0..N-1}.nginx.foo.svc.cluster.local   web-{0..N-1}

kube.local   foo/nginx   foo/web   nginx.foo.svc.kube.local   web-{0..N-1}.nginx.foo.svc.kube.local   web-{0..N-1}

3)稳定的存储

 kubernetes为每一个VolumeClaimTemplate创建一个PV。在上述nginx的示例中,每一个POD将获得一个大小为1G的PV。当POD被调度到一个节点上的时候,volumeMounts将通过与之绑定的PVC挂载PV。

说明:与PVC绑定的PV不会因POD或statefulset删除而删除,需要手动执行删除。

保证部署和伸缩

  • 对于statefulset的N个副本,当POD被部署,它们将是有序的,[0..N-1]

  • 当POD被删除,它们将按反向的顺序终止,先终止N-1的POD

  • 在伸缩操作应用到POD之前,必须保证之前所有POD的状态是running且ready。

  • 在POD被终止之前,所有当前序号之后的POD必须完全关闭

StatefulSet不应该指定pod.Spec.TerminationGracePeriodSeconds为0。这种做法是不安全的,强烈劝阻。为进一步解释,请参阅强制删除StatefulSet POD。

上面的nginx例子创建后,三个POD将按web-0 web-1 web-2顺序部署。web-1不会在web-0 running并ready之前部署,web-2直到web-1处于running并ready状态后才会开始部署。web-1 running且ready之后,但web-2还未启动,此时如果web-0故障,web-2将不会被启动,直到web-0成功被重启并达到running且ready的状态。

如果一个用户修改已部署的statefulset,例如replicas=1,web-2会先被终止。web-1将不会终止,直到web-2完全关闭和删除。web-2已经终止并完全关闭,但在web-1终止前,此时如果web-0故障,web-1将不会被终止,直到web-0处于running且ready的状态。


另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前标题:kubernets之statefulset-创新互联
文章起源:http://ybzwz.com/article/ddcjcd.html