feat: 新增k8s应用部署模板
This commit is contained in:
@@ -22,3 +22,5 @@
|
|||||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
hs_err_pid*
|
hs_err_pid*
|
||||||
replay_pid*
|
replay_pid*
|
||||||
|
|
||||||
|
.idea
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
## Statefulset
|
||||||
|
|
||||||
|
有状态服务模板
|
||||||
|
|
||||||
|
## 填充说明
|
||||||
|
|
||||||
|
文件内容适用于freemarker模板语法
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
# 该注解允许你设置应用的名称,这个名称可以用于日志记录或者其他一些nginx的配置
|
||||||
|
nginx.ingress.kubernetes.io/app.name: ${AppName}
|
||||||
|
name: devops-ing-${AppName}-${AppEnv}
|
||||||
|
namespace: ${AppName}
|
||||||
|
spec:
|
||||||
|
# 参考文档 https://blog.csdn.net/ysf15609260848/article/details/125898494
|
||||||
|
rules:
|
||||||
|
- host: ${AppName}-internal-api.odboy.com
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
# service名称
|
||||||
|
name: devops-svc-${AppName}-${AppEnv}
|
||||||
|
port:
|
||||||
|
# service端口
|
||||||
|
number: 80
|
||||||
|
path: /
|
||||||
|
# Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。
|
||||||
|
# Exact:精确匹配 URL 路径,且区分大小写。
|
||||||
|
# ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理。
|
||||||
|
pathType: ImplementationSpecific
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
# 该注解允许你设置应用的名称,这个名称可以用于日志记录或者其他一些nginx的配置
|
||||||
|
nginx.ingress.kubernetes.io/app.name: ${AppName}
|
||||||
|
name: devops-ing-${AppName}-${AppEnv}
|
||||||
|
namespace: ${AppName}
|
||||||
|
spec:
|
||||||
|
# 参考文档 https://blog.csdn.net/ysf15609260848/article/details/125898494
|
||||||
|
rules:
|
||||||
|
- host: ${AppName}-api.odboy.cn
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
# service名称
|
||||||
|
name: devops-svc-${AppName}-${AppEnv}
|
||||||
|
port:
|
||||||
|
# service端口
|
||||||
|
number: 80
|
||||||
|
path: /
|
||||||
|
# Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。
|
||||||
|
# Exact:精确匹配 URL 路径,且区分大小写。
|
||||||
|
# ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理。
|
||||||
|
pathType: ImplementationSpecific
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubernetes.io/metadata.name: ${AppName}
|
||||||
|
name: ${AppName}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
## 参数列表和说明
|
||||||
|
|
||||||
|
| 参数名称 | 参数说明 |
|
||||||
|
|-----------------------------|-----------------------------------------------------------------|
|
||||||
|
| AppName | 应用名称,比如:cutego |
|
||||||
|
| AppEnv | 应用环境,比如:daily |
|
||||||
|
| Replicas | 副本数量 |
|
||||||
|
| RevisionHistoryLimit | 要保留以允许回滚的旧ReplicaSet的数量。默认是10个。如果值为0,表示不保存旧版本 |
|
||||||
|
| AppImage | 容器镜像 |
|
||||||
|
| RequestCpu | 初始CPU数 |
|
||||||
|
| RequestMemory | 初始内存数 |
|
||||||
|
| LimitCpu | 最大CPU数 |
|
||||||
|
| LimitMemory | 最大内存数 |
|
||||||
|
| RollingUpdatePartition | 分段更新(灰度发布),假如一共有5个pod,由于起始序号为0,当partition值为3时,表示从编号为3的pod从前往后更新 |
|
||||||
|
| RollingUpdateMaxUnavailable | 在进行更新时,允许的不可用 Pod 的最大数量。例如,可以将其设置为 50% 表示每次更新时只允许 50% 的 Pod 不可用 |
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
appName: ${AppName}
|
||||||
|
resEnv: ${AppEnv}
|
||||||
|
resGroup: ${AppName}-${AppEnv}
|
||||||
|
name: devops-svc-${AppName}-${AppEnv}
|
||||||
|
namespace: ${AppName}
|
||||||
|
spec:
|
||||||
|
# kube-proxy 基于 spec.internalTrafficPolicy 的设置来过滤路由的目标服务端点。 当它的值设为 Local 时,只会选择节点本地的服务端点。 当它的值设为 Cluster 或缺省时,Kubernetes 会选择所有的服务端点
|
||||||
|
# 将 internalTrafficPolicy: Local 改成Cluster 之后所有节点都可以可以curl 通nginx
|
||||||
|
internalTrafficPolicy: Cluster
|
||||||
|
# 指定服务期望的IP地址族的列表。IP地址族可以是IPv4或IPv6
|
||||||
|
ipFamilies:
|
||||||
|
- IPv4
|
||||||
|
# 指定Service的IP家族策略。它的可选值有SingleStack、PreferDualStack和RequireDualStack
|
||||||
|
# SingleStack: 表示服务只使用单个IP家族(IPv4或IPv6)
|
||||||
|
# PreferDualStack: 表示服务优先使用双栈(IPv4和IPv6),但在无法提供双栈时会退回到单栈
|
||||||
|
# RequireDualStack: 表示服务需要双栈支持,如果无法提供双栈,服务将无法创建
|
||||||
|
ipFamilyPolicy: SingleStack
|
||||||
|
ports:
|
||||||
|
- port: 80 # Service端口
|
||||||
|
protocol: TCP # 协议
|
||||||
|
targetPort: 7001 # 容器端口
|
||||||
|
# 通过标签关联pod
|
||||||
|
selector:
|
||||||
|
appName: ${AppName}
|
||||||
|
resEnv: ${AppEnv}
|
||||||
|
resGroup: ${AppName}-${AppEnv}
|
||||||
|
# 指定选择后端 Pod 的方法。当 spec.sessionAffinity 设置为 ClientIP 时,来自同一个客户端的请求会被转发到同一个后端 Pod
|
||||||
|
sessionAffinity: None
|
||||||
|
# 服务类型
|
||||||
|
type: ClusterIP
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
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}
|
||||||
Reference in New Issue
Block a user