131 lines
5.5 KiB
YAML
131 lines
5.5 KiB
YAML
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}
|