From 77586880f0e771c1535fb3812d18b3c56bb222ac Mon Sep 17 00:00:00 2001 From: Odboy Date: Fri, 21 Feb 2025 19:29:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Ek8s=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + statefulset/readme.md | 7 ++ statefulset/v20240713/ingress-internal.yaml | 26 ++++ statefulset/v20240713/ingress.yaml | 26 ++++ statefulset/v20240713/namespace.yaml | 6 + statefulset/v20240713/remark.md | 17 +++ statefulset/v20240713/service.yaml | 34 +++++ statefulset/v20240713/statefulset.yaml | 130 ++++++++++++++++++++ 8 files changed, 248 insertions(+) create mode 100644 statefulset/readme.md create mode 100644 statefulset/v20240713/ingress-internal.yaml create mode 100644 statefulset/v20240713/ingress.yaml create mode 100644 statefulset/v20240713/namespace.yaml create mode 100644 statefulset/v20240713/remark.md create mode 100644 statefulset/v20240713/service.yaml create mode 100644 statefulset/v20240713/statefulset.yaml diff --git a/.gitignore b/.gitignore index 524f096..22509b8 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* replay_pid* + +.idea diff --git a/statefulset/readme.md b/statefulset/readme.md new file mode 100644 index 0000000..5fe9c11 --- /dev/null +++ b/statefulset/readme.md @@ -0,0 +1,7 @@ +## Statefulset + +有状态服务模板 + +## 填充说明 + +文件内容适用于freemarker模板语法 \ No newline at end of file diff --git a/statefulset/v20240713/ingress-internal.yaml b/statefulset/v20240713/ingress-internal.yaml new file mode 100644 index 0000000..3a7cdd8 --- /dev/null +++ b/statefulset/v20240713/ingress-internal.yaml @@ -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 \ No newline at end of file diff --git a/statefulset/v20240713/ingress.yaml b/statefulset/v20240713/ingress.yaml new file mode 100644 index 0000000..8504379 --- /dev/null +++ b/statefulset/v20240713/ingress.yaml @@ -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 \ No newline at end of file diff --git a/statefulset/v20240713/namespace.yaml b/statefulset/v20240713/namespace.yaml new file mode 100644 index 0000000..66b7d41 --- /dev/null +++ b/statefulset/v20240713/namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + kubernetes.io/metadata.name: ${AppName} + name: ${AppName} \ No newline at end of file diff --git a/statefulset/v20240713/remark.md b/statefulset/v20240713/remark.md new file mode 100644 index 0000000..24af4c6 --- /dev/null +++ b/statefulset/v20240713/remark.md @@ -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 不可用 | + + \ No newline at end of file diff --git a/statefulset/v20240713/service.yaml b/statefulset/v20240713/service.yaml new file mode 100644 index 0000000..cf6df48 --- /dev/null +++ b/statefulset/v20240713/service.yaml @@ -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 \ No newline at end of file diff --git a/statefulset/v20240713/statefulset.yaml b/statefulset/v20240713/statefulset.yaml new file mode 100644 index 0000000..7c901cd --- /dev/null +++ b/statefulset/v20240713/statefulset.yaml @@ -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}