云原生|kubernetes| StateFulSets控制器详解(一)

简介: 云原生|kubernetes| StateFulSets控制器详解

前言:


kubernetes有很多的控制器,比如 replicasets(简称rs),replicationcontrollers(简称rc),Deployment(简称deploy),DaemonSets(简称ds),StateFulSets(简称sts),那么,rs,rc是基本的pod控制器,这个就不说了,底层控制器,和deploy深度绑定。deploy和ds相对其它的控制器来说就非常常用了,基本的部署工作都是由这两个控制器完成,而sts由于它的自身特点导致它的使用范围不是特别的宽,但也是一个极为重要的控制器,需要我们能够熟练使用此控制器。

StateFulSets的基本概念:


StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储。

在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service,headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。

除此之外,StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名,这个域名的格式为:

FQDN:$(podname).(headless server name).namespace.svc.cluster.local

StateFulSets的构成方式


pod部署清单,部署方式指定为StateFulSets;

Headless Service:用来定义Pod网络标识( DNS domain);(这个无头service的作用是可以体现StateFulSet控制器的稳定的网络特性,不是非必须的,可用可不用)

volumeClaimTemplates :存储卷申请模板,创建PVC,指定pvc名称大小,将自动创建pvc,且pvc必须由存储类供应(这个是体现StateFulSet控制器的稳定的存储特性,不是非必须的,可用可不用)

StateFulSets的特点:


Pod一致性:包含次序(启动、停止次序)、网络一致性。此一致性与Pod相关,与被调度到哪个node节点无关;

稳定的次序:对于N个副本的StatefulSet,每个Pod都在[0,N)的范围内分配一个数字序号,且是唯一的;

稳定的网络:Pod的hostname模式为( s t a t e f u l s e t 名 称 ) − (statefulset名称)-(statefulset名称)−(序号);

稳定的存储:通过VolumeClaimTemplate为每个Pod创建一个PV。删除、减少副本,不会删除相关的卷。

OK,以上是StateFulSets的基本介绍,下面就由两个部署实例来说明如何使用StateFulSets控制器并说明它的具体特点。

在正式的使用StateFulSets方式部署之前,建议先部署一个nfs-client-provisioner插件,使得集群内部能够动态的分配pv,nfs-client-provisioner插件部署见我的博客:

kubernetes学习之持久化存储StorageClass(4)_晚风_END的博客-CSDN博客

一,StateFulSets方式部署nginx


首先,确认我的nfs插件已经安装好了,也就是动态存储插件可用了:

StorageClass的名称是managed-nfs-storage

[root@k8s-master nfs]# k get sc
NAME                            PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage (default)   fuseim.pri/ifs   Delete          Immediate           true                   6h9m

部署使用StateFulSet控制器的nginx的清单文件:

cat << EOF > nginx-sts.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: web
spec:
  selector:
    matchLabels:
      app: nginx #必须匹配 .spec.template.metadata.labels
  serviceName: "nginx"  #声明它属于哪个Headless Service.
  replicas: 3 #副本数
  template:
    metadata:
      labels:
        app: nginx # 必须配置 .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx:1.20
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: nginx-pvc
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:   #可看作pvc的模板
  - metadata:
      name: nginx-pvc
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "managed-nfs-storage"  #存储类名,改为集群中已存在的
      resources:
        requests:
          storage: 1Gi
EOF

无头service:

cat << EOF > nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: web
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
EOF

查看pod的情况(注意,这些pod的名称是web+递增的数字组成的,如果扩容名称按顺序增加,那么一个稳定的pod名称的意义在于集群内的DNS将会有一个稳定的解析,pod无论怎么改变):

[root@k8s-master nfs-sc]# k get po -n web -owide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          6s    10.244.0.7   k8s-master   <none>           <none>
web-1   1/1     Running   0          5s    10.244.2.9   k8s-node2    <none>           <none>
web-2   1/1     Running   0          3s    10.244.1.7   k8s-node1    <none>           <none>

查看pv和pvc的情况:

[root@k8s-master nfs-sc]# k get pv,pvc -n web
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS          REASON   AGE
persistentvolume/pvc-a7b73ac0-d881-4c96-9fdb-e8d71f60d848   1Gi        RWO            Delete           Bound    web/nginx-pvc-web-1   managed-nfs-storage            40m
persistentvolume/pvc-dabd8050-77f6-4655-8434-dac2f9a077eb   1Gi        RWO            Delete           Bound    web/nginx-pvc-web-2   managed-nfs-storage            40m
persistentvolume/pvc-eb159490-353c-4aea-9412-10056a29911d   1Gi        RWO            Delete           Bound    web/nginx-pvc-web-0   managed-nfs-storage            40m
NAME                                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
persistentvolumeclaim/nginx-pvc-web-0   Bound    pvc-eb159490-353c-4aea-9412-10056a29911d   1Gi        RWO            managed-nfs-storage   40m
persistentvolumeclaim/nginx-pvc-web-1   Bound    pvc-a7b73ac0-d881-4c96-9fdb-e8d71f60d848   1Gi        RWO            managed-nfs-storage   40m
persistentvolumeclaim/nginx-pvc-web-2   Bound    pvc-dabd8050-77f6-4655-8434-dac2f9a077eb   1Gi        RWO            managed-nfs-storage   40m

查看service的情况:

[root@k8s-master nfs-sc]# k get svc -n web
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   None         <none>        80/TCP    42m

此时,进入nfs的存储目录可以看到有三个文件夹,以pod名称开始:

[root@k8s-master nfs-sc]# ls web-nginx-pvc-web-*
web-nginx-pvc-web-0-pvc-eb159490-353c-4aea-9412-10056a29911d:
web-nginx-pvc-web-1-pvc-a7b73ac0-d881-4c96-9fdb-e8d71f60d848:
web-nginx-pvc-web-2-pvc-dabd8050-77f6-4655-8434-dac2f9a077eb

在每个目录下建立nginx的首页测试文件:

[root@k8s-master nfs-sc]# echo "wo shi web-0" >web-nginx-pvc-web-0-pvc-eb159490-353c-4aea-9412-10056a29911d/index.html 
[root@k8s-master nfs-sc]# echo "wo shi web-1" >web-nginx-pvc-web-1-pvc-a7b73ac0-d881-4c96-9fdb-e8d71f60d848/index.html 
[root@k8s-master nfs-sc]# echo "wo shi web-2" >web-nginx-pvc-web-2-pvc-dabd8050-77f6-4655-8434-dac2f9a077eb/index.html 

查看pod的IP:

[root@k8s-master nfs-sc]# k get po -n web -owide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          34m   10.244.1.6   k8s-node1    <none>           <none>
web-1   1/1     Running   0          34m   10.244.2.8   k8s-node2    <none>           <none>
web-2   1/1     Running   0          34m   10.244.0.6   k8s-master   <none>           <none>


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
5天前
|
运维 Kubernetes Cloud Native
构建高效云原生运维体系:Kubernetes最佳实践
【5月更文挑战第9天】 在动态和快速演变的云计算环境中,高效的运维是确保应用稳定性与性能的关键。本文将深入探讨在Kubernetes环境下,如何通过一系列最佳实践来构建一个高效且响应灵敏的云原生运维体系。文章不仅涵盖了容器化技术的选择与优化、自动化部署、持续集成/持续交付(CI/CD)流程的整合,还讨论了监控、日志管理以及灾难恢复策略的重要性。这些实践旨在帮助运维团队有效应对微服务架构下的复杂性,确保系统可靠性及业务的连续性。
|
22小时前
|
存储 弹性计算 Kubernetes
【阿里云云原生专栏】深入解析阿里云Kubernetes服务ACK:企业级容器编排实战
【5月更文挑战第20天】阿里云ACK是高性能的Kubernetes服务,基于开源Kubernetes并融合VPC、SLB等云资源。它提供强大的集群管理、无缝兼容Kubernetes API、弹性伸缩、安全隔离及监控日志功能。用户可通过控制台或kubectl轻松创建和部署应用,如Nginx。此外,ACK支持自动扩缩容、服务发现、负载均衡和持久化存储。多重安全保障和集成监控使其成为企业云原生环境的理想选择。
98 3
|
5天前
|
Kubernetes Cloud Native 持续交付
构建高效稳定的云原生应用:容器编排与微服务治理实践
【5月更文挑战第14天】 随着企业数字化转型的深入,云原生技术以其弹性、敏捷和可扩展的特性成为现代应用开发的首选模式。本文将探讨如何通过容器编排工具如Kubernetes以及微服务架构的有效治理,构建和维护高效且稳定的云原生应用。我们将分析容器化技术的优势,并结合案例讨论在多云环境下实现持续集成、持续部署(CI/CD)的最佳实践,同时解决微服务带来的分布式复杂性问题。通过本文的阐述,读者将获得一套提升系统可靠性和业务连续性的策略框架。
7 0
|
5天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
5天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
33 1
|
5天前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
1天前
|
运维 监控 Kubernetes
Kubernetes 集群的监控与日志管理最佳实践
【5月更文挑战第19天】 在现代微服务架构中,容器编排平台如Kubernetes已成为部署、管理和扩展应用程序的关键工具。随着其应用范围不断扩大,集群的稳定性和性能监控变得至关重要。本文将探讨针对Kubernetes集群的监控策略,并深入分析日志管理的实现方法。通过介绍先进的技术堆栈和实用工具,旨在为运维专家提供一套完整的解决方案,以确保集群运行的透明度和可靠性。
28 3
|
1天前
|
存储 运维 监控
Kubernetes 集群的监控与性能优化策略
【5月更文挑战第19天】 在微服务架构日益普及的背景下,容器编排工具如Kubernetes已成为部署、管理和扩展服务的关键平台。然而,随着集群规模的增长和服务的复杂化,有效的监控和性能优化成为确保系统稳定性和高效性的重要挑战。本文将探讨针对Kubernetes集群监控的最佳实践,并提出一系列性能优化策略,旨在帮助运维人员识别潜在的瓶颈,保障服务的持续可靠性及响应速度。
|
3天前
|
资源调度 Kubernetes 监控
Kubernetes 集群性能优化实践
【5月更文挑战第17天】在容器化和微服务架构日益普及的当下,Kubernetes 已成为众多企业的首选容器编排工具。然而,随着集群规模的增长和业务复杂度的提升,性能优化成为确保系统稳定性与高效运行的关键。本文将深入探讨 Kubernetes 集群性能优化的策略与实践,覆盖从节点资源配置到网络通信优化,再到高效的资源调度机制,旨在为运维人员提供系统的优化路径和具体的操作建议。
|
4天前
|
存储 Java Serverless
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储

热门文章

最新文章

推荐镜像

更多