OpenKruise 是阿里云开源的 Kubernetes 增强组件,提供原地升级、Sidecar 容器管理、高级发布策略等原生 Kubernetes 不具备的能力。本文基于 K8s 1.30.1 版本,详细介绍 OpenKruise 1.8.0 的完整安装与验证流程。
核心内容包括:
环境准备:提前安装 Helm 并配置国内源,下载 OpenKruise 离线镜像包(a1e4d262ffb0.tar)及 Helm Chart 包(kruise-1.8.0.tgz)
安装部署:通过 docker load 导入镜像,使用 helm install 命令完成 Kruise 组件安装
部署验证:使用 helm list、helm status、kubectl get pod 等命令确认组件运行状态
功能测试:提供完整的 StatefulSet 测试 YAML,展示 OpenKruise 核心特性:
apps.kruise.io/v1beta1 API 版本扩展podUpdatePolicy: InPlaceIfPossible)readinessGates 中的 InPlaceUpdateReady)partition 控制更新范围)本文适用于需要在 Kubernetes 集群中引入高级工作负载管理能力的运维和开发人员。
https://openkruise.io/zh/docs/installation
下载后上传到主节点
shellhelm repo add openkruise https://openkruise.github.io/charts/ helm repo update

shelldocker load -i a1e4d262ffb0.tar helm install kruise kruise-1.8.0.tgz
shellhelm list helm status kruise --show-resources kubectl get pod -A

yamlapiVersion: v1 # K8s API 版本(核心组 v1)
kind: Namespace # 资源类型:命名空间
metadata:
name: cutejava # 命名空间名称
labels:
appName: cutejava # 该命名空间的应用名称标签,用于选择器/统计
env: production # 环境标签:生产环境
---
apiVersion: apps.kruise.io/v1beta1 # 使用 OpenKruise 的 StatefulSet 扩展 API 版本
kind: StatefulSet # 资源类型:有状态副本集(由 Kruise 扩展)
metadata:
name: cutejava-production-sts # StatefulSet 名称
namespace: cutejava # 资源所属命名空间
spec:
podManagementPolicy: Parallel # Pod 管理策略:并行创建/删除(非默认 OrderedReady)
replicas: 5 # 期望副本数
selector:
matchLabels:
appName: cutejava # 用于匹配 Pod 的标签键 appName
env: production # 用于匹配 Pod 的标签键 env
serviceName: cutejava-production-headless # 用作 StatefulSet Headless Service 名称,为 Pod 提供稳定网络标识。DNS/主机名:pod-specific-string.serviceName.default.svc.cluster.local
template:
metadata:
labels:
appName: cutejava # Pod 标签:应用名称
env: production # Pod 标签:环境
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: appName # 反亲和匹配键:appName
operator: In # 选择器操作符:包含
values:
- cutejava # 反亲和匹配值:cutejava
topologyKey: failure-domain.beta.kubernetes.io/zone # 拓扑域:按可用区打散
weight: 50 # 亲和权重:50(越大越优先)
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: appName # 反亲和匹配键:appName
operator: In # 选择器操作符:包含
values:
- cutejava # 反亲和匹配值:cutejava
topologyKey: kubernetes.io/hostname # 拓扑域:按节点主机名打散
weight: 50 # 亲和权重:50
containers:
- image: registry.cn-shanghai.aliyuncs.com/odboy/ops:springboot-jdk11 # 容器镜像(含仓库/命名空间/标签)
imagePullPolicy: IfNotPresent # 镜像拉取策略:本地不存在时再拉取
name: cutejava-production-biz # 容器名称
readinessProbe: # 就绪探针:用于流量接入前健康检查
failureThreshold: 3 # 连续失败次数阈值(达到则判定不就绪)
httpGet:
path: /healthCheck/readiness # HTTP 探活路径
port: 8000 # 探活端口
scheme: HTTP # 协议:HTTP
initialDelaySeconds: 30 # 容器启动后初始延迟秒数
periodSeconds: 10 # 探测周期(秒)
successThreshold: 1 # 连续成功次数阈值
timeoutSeconds: 1 # 单次探测超时时间(秒)
resources: # 资源配额与请求
limits:
cpu: 1 # CPU 上限:1 核(注意:等价于 1 = 1000m)
memory: 1024Mi # 内存上限:1 GiB
requests:
cpu: 1 # CPU 请求:1 核
memory: 1Gi # 内存请求:1 GiB
terminationMessagePath: /dev/termination-log # 终止消息写入路径
terminationMessagePolicy: File # 终止消息策略:从文件读取
volumeMounts:
- mountPath: /home/admin/cutejava/logs # 容器内挂载路径(日志目录)
name: cutejava-volume # 关联卷名称
subPath: logs # 在卷中的子路径,仅挂载该子目录
dnsPolicy: ClusterFirst # DNS 策略:优先集群内部解析
readinessGates:
- conditionType: InPlaceUpdateReady # 额外就绪门:Kruise 原地升级就绪条件
restartPolicy: Always # 重启策略:总是重启(对 Pod 模板生效)
terminationGracePeriodSeconds: 30 # 优雅终止等待时间(秒)
volumes:
- emptyDir:
sizeLimit: 10Gi # emptyDir 卷大小上限
name: cutejava-volume # 卷名称,与 volumeMounts 对应
updateStrategy:
rollingUpdate:
inPlaceUpdateStrategy:
gracePeriodSeconds: 5 # 原地升级优雅等待时长(秒)
maxUnavailable: 1 # 滚动更新期间允许不可用的 Pod 数量
minReadySeconds: 0 # 新 Pod 就绪后最小就绪保持时间(秒)
partition: 5 # 分区更新:从索引 >= 5 的 Pod 开始更新(0~replicas-1)
podUpdatePolicy: InPlaceIfPossible # 优先原地更新,无法原地时再重建
type: RollingUpdate # 更新策略:滚动更新




本文作者:Odboy
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC 4.0 BY-SA 许可协议。转载请注明出处!