2025,每天10分钟,跟我学K8S(十四)- StatefulSet

        上一章节,初步通过Deployment和ReplicaSet了解到了他们对Pod的管理方式,但是这里有一个问题,pod的名字都是无序的随机生成无状态服务,我们又知道同pod之间是可以互相访问的。那有没有一种方式能让这种变成可预测的呢?

        举例,有2个pod程序,其中一个是web服务,一个是是mysql服务,web需要去连接mysql进行数据查询,那么就得在web服务中写好mysql的IP地址,但是如果mysql的pod被重建了,IP就发生改变了。如果web是通过主机名去连接mysql,同时这个mysql即便重建主机名也不发生改变,岂不美哉?

        K8S为了这种环境提供了一个新的对象:StatefulSet。

  StatefulSet类似于ReplicaSet,但是它可以处理Pod的启动顺序,为保留每个Pod的状态设置唯一标识,同时具有以下功能:

  • 稳定的、唯一的网络标识符
  • 稳定的、持久化的存储
  • 有序的、优雅的部署和缩放
  • 有序的、优雅的删除和终止
  • 有序的、自动滚动更新

        接下来还是以具体的例子来演示。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: m.daocloud.io/docker.io/nginx:latest
        ports:
        - containerPort: 80
          name: web

上述例子使用StatefulSet类型来创建了一个3副本的pod,通过下图可以看到pod的编号不再无序,而是在有序的以0,1,2数字往后叠加。

通过kubectl delete命令删除其中一个pod,可以观察出来,IP发生了改变,但是主机名没有变化。

        在我们学习了service的章节后,可以使用 <pod名>.<命名空间>.svc.cluster.local 的方式,通过主机名来直达pod节点。

posted @ 2025-03-13 16:22  Devopser06  阅读(68)  评论(0)    收藏  举报  来源