美文网首页
K8S之statefuleSet

K8S之statefuleSet

作者: david161 | 来源:发表于2022-03-26 09:45 被阅读0次

前边我们讲了deployment来管理pod容器的副本数量,如果挂掉之后容器再次启动就可以了,但是如果要是启动的是mysql集群、zookeeper集群、etcd这种集群,里面都有id号,这种有关联的,如果一旦挂掉之后,在启动之后呢,集群id是否会变化呢?答案是肯定会变的。
那有没有另外的一种控制器模式吗?当然k8s会提供的--【statefulset】
那什么场景需要使用StatefulSet呢?官方给出的建议是,如果你部署的应用满足以下一个或多个部署需求,则建议使用StatefulSet。
1)稳定的、唯一的网络标识。
2)稳定的、持久的存储。
3)有序的、优雅的部署和伸缩。
4)有序的、优雅的删除和停止。
5)有序的、自动的滚动更新。

statefulset和deployment的区别

image.png

分类

K8s有状态应用部署分为两步:

  1. Headless Service: Headless Service 其实和service差不多,只不过定义的这个叫无头服务,它们之间唯一的区别就是将Cluster ip 设置为了none,不会帮你配置ip
  2. StatefulSet:需要在pod模板中定义servicename。spec. serviceName。
Headless Service案例-不需要创建演示
apiVersion: v1 
kind: Service 
metadata: 
  name: my-service 
spec: 
  clusterIP: None 
  selector: 
    app: nginx 
  ports: 
    - protocol: TCP 
      port: 80 
      targetPort: 9376
部署服务
kubectl create -f headless-svc.yaml 

kubectl get svc 

怎么去访问?我们给它定义一个标识。创建完之后会有这个标识符,它会使用这个DNS来解析这个名称,
来相互的访问,headless就不会通过ip去访问了,必须通过名称去访问。
statefulSet案例-不需要创建演示
apiVersion: apps/v1beta1 
kind: StatefulSet 
metadata: 
  name: nginx-statefulset 
  namespace: default 
spec: 
  serviceName: my-service 
  replicas: 3 
  selector: 
    matchLabels: 
      app: nginx 
  template: 
    metadata: 
      labels: 
        app: nginx 
    spec: 
      containers: 
      - name: 
        nginx image: nginx:latest 
        ports: 
        - containerPort: 80

总结

Pod会被顺序部署和顺序终结:StatefulSet中的各个 Pod会被顺序地创建出来,每个Pod都有一个唯一的ID,在创建后续 Pod 之前,首先要等前面的 Pod 运行成功并进入到就绪状态。删除会销毁StatefulSet 中的每个 Pod,并且按照创建顺序的反序来执行,只有在成功终结后面一个之后,才会继续下一个删除操作。
Pod具有唯一网络名称:Pod具有唯一的名称,而且在重启后会保持不变。通过Headless服务,基于主机名,每个 Pod 都有独立的网络地址,这个网域由一个Headless 服务所控制。这样每个Pod会保持稳定的唯一的域名,使得集群就不会将重新创建出的Pod作为新成员。
Pod能有稳定的持久存储:StatefulSet中的每个Pod可以有其自己独立的PersistentVolumeClaim对象。即使Pod被重新调度到其它节点上以后,原有的持久磁盘也会被挂载到该Pod。
Pod能被通过Headless服务访问到:客户端可以通过服务的域名连接到任意Pod。

相关文章

网友评论

      本文标题:K8S之statefuleSet

      本文链接:https://www.haomeiwen.com/subject/qvkfjrtx.html