StatefulSet

StatefulSet官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/
StatefulSet控制器主要用来部署有状态应用,StatefulSet创建的每个Pod对象都具有唯一且固定的Pod名称,这些Pod对象的数据一般都会通过PVC保存在持久存储中。StatefulSet可以用来部署mysql、redis和kafka这类服务。

StatefulSet会按照顺序对Pod进行启停和伸缩操作。对于拥有N个副本的StatefulSet的资源来说,它会以{0…N-1}对各个Pod进行编号并按顺序创建,当前Pod就绪后才能创建下一个,删除的时候以相反的顺序进行,当前Pod删除完成后才能删除前一个。

一般来说StatefulSet还需要结合Headless Service使用,Headless Service就是没有ClusterIP的Service对象。Headle Service对象负责为每个Pod对象固定的名称标识符生成可解析的DNS记录,StatefulSet负责编排Pod对象,并且借助PVC模板为Pod提供专用且固定的存储资源。

StatefulSet 创建的Pod的名称格式为<statefulset-name>-<serial-number>,例如名为web的3副本的StatefulSet其创建的Pod对象的名称依次为web-0、web-1、web-2。域名后缀是StatefulSet对应的HeadLess Service的域名,<svc-name>.<ns>.svc.cluster.local

StatefulSet的资源规范文件如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: ...
  namespace: ...
spec:
  replicas: <int>	#期望Pod副本数,默认为1
  selector: <Object>	#标签选择器,用于筛选Pod
  template: <Object>	#Pod模板
  revisionHistoryLimit: <int>	#滚动更新历史记录保留数量,默认为10
  serviceName: <string>	#StatefulSet对应的HeadLess Service对象的名称
  volumeClaimTemplates:	#PVC模板,会根据此模板自动创建PVC,然后挂载到Pod使用
  - apiVersion: <string>	#PVC资源API版本,可省略
    kind: <string>		#PVC资源标识,可省略
    metadata: <Object>	#PVC资源对象元数据
    spec: <Object>	#PVC资源对象期望状态,可用字段同PVC
  updateStrategy:       #更新策略配置
    type: <string>    #滚动更新类型,可用值有OnDelete和RollingUpdate
    rollingUpdate:    #专用于RollingUpdate的更新参数
      partition: <int>    #分区指示索引值,默认为0
  podManagementPolicy: <string>	#Pod管理策略,默认为OrderedReady表示顺序创建逆序删除,另一个值Parallel表示并行模式

StatefulSet示例:

apiVersion: v1
kind: Service
metadata:
  name: statefulset-svc
spec:
  selector:
    app: statefulset-demo
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  clusterIP: None

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-demo
spec:
  serviceName: statefulset-svc
  replicas: 3
  selector:
    matchLabels:
      app: statefulset-demo
  template:
    metadata:
      labels:
        app: statefulset-demo
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - name: http
          containerPort: 80
  volumeClaimTemplates:
  - metadata:
      name: date
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 1Gi
        limits:
          storage: 1Gi
      storageClassName: managed-nfs-storage

查看StatefulSet创建的Pod,名称都是按顺序编号的,格式为<statefulset-name>-<serial-number>,另外Pod的主机名和Pod的名称也是一致的
在这里插入图片描述
创建的pvc资源也一样按顺序编号
在这里插入图片描述
在测试pod中对statefulset-svc解析,会直接返回3个Pod的地址。也可以直接解析pod对应的域名,pod的域名格式是<pod-name>.<svc-name>.<ns>.svc.cluster.local
在这里插入图片描述
在这里插入图片描述

访问statefulset测试
在这里插入图片描述
在这里插入图片描述

DaemonSet

DaemonSet官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/
DaemonSet控制器是一种特殊的控制器,它可以在集群中的每个节点上运行同一个Pod,当有新的节点加入集群时DaemonSet也会在新节点上创建相同的Pod;当从集群中移除节点时,节点上的Pod也会被自动删除。删除DaemonSet将会删除其创建的所有Pod。DaemonSet主要用来运行那些系统级守护进程,例如监控代理进程和日志收集进程等

DaemonSet的资源规范文件常用字段如下:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ...
  namespace: ...
spec:
  selector: <Object>	#标签选择器,用于筛选Pod
  template: <Object>	#Pod模板
  minReadySeconds: <int>	#Pod就绪多少秒内无任一容器崩溃方可视为就绪
  updateStrategy:	#更新策略配置
    type: <string>	#更新方式,可用值有OnDelete和RollingUpdate
    rollingUpdate:	#用于滚动更新的配置
      maxUnavailable: <string>    #更新期间可比期望的Pod数量缺少的数量或百分比

DaemonSet示例,在每个节点部署prometheus node-expoter:

apiVersion: v1
kind: Namespace
metadata:
  name: monitoring
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: prometheus-node-expoter
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: prometheus-node-expoter
  template:
    metadata:
      labels:
        app: prometheus-node-expoter
    spec:
      containers:
      - name: prometheus-node-expoter
        image: prom/node-exporter:v1.3.1
        args:
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        - --path.rootfs=/host
        ports:
        - name: metrics
          containerPort: 9100
          protocol: TCP
          hostPort: 9100
        volumeMounts:
        - name: proc
          mountPath: /host/proc
          readOnly: true
        - name: sys
          mountPath: /host/sys
          readOnly: true
        - name: rootfs
          mountPath: /host
          readOnly: true
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: sys
        hostPath:
          path: /sys
      - name: rootfs
        hostPath:
          path: /
      hostNetwork: true
      hostPID: true

查看Pod,DaemonSet会在每个节点都创建一个对应的Pod
在这里插入图片描述
访问任意节点的9100端口的/metrics路径测试,可以看到已经有和监控数据
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐