apiVersion: apps/v1 kind: StatefulSet metadata: labels: appName: ${AppName} resEnv: ${AppEnv} resGroup: ${AppName}-${AppEnv} name: devops-sts-${AppName}-${AppEnv} namespace: ${AppName} spec: # Pod 的管理策略, OrderedReady(有序启动,默认值),Parallel(并发一起启动) podManagementPolicy: Parallel # 副本数量 replicas: ${Replicas} # 表示要保留以允许回滚的旧ReplicaSet的数量。默认是10个。如果值为0,表示不保存旧版本 revisionHistoryLimit: ${RevisionHistoryLimit} # 选择器用于标识将受StatefulSet控制的Pod selector: matchLabels: appName: ${AppName} resEnv: ${AppEnv} resGroup: ${AppName}-${AppEnv} # 用于创建一个Headless服务,这个服务将提供每个Pod的稳定网络标识符 serviceName: devops-hls-${AppName}-${AppEnv} # 描述StatefulSet创建Pod的模板 template: metadata: # Pod标签,用于匹配选择器 labels: appName: ${AppName} resEnv: ${AppEnv} resGroup: ${AppName}-${AppEnv} spec: affinity: # Pod 亲和性,调度目标:Pod与指定Pod不在同一拓扑域 podAntiAffinity: # 软策略 preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: # In:label 的值在某个列表中 # NotIn:label 的值不在某个列表中 # Gt:label 的值大于某个值 # Lt:label 的值小于某个值 # Exists:某个 label 存在 # DoesNotExist:某个 label 不存在 matchExpressions: - key: resGroup operator: In values: - ${AppName}-${AppEnv} topologyKey: failure-domain.beta.kubernetes.io/zone weight: 50 # 如果有多个软策略选项的话,权重越大,优先级越高 - podAffinityTerm: labelSelector: matchExpressions: - key: resGroup operator: In values: - ${AppName}-${AppEnv} topologyKey: kubernetes.io/hostname weight: 60 # 如果有多个软策略选项的话,权重越大,优先级越高 # Pod中的容器列表 containers: - name: devops-pod-${AppName}-${AppEnv} # 容器名称 image: ${AppImage} #容器镜像 imagePullPolicy: IfNotPresent # 容器生命周期 lifecycle: # 容器停止前, 执行命令 preStop: exec: command: - /bin/sh - -c - echo 'Hello World' # 存活探针:指示容器是否正在运行。如果活动探针失败,则kubelet将杀死Container,并且Container将接受其重新启动策略。如果容器未提供活动性探针,则默认状态为Success livenessProbe: tcpSocket: port: 22 initialDelaySeconds: 10 failureThreshold: 3 periodSeconds: 15 successThreshold: 1 timeoutSeconds: 5 # 就绪探针:指示容器是否准备好服务请求。如果就绪探针失败,则端点控制器将从与Pod匹配的所有服务的端点中删除Pod的IP地址。初始延迟之前的默认就绪状态为Failure。如果容器未提供就绪探测器,则默认状态为Success readinessProbe: httpGet: path: /healthCheck # 无需鉴权的健康检查API接口 port: 8080 # 服务所在端口 scheme: HTTP initialDelaySeconds: 20 failureThreshold: 3 periodSeconds: 3 successThreshold: 1 timeoutSeconds: 1 # 资源配置 resources: requests: cpu: ${RequestCpu} memory: ${RequestMemory}Gi limits: cpu: ${LimitCpu} memory: ${LimitMemory}Gi # 定义存储卷挂载的路径(写挂载到容器内的路径) volumeMounts: - name: devops-vol-${AppName}-${AppEnv} # 定义卷申请模板的名称(要匹配到它才能使用并挂载到容器内) mountPath: /home/admin/logs # 应用日志所在的路径 subPath: biz-logs # 存储卷中的位置 dnsPolicy: ClusterFirst readinessGates: - conditionType: InPlaceUpdateReady # Init容器失败时会使用RestartPolicy策略 restartPolicy: Always terminationGracePeriodSeconds: 30 # 存储卷配置 volumes: - name: devops-vol-${AppName}-${AppEnv} # 存储卷名称 # 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除 emptyDir: sizeLimit: 10Gi # 更新策略 updateStrategy: # 自动滚动更新Pod,从序号大的开始,确保有序更新 type: RollingUpdate rollingUpdate: # 分段更新(灰度发布),假如一共有5个pod,由于起始序号为0,当partition值为3时,表示从编号为3的pod从前往后更新 partition: ${RollingUpdatePartition} # 在进行更新时,允许的不可用 Pod 的最大数量。例如,可以将其设置为 50% 表示每次更新时只允许 50% 的 Pod 不可用 maxUnavailable: ${RollingUpdateMaxUnavailable}