Skip to main content
版本:v1.7

安装

  • 从 v1.0.0 (alpha/beta) 开始,OpenKruise 要求在 Kubernetes >= 1.16 以上版本的集群中安装和使用。

  • 从 v1.5.0 (alpha/beta) 开始,OpenKruise 不再支持 dockershim。如果你依然在 K8S 集群中使用 docker 引擎运行容器, 你可以 将 Docker Engine 节点从 dockershim 迁移到 cri-dockerd。

  • 从 v1.6.0 (alpha/beta) 开始,OpenKruise 要求在 Kubernetes >= 1.18 以上版本的集群中安装和使用。如果你关闭了 Kruise-Daemon 组件(featureGates="KruiseDaemon=false"),你依然可以在 K8S 1.16 和 1.17 的集群上安装和使用。

  • 从 v1.6.0 (alpha/beta) 开始,Kruise-Daemon 将不再支持 v1alpha2 CRI 的运行时。如果你关闭了 Kruise-Daemon 组件(featureGates="KruiseDaemon=false"),你依然可以在只支持 v1alpha2 CRI 的运行时节点所在集群上安装和使用 OpenKruise。

通过 helm 安装

建议采用 helm v3.5+ 来安装 Kruise,helm 是一个简单的命令行工具可以从 这里 获取。

# Firstly add openkruise charts repository if you haven't do this.
$ helm repo add openkruise https://openkruise.github.io/charts/

# [Optional]
$ helm repo update

# Install the latest version.
$ helm install kruise openkruise/kruise --version 1.7.2

注意: Changelog

通过 helm 升级

# Firstly add openkruise charts repository if you haven't do this.
$ helm repo add openkruise https://openkruise.github.io/charts/

# [Optional]
$ helm repo update

# Upgrade to the latest version.
$ helm upgrade kruise openkruise/kruise --version 1.7.1 [--force]

注意:

  1. 在升级之前,必须 先阅读 Change Log ,确保你已经了解新版本的不兼容变化。
  2. 如果你要重置之前旧版本上用的参数或者配置一些新参数,建议在 helm upgrade 命令里加上 --reset-values
  3. 如果你在将 Kruise 从 0.x 升级到 1.x 版本,你需要为 upgrade 命令添加 --force 参数,其他情况下这个参数是可选的。

可选的:手工下载 charts 包

如果你在生产环境无法连接到 https://openkruise.github.io/charts/,可以先在这里手工下载 chart 包,再用它安装或更新到集群中。

$ helm install/upgrade kruise /PATH/TO/CHART

可选项

注意直接安装 chart 会使用默认的 template values,你也可以根据你的集群情况指定一些特殊配置,比如修改 resources 限制或者配置 feature-gates。

可选: chart 安装参数

下表展示了 chart 所有可配置的参数和它们的默认值:

启动参数

ParameterDescriptionDefault
featureGates可配置的 feature gates 参数,空表示按默认开关处理
installation.namespacekruise 安装到的 namespace,一般不建议修改kruise-system
installation.createNamespace是否需要创建上述 namespace,一般不建议修改,除非指定安装到已有的 ns 中true
crds.managed是否安装 Kruise CRD (若关闭则 chart 不会安装任何 CRD)true
imagePullSecretskruise 镜像用的 imagePullSecrets 列表false

manager参数

ParameterDescriptionDefault
manager.log.levelkruise-manager 日志输出级别4
manager.replicaskruise-manager 的期望副本数2
manager.image.repositorykruise-manager/kruise-daemon 镜像仓库openkruise/kruise-manager
manager.image.tagkruise-manager/kruise-daemon 镜像版本1.7.1
manager.resources.limits.cpukruise-manager 的 limit CPU 资源200m
manager.resources.limits.memorykruise-manager 的 limit memory 资源512Mi
manager.resources.requests.cpukruise-manager 的 request CPU 资源100m
manager.resources.requests.memorykruise-manager 的 request memory 资源256Mi
manager.metrics.portmetrics 服务的监听端口8080
manager.webhook.portwebhook 服务的监听端口9443
manager.nodeAffinitykruise-manager 部署的 node affinity 亲和性{}
manager.nodeSelectorkruise-manager 部署的 node selector 亲和性{}
manager.tolerationskruise-manager 部署的 tolerations[]
manager.resyncPeriodkruise-manager 中 informer 的 resync 周期,默认不做 resync0
manager.hostNetworkkruise-manager pod 是否采用 hostnetwork 网络false
manager.loggingFormat结构化日志,有效的format包括: (plain text)、json

daemon参数

ParameterDescriptionDefault
daemon.log.levelkruise-daemon 日志输出级别4
daemon.portkruise-daemon 的 metrics/healthz 服务监听端口10221
daemon.resources.limits.cpukruise-daemon 的 limit CPU 资源50m
daemon.resources.limits.memorykruise-daemon 的 limit memory 资源128Mi
daemon.resources.requests.cpukruise-daemon 的 request CPU 资源0
daemon.resources.requests.memorykruise-daemon 的 request memory 资源0
daemon.affinitykruise-daemon 部署的 affinity 亲和性 (可以排除一些 node 不部署 daemon){}
daemon.socketLocationNode 节点上 CRI socket 文件所在目录/var/run
daemon.socketFile指定 socketLocation 目录下的 socket 文件名 (如果你使用的 CRI 类型不是 containerd/docker/pouch/cri-o/cri-docker)
daemon.credentialProvider.enable针对镜像预热是否开启免密插件false
daemon.credentialProvider.hostPath免密插件的Node目录,将会挂载到 krusie-daemon 上credential-provider-plugin
daemon.credentialProvider.configmap免密插件的 configmap 配置文件名字credential-provider-config
daemon.credentialProvider.awsCredentialsDiraws的共享凭证目录,比如:/root/.aws

其它参数

ParameterDescriptionDefault
enableKubeCacheMutationDetector是否开启 KUBE_CACHE_MUTATION_DETECTORfalse
webhookConfiguration.failurePolicy.podsPod webhook 的失败策略Ignore
webhookConfiguration.timeoutSeconds所有 Kruise webhook 的调用超时时间30
externalCerts.annotationsPatch 到 kruise webbhook 和 crd 的 Annotations 配置。比如:cert-manager.io/inject-ca-from: kruise-system/kruise-webhook-certs.{}

这些参数可以通过 --set key=value[,key=value] 参数在 helm installhelm upgrade 命令中生效。

可选: feature-gate

Feature-gate 控制了 Kruise 中一些有影响性的功能:

NameDescriptionDefaultSide effect (if closed)
PodWebhook启用对于 Pod 创建 的 webhook (不建议关闭)trueSidecarSet/KruisePodReadinessGate 不可用
KruiseDaemon启用 kruise-daemon DaemonSet (不建议关闭)true镜像预热/容器重启 不可用
DaemonWatchingPod每个 kruise-daemon 会 watch 与自己同节点的 pod (不建议关闭)true同 imageID 的原地升级,以及支持 env from labels/annotation 原地升级 不可用
CloneSetShortHash启用 CloneSet controller 只在 pod label 中设置短 hash 值falseCloneSet 名字不能超过 54 个字符(默认行为)
KruisePodReadinessGate启用 Kruise webhook 将 'KruisePodReady' readiness-gate 在所有 Pod 创建时注入false只会注入到 Kruise workloads 创建的 Pod 中
PreDownloadImageForInPlaceUpdate启用 CloneSet 自动为原地升级的过程创建 ImagePullJob 来预热镜像false原地升级无镜像提前预热
CloneSetPartitionRollback启用如果 partition 被调大, CloneSet controller 会回滚 Pod 到 currentRevision 老版本falseCloneSet 只会正向发布 Pod 到 updateRevision
ResourcesDeletionProtection资源删除防护true资源删除无保护
TemplateNoDefaults是否取消对 workload 中 pod/pvc template 的默认值注入falseShould not close this feature if it has open
PodUnavailableBudgetDeleteGate启用 PodUnavailableBudget 保护 pod 删除、驱逐true不防护 pod 删除、驱逐
PodUnavailableBudgetUpdateGate启用 PodUnavailableBudget 保护 pod 原地升级false不防护 pod 原地升级
WorkloadSpread启用 WorkloadSpread 管理应用多分区弹性与拓扑部署true不支持 WorkloadSpread
InPlaceUpdateEnvFromMetadata启用 Kruise 原地升级容器当它存在 env from 的 labels/annotations 发生了变化true容器中只有 image 能够原地升级
StatefulSetAutoDeletePVC启用 StatefulSet 自动删除它所创建的 PVCtrueStatefulSet 不会清理 PVC
PreDownloadImageForDaemonSetUpdate启用 DaemonSet 自动为原地升级过程中创建 ImagePullJob 来镜像预热false原地升级无镜像提前预热
PodProbeMarkerGate启用 PodProbeMarker 能力truePodProbeMarker 关闭
SidecarSetPatchPodMetadataDefaultsAllowed允许 SidecarSet Patch 任意 Annotations 到 Pob Object,不再进行白名单校验falseAnnotations不允许随意Patch,需要通过 SidecarSet_PatchPodMetadata_WhiteList 配置
SidecarTerminator启用 SidecarTerminator 能力,在 Job 场景中当主容器退出后,能够停止 Sidecar 容器falseSidecarTerminator 不可用
CloneSetEventHandlerOptimization性能优化,减少 Pod Update 触发的无效 Reconcile 逻辑falseCloneSetEventHandlerOptimization 不启用
ImagePullJobGate启用 ImagePullJob 能力falseImagePullJob 关闭
ResourceDistributionGate启用 ResourceDistribution 能力falseResourceDistribution 关闭
DeletionProtectionForCRDCascadingGate启用 DeletionProtection 针对CRD资源的级联删除能力falseDeletionProtection 针对CRD资源的级联删除能力 关闭

如果你要配置 feature-gate,只要在安装或升级时配置参数即可,比如:

$ helm install kruise https://... --set featureGates="ResourcesDeletionProtection=true\,PreDownloadImageForInPlaceUpdate=true"

如果你希望打开所有 feature-gate 功能,配置参数 featureGates=AllAlpha=true

可选: 中国本地镜像

如果你在中国、并且很难从官方 DockerHub 上拉镜像,那么你可以使用托管在阿里云上的镜像仓库:

$ helm install kruise https://... --set  manager.image.repository=openkruise-registry.cn-shanghai.cr.aliyuncs.com/openkruise/kruise-manager

最佳实践

K3s 安装参数

通常来说 K3s 有着与默认 /var/run 不同的 runtime socket 路径。所以你需要将 daemon.socketLocation 参数设置为你的 K3s 节点上真实的路径(比如 /run/k3s/var/run/k3s/)。

AWS EKS 安装参数

当在 EKS 上使用自定义 CNI 插件(如 Weave 或 Calico)时,默认情况下 webhook 无法被连接到。这是因为在 EKS 上 control plane 不能被配置为运行到一个自定义的 CNI 上,所以 control plane 和 worker 节点的 CNI 是不同的。

可以通过给 webhook 配置 host network 网络来解决这个问题,在 helm install/upgrade 的时候加入 --set manager.hostNetwork=true 参数即可。

支持第三方工具注入Webhook CA证书

FEATURE STATE: Kruise v1.7.0

Kruise 需要 CA 证书来实现 webhook 认证。默认情况下,Kruise 会生成自签名 CA 证书。此外,也可以通过第三方工具来注入和管理,如下:

  1. 安装第三方CA管理工具,比如:cert-manager
  2. 创建 issuer 和 certificate 资源:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: kruise-webhook-certs
# consistent with installation.namespace
namespace: kruise-system
spec:
# where to store the certificates
# cert-manager would generate a secret kruise-system/kruise-webhook-certs with the certificates
# DO NOT CHANGE THE SECRET NAME SINCE KRUISE READ CERTS FROM THIS SECRET
secretName: kruise-webhook-certs
dnsNames:
- kruise-webhook-service.kruise-system.svc
- localhost
issuerRef:
name: selfsigned-kruise
kind: Issuer
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: selfsigned-kruise
namespace: kruise-system
spec:
selfSigned: {}
  1. OpenKruise 需要开启 featureGates=EnableExternalCerts=true,并在 webhookConfiguration 和 CRD 注入对应的 cert annotations:
helm install kruise https://... --set featureGates="EnableExternalCerts=true" --set-json externalCerts.annotations='{"cert-manager.io/inject-ca-from":"kruise-system/kruise-webhook-certs"}'

详情参考:CA Injector - cert manager

结构化日志

FEATURE STATE: Kruise v1.7.0

日志是可观察性的一个重要方面,也是调试的重要工具。 但是 OpenKruise 日志传统上是非结构化的字符串,因此很难进行自动解析,以及任何可靠的后续处理、分析或查询。

从 OpenKruise 1.17 版本开始,我们增加了结构化日志的支持,该日志本身支持(键,值)对和对象引用。为了保持向后兼容性,结构化日志仍将作为字符串输出,其中该字符串包含这些“键” =“值”对的表示。 也可以通过设置 helm install ... --set manager.loggingFormat=json 以 json 格式输出。

如下 InfoS 调用:

klog.V(3).InfoS("SidecarSet updated status success", "sidecarSet", klog.KObj(sidecarSet), "matchedPods", status.MatchedPods,
"updatedPods", status.UpdatedPods, "readyPods", status.ReadyPods, "updateReadyPods", status.UpdatedReadyPods)

将得到下面的日志输出:

I0821 14:22:35.587919       1 sidecarset_processor.go:280] "SidecarSet updated status success" sidecarSet="test-sidecarset" matchedPods=1 updatedPods=1 readyPods=1 updateReadyPods=1

或者 helm install ... --set manager.loggingFormat=json 以 json 格式输出:

{
"ts": 1724239224606.642,
"caller": "sidecarset/sidecarset_processor.go:280",
"msg": "SidecarSet updated status success",
"v": 3,
"sidecarSet": {
"name": "test-sidecarset"
},
"matchedPods": 1,
"updatedPods": 1,
"readyPods": 0,
"updateReadyPods": 0
}

卸载

注意:卸载会导致所有 Kruise 下的资源都会删除掉,包括 webhook configurations, services, namespace, CRDs, CR instances 以及所有 Kruise workload 下的 Pod。 请务必谨慎操作!

卸载使用 helm chart 安装的 Kruise:

$ helm uninstall kruise
release "kruise" uninstalled

Kruise State Metrics

kruise-state-metrics 监听 Kubernetes API 并生成 OpenKruise 有关对象状态的度量指标。它不关注单个 OpenKruise 组件的健康状况,而是关注内部各种对象的健康状况,例如:clonesets,advanced statefulsets and sidecarsets。

# Firstly add openkruise charts repository if you haven't do this.
$ helm repo add openkruise https://openkruise.github.io/charts/

# [Optional]
$ helm repo update

# Install the latest version.
$ helm install kruise openkruise/kruise-state-metrics --version 0.1.0