Kubernetes基础_05_StatefulSet全解析(有状态的Pod)

Posted 毛奇志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes基础_05_StatefulSet全解析(有状态的Pod)相关的知识,希望对你有一定的参考价值。

系列文章目录

文章目录


前言

nginx 是平等的,无状态的,如下:

因为nginx是不存储数据的,只是做路由转发,做负载均衡,即使是运行服务端的tomcat也是无状态的。

一、StatefulSet的引入

官网https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

StatefulSet is the workload API object used to manage stateful applications.
Manages the deployment and scaling of a set of Pods, and provides guarantees about the ordering and uniqueness of these Pods.

  • Stable, unique network identifiers.
  • Stable, persistent storage.
  • Ordered, graceful deployment and scaling.
  • Ordered, automated rolling updates.

其他接触的Pod的管理对象比如RS、Deployment、DaemonSet和Job都是面向无状态的服务,但是现实中有很多服务是有状态的,比如mysql集群、MongoDB集群、ZK集群等,都是存储数据的,它们都有以下共同的特点:

  • 每个节点都有固定的ID,通过该ID,集群中的成员可以互相发现并且通信(不平等,每个id不同)
  • 集群的规模是比较固定的,集群规模不能随意变动
  • 集群里的每个节点都是有状态的,通常会持久化数据到永久存储中(持久化存储)
  • 如果磁盘损坏,则集群里的某个节点无法正常运行,集群功能受损

而之前的RC/Deployment没办法满足要求,所以从Kubernetes v1.4版本就引入了PetSet资源对象,在v1.5版本时更名为StatefulSet。从本质上说,StatefulSet可以看作是Deployment/RC对象的特殊变种

  • StatefulSet里的每个Pod都有稳定、唯一的网络标识,可以用来发现集群内其他的成员(不平等,每个id不同)
  • Pod的启动顺序是受控的,操作第n个Pod时,前n-1个Pod已经是运行且准备好的状态
  • StatefulSet里的Pod采用稳定的持久化存储卷,通过PV/PVC来实现,删除Pod时默认不会删除与StatefulSet相关的存储卷
  • StatefulSet需要与Headless Service配合使用

日志监控每个pv pvc 会报错,找不到bound pv

pv pvc 是持久化存储 statefulSet是有状态,其完成持久化存储必须借助pv pvc

deployment 无法满足,因为deployment里面的pod都是没有状态的

集群内唯一标识id + pod启动顺序受控制 + 持久化存储

二、StatefulSet实践

vi nginx-st.yaml
kubectl apply nginx-st.yaml
watch kubectl get pods    # 观察pod的创建顺序,以及pod的名字(重要)
# 定义Service    service暴露出去statefulSet,和之前暴露deployment一样
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
# 定义StatefulSet
apiVersion: apps/v1
kind: StatefulSet  
metadata:
  name: web #  这里定义StatefulSet的名称,启动起来之后带了序号(状态性,每个不平等),而且顺序就是序号(有序性)
spec:
  selector:
    matchLabels:
      app: nginx 
  serviceName: "nginx"  
  replicas: 3 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web

总结

以上是关于Kubernetes基础_05_StatefulSet全解析(有状态的Pod)的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes基础_02_Pod全解析

Kubernetes基础_02_Pod全解析

Kubernetes基础_03_ReplicaSet全解析

Kubernetes基础_03_ReplicaSet全解析

Kubernetes基础_06_DaemonSet全解析(每个Node都有的Pod)

Kubernetes基础_06_DaemonSet全解析(每个Node都有的Pod)