K8S学习之基础二十六:k8s的StatefulSet控制器

发布于:2025-03-14 ⋅ 阅读:(19) ⋅ 点赞:(0)

k8s中StatefulSet控制器

​ StatefulSet是为了管理有状态服务的问题设计的

​ StatefulSet(sts)是有状态的集合,管理有状态的服务,它管理的Pod名称不能随意变化,数据持久化的目录也不一样,每个pod都有独有的数据持久化存储目录,如mysql、redis集群等

vi statefulset.yaml 
apiVersion: v1
kind: Service
metadata: 
  name: nginx
  labels:
     app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata: 
  name: web
spec:
  selector:           # -required-
    matchLabels:
      app: nginx
  serviceName: nginx  # -required-
  replicas: 2
  template:           # -required-
    metadata: 
     labels:
       app: nginx
    spec: 
      containers:
      - name: 172.16.80.140/nginx/nginx:1.26
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "nfs"
      resources:
        requests: 
          storage: 1Mi

image-20250312150240926

image-20250312150511468

如果把pod web-0删除,sts会重新生成一个web-0的pod,并且还使用同一pvc

image-20250312150643643

集群内部可以通过访问service访问pod

使用kubectl run运行一个提供nslookup命令的容器的,这个命令来自于dnsutils包,通过对pod主机名执行nslookup,可以检查它们在集群内部的DNS地址:

kubectl run busybox --image 172.16.80.140/busybox/busybox:1.28  --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh
# 解析pod域名,得到pod的ip
/ # nslookup web-0.nginx.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      web-0.nginx.default.svc.cluster.local
Address 1: 10.244.140.67 web-0.nginx.default.svc.cluster.local
/ # nslookup nginx.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

# 解析service域名,得到service关联的pod的ip
Name:      nginx.default.svc.cluster.local
Address 1: 10.244.196.130 web-1.nginx.default.svc.cluster.local
Address 2: 10.244.140.67 web-0.nginx.default.svc.cluster.local

Statefulset总结:

Statefulset管理的pod,pod名字是有序的,由statefulset的名字-0、1、2这种格式组成

创建statefulset资源的时候,必须事先创建好一个service,如果创建的service没有ip,那对这个service做dns解析,会找到它所关联的pod ip,如果创建的service有ip,那对这个service做dns解析,会解析到service本身ip。

statefulset管理的pod,删除pod,新创建的pod名字跟删除的pod名字是一样的

statefulset具有volumeclaimtemplate这个字段,这个是卷申请模板,会自动创建pv,pvc也会自动生成,跟pv进行绑定,那如果创建的statefulset使用了volumeclaimtemplate这个字段,那创建pod,数据目录是独享的

ststefulset创建的pod,是域名的(域名组成:pod-name.svc-name.svc-namespace.svc.cluster.local)

sts中service处Headlessservice,还可以配置成ClusterIP、NodePort,这样就可以在集群内部集群外部,通过访问servcie来访问pod了

StatefulSet由以下几个部分组成:

  1. Headless Service:用来定义pod网路标识,生成可解析的DNS记录,无头服务

  2. volumeClaimTemplates:存储卷申请模板,创建pvc,指定pvc名称大小,自动创建pvc,且pvc由存储类供应。

  3. StatefulSet:管理pod的

什么是Headlessservice?

Headlessservice不分配clusterIP,headless service可以通过解析service的DNS,返回所有Pod的dns和ip地址 (statefulSet部署的Pod才有DNS),普通的service,只能通过解析service的DNS返回service的ClusterIP


网站公告

今日签到

点亮在社区的每一天
去签到