Skip to content

feat(kruise): support chart 1.8.3#224

Merged
pavlelee merged 2 commits into
mainfrom
issue-a2ed3406-7178-411c-b9c1-6d329d90523f
Jun 16, 2026
Merged

feat(kruise): support chart 1.8.3#224
pavlelee merged 2 commits into
mainfrom
issue-a2ed3406-7178-411c-b9c1-6d329d90523f

Conversation

@pavlelee

@pavlelee pavlelee commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator

incubator/kruise 安装与功能测试报告

1. 测试结论

  • 结论:通过。
  • Helm 安装验证:通过,release kruise-test 最终处于 deployed 状态。
  • 控制面验证:通过,kruise-controller-manager 2/2 Ready,kruise-daemon 1/1 Ready。
  • 功能场景验证:通过,已覆盖 CloneSet、SidecarSet、ImagePullJob 三个用户场景。
  • 测试资源清理:通过,业务测试 namespace 和测试 SidecarSet 已删除。
  • 保留资源:保留 kruise-test release 和 kruise-system 控制面,供后续继续验证。

2. 测试环境

项目
测试日期 2026-06-16
kube context kind-argo
Kubernetes Server v1.34.0
Node argo-control-plane
Node OS Debian GNU/Linux 12
Node Runtime containerd://2.1.3
Node Arch linux/amd64
Helm v3.19
Chart 路径 incubator/kruise
Chart version 1.8.3
App version 1.8.3

备注:本地 kubectl version 的 client 版本字符串为 v0.0.0-master+$Format:%H$,执行 kubectl version 时会出现版本解析提示,但本次 kubectl get/apply/wait/delete/auth 等命令均可正常使用。

3. 镜像与安装参数

Chart 默认镜像为 Docker Hub:

  • openkruise/kruise-manager:v1.8.3
  • openkruise/kruise-helm-hook:v0.1.0

为避免 Docker Hub 限流,并验证前置镜像同步结果,本次安装覆盖为:

manager:
  image:
    repository: mirrors.tencent.com/pavleli/kruise-manager
    tag: v1.8.3
helmHooks:
  image:
    repository: mirrors.tencent.com/pavleli/kruise-helm-hook
    tag: v0.1.0
installation:
  createNamespace: false

镜像验证摘要:

镜像 Digest 可运行平台
mirrors.tencent.com/pavleli/kruise-manager:v1.8.3 sha256:0482722b4e5690010fedcf726a7e41e8876b7aa1de987bdbbdd44e5daefd199e linux/amd64, linux/arm64, linux/ppc64le
mirrors.tencent.com/pavleli/kruise-helm-hook:v0.1.0 sha256:edc7cf9428fd72f9885431a4f0fe4e2e1724f6a8fbd4b592105fbdfdb2a9afdf linux/amd64, linux/arm64, linux/ppc64le

4. 安装前检查

4.1 Chart 静态检查

执行命令:

rtk helm lint incubator/kruise \
  --set manager.image.repository=mirrors.tencent.com/pavleli/kruise-manager \
  --set manager.image.tag=v1.8.3 \
  --set helmHooks.image.repository=mirrors.tencent.com/pavleli/kruise-helm-hook \
  --set helmHooks.image.tag=v0.1.0

结果:

==> Linting incubator/kruise
1 chart(s) linted, 0 chart(s) failed

4.2 模板渲染检查

执行命令:

rtk helm template kruise-test incubator/kruise \
  --namespace kruise-system \
  --set manager.image.repository=mirrors.tencent.com/pavleli/kruise-manager \
  --set manager.image.tag=v1.8.3 \
  --set helmHooks.image.repository=mirrors.tencent.com/pavleli/kruise-helm-hook \
  --set helmHooks.image.tag=v0.1.0

结果:模板渲染成功,输出包含 Namespace、CRD、RBAC、Deployment、DaemonSet、WebhookConfiguration 和 pre-delete hook Job 等资源。

4.3 集群安装前状态

安装前未发现已有 Kruise release:

rtk helm list -A --filter 'kruise|openkruise'

结果:

NAME  NAMESPACE  REVISION  UPDATED  STATUS  CHART  APP VERSION

安装前未发现 kruise-system namespace:

rtk kubectl get ns kruise-system

结果:

Error from server (NotFound): namespaces "kruise-system" not found

5. 安装过程

5.1 初始安装问题

第一次尝试使用 Helm CLI 的 --create-namespace

rtk helm upgrade --install kruise-test incubator/kruise \
  --namespace kruise-system \
  --create-namespace \
  --wait \
  --timeout 5m \
  --set manager.image.repository=mirrors.tencent.com/pavleli/kruise-manager \
  --set manager.image.tag=v1.8.3 \
  --set helmHooks.image.repository=mirrors.tencent.com/pavleli/kruise-helm-hook \
  --set helmHooks.image.tag=v0.1.0

失败信息:

Error: 1 error occurred:
  * namespaces "kruise-system" already exists

根因:

  • Helm CLI 的 --create-namespace 会先创建 release namespace kruise-system
  • Chart 默认 installation.createNamespace=true,模板中也会创建同名 Namespace。
  • 两者叠加导致 Namespace 重复创建。

后续处理过程中还发现一个关联问题:由 Helm CLI 创建的 kruise-system 缺少 chart 期望的标签 control-plane=openkruise,Kruise 的 pod validating webhook 会拦截自身 namespace 内 Pod 删除。当 webhook 后端短暂不可达时,Pod 删除会失败:

failed calling webhook "vpod.kb.io":
Post "https://kruise-webhook-service.kruise-system.svc:443/validate-pod?timeout=30s":
dial tcp ... connect: connection refused

修正方式:

rtk kubectl create namespace kruise-system
rtk kubectl label namespace kruise-system control-plane=openkruise --overwrite

安装时关闭 chart 内 Namespace 创建:

--set installation.createNamespace=false

5.2 最终成功安装命令

rtk helm install kruise-test incubator/kruise \
  --namespace kruise-system \
  --wait \
  --timeout 5m \
  --set installation.createNamespace=false \
  --set manager.image.repository=mirrors.tencent.com/pavleli/kruise-manager \
  --set manager.image.tag=v1.8.3 \
  --set helmHooks.image.repository=mirrors.tencent.com/pavleli/kruise-helm-hook \
  --set helmHooks.image.tag=v0.1.0

结果:

NAME: kruise-test
LAST DEPLOYED: Tue Jun 16 14:44:03 2026
NAMESPACE: kruise-system
STATUS: deployed
REVISION: 1
TEST SUITE: None

6. 安装后健康检查

6.1 Helm release

rtk helm status kruise-test -n kruise-system

结果:

NAME: kruise-test
NAMESPACE: kruise-system
STATUS: deployed
REVISION: 1

6.2 控制面组件

rtk kubectl get deployment kruise-controller-manager -n kruise-system -o wide
rtk kubectl get daemonset kruise-daemon -n kruise-system -o wide

结果:

NAME                        READY   UP-TO-DATE   AVAILABLE   CONTAINERS   IMAGES
kruise-controller-manager   2/2     2            2           manager      mirrors.tencent.com/pavleli/kruise-manager:v1.8.3
NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   CONTAINERS   IMAGES
kruise-daemon   1         1         1       1            1           daemon       mirrors.tencent.com/pavleli/kruise-manager:v1.8.3

Pod 状态:

NAME                                         READY   STATUS    RESTARTS
kruise-controller-manager-5684cfd475-4lx85   1/1     Running   0
kruise-controller-manager-5684cfd475-qqg2b   1/1     Running   0
kruise-daemon-tfqcs                          1/1     Running   0

6.3 Webhook service

rtk kubectl get pods,svc,endpoints -n kruise-system -o wide

结果:

service/kruise-webhook-service   ClusterIP   10.96.79.222   <none>   443/TCP
endpoints/kruise-webhook-service 10.244.0.20:9876,10.244.0.21:9876

说明 webhook service 已有两个 controller-manager backend endpoint。

6.4 CRD

已创建并建立的 Kruise CRD 包括:

advancedcronjobs.apps.kruise.io
broadcastjobs.apps.kruise.io
clonesets.apps.kruise.io
containerrecreaterequests.apps.kruise.io
daemonsets.apps.kruise.io
imagelistpulljobs.apps.kruise.io
imagepulljobs.apps.kruise.io
nodeimages.apps.kruise.io
nodepodprobes.apps.kruise.io
persistentpodstates.apps.kruise.io
podprobemarkers.apps.kruise.io
podunavailablebudgets.policy.kruise.io
resourcedistributions.apps.kruise.io
sidecarsets.apps.kruise.io
statefulsets.apps.kruise.io
uniteddeployments.apps.kruise.io
workloadspreads.apps.kruise.io

7. 用户场景测试

测试 namespace:

rtk kubectl create namespace kruise-user-scenarios

测试 workload 镜像:

  • m.daocloud.io/docker.io/library/busybox:1.36
  • m.daocloud.io/docker.io/library/alpine:3.20

7.1 场景一:CloneSet 创建、扩容与自愈

测试目标:

  • 验证 CloneSet CRD 可被 API Server 接收。
  • 验证 Kruise controller 能创建业务 Pod。
  • 验证扩容后状态正确。
  • 验证删除一个 Pod 后能够自动补齐。

创建 CloneSet:

apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  name: sample-cloneset
spec:
  replicas: 2
  selector:
    matchLabels:
      app: sample-cloneset
  template:
    metadata:
      labels:
        app: sample-cloneset
    spec:
      containers:
      - name: app
        image: m.daocloud.io/docker.io/library/busybox:1.36
        command: ["sh", "-c", "sleep 3600"]

初始结果:

NAME              DESIRED   UPDATED   UPDATED_READY   UPDATED_AVAILABLE   READY   TOTAL
sample-cloneset   2         2         2               2                   2       2

扩容命令:

rtk kubectl scale cloneset sample-cloneset -n kruise-user-scenarios --replicas=3

扩容结果:

NAME              DESIRED   UPDATED   UPDATED_READY   UPDATED_AVAILABLE   READY   TOTAL
sample-cloneset   3         3         3               3                   3       3

自愈验证:

rtk kubectl delete pod sample-cloneset-9phch -n kruise-user-scenarios

删除后状态:

NAME                    READY   STATUS    RESTARTS
sample-cloneset-k46g9   1/1     Running   0
sample-cloneset-lp8wc   1/1     Running   0
sample-cloneset-vhkzp   1/1     Running   0

结论:CloneSet 创建、扩容和 Pod 自愈能力验证通过。

7.2 场景二:SidecarSet 自动注入

测试目标:

  • 验证 cluster-scoped SidecarSet 可创建。
  • 验证 webhook 能在 Pod 创建时注入 sidecar 容器。
  • 验证 SidecarSet 状态能正确统计匹配和 Ready 的 Pod。

创建 SidecarSet:

apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:
  name: sample-sidecarset
spec:
  selector:
    matchLabels:
      kruise-scenario: sidecar-injection
  containers:
  - name: log-sidecar
    image: m.daocloud.io/docker.io/library/busybox:1.36
    command: ["sh", "-c", "sleep 3600"]

创建匹配标签的普通 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sidecar-workload
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sidecar-workload
  template:
    metadata:
      labels:
        app: sidecar-workload
        kruise-scenario: sidecar-injection
    spec:
      containers:
      - name: app
        image: m.daocloud.io/docker.io/library/busybox:1.36
        command: ["sh", "-c", "sleep 3600"]

Deployment 结果:

deployment "sidecar-workload" successfully rolled out
pod/sidecar-workload-86c95bcdc-2llkx condition met

Pod 容器列表:

sidecar-workload-86c95bcdc-2llkx
containers=log-sidecar:m.daocloud.io/docker.io/library/busybox:1.36,app:m.daocloud.io/docker.io/library/busybox:1.36
ready=app:true,log-sidecar:true

Pod 状态:

NAME                               READY   STATUS    RESTARTS
sidecar-workload-86c95bcdc-2llkx   2/2     Running   0

SidecarSet 状态:

NAME                MATCHED   UPDATED   READY
sample-sidecarset   1         1         1

控制器日志关键证据:

operation="CREATE" resource={"group":"","version":"v1","resource":"pods"}
try to inject Container sidecar containerName="log-sidecar"
inject new sidecar container during pod creation
SidecarSet updated status success matchedPods=1 updatedPods=1 readyPods=1

结论:SidecarSet webhook 注入和状态回写验证通过。

7.3 场景三:ImagePullJob 镜像预拉取

测试目标:

  • 验证默认启用的 ImagePullJobGate=true 生效。
  • 验证 ImagePullJob 能调度到指定节点。
  • 验证 kruise-daemon 能执行镜像预拉取并通过 NodeImage 回写状态。

创建 ImagePullJob:

apiVersion: apps.kruise.io/v1alpha1
kind: ImagePullJob
metadata:
  name: sample-imagepulljob
spec:
  image: m.daocloud.io/docker.io/library/alpine:3.20
  imagePullPolicy: IfNotPresent
  selector:
    names:
    - argo-control-plane
  parallelism: 1
  pullPolicy:
    timeoutSeconds: 120
    backoffLimit: 1
  completionPolicy:
    type: Always
    activeDeadlineSeconds: 120
    ttlSecondsAfterFinished: 600

执行状态轮询结果:

desired=1 succeeded=0 failed=0 active=1 message=job is running, progress 0.0%
desired=1 succeeded=1 failed=0 active=0 message=job has completed

最终 ImagePullJob 状态:

NAME                  TOTAL   ACTIVE   SUCCEED   FAILED   MESSAGE
sample-imagepulljob   1       0        1         0        job has completed

NodeImage 关键状态:

image: m.daocloud.io/docker.io/library/alpine
tag: "3.20"
phase: Succeeded
progress: 100

结论:ImagePullJob 控制器和 kruise-daemon 镜像预拉取链路验证通过。

8. 事件与日志证据

8.1 CloneSet 事件

SuccessfulCreate cloneset/sample-cloneset succeed to create pod sample-cloneset-9phch
SuccessfulCreate cloneset/sample-cloneset succeed to create pod sample-cloneset-k46g9
SuccessfulCreate cloneset/sample-cloneset succeed to create pod sample-cloneset-vhkzp
SuccessfulCreate cloneset/sample-cloneset succeed to create pod sample-cloneset-lp8wc

8.2 SidecarSet 事件

Created container: log-sidecar
Started container log-sidecar
Created container: app
Started container app

8.3 控制器日志

CloneSet 状态更新:

To update CloneSet status cloneSet="kruise-user-scenarios/sample-cloneset" replicas=3 ready=3 available=3 updated=3 updatedReady=3

SidecarSet 注入:

begin inject into pod sidecarContainers=[{"name":"log-sidecar",...}]
SidecarSet updated status success sidecarSet="sample-sidecarset" matchedPods=1 updatedPods=1 readyPods=1

Daemon 镜像预拉取相关:

Starting puller controller
Started puller controller successfully
Start syncing name="argo-control-plane"
Finished syncing name="argo-control-plane"

9. 观察项与风险

9.1 Namespace 创建方式

不建议对本 chart 使用以下组合:

helm install ... --namespace kruise-system --create-namespace

同时保留默认:

installation.createNamespace: true

原因:

  • Helm CLI 先创建 release namespace。
  • Chart 又渲染同名 Namespace。
  • 会导致 namespaces "kruise-system" already exists
  • Helm CLI 创建的 namespace 缺少 control-plane=openkruise 标签,后续可能触发 Kruise webhook 自拦截问题。

建议安装方式:

rtk kubectl create namespace kruise-system
rtk kubectl label namespace kruise-system control-plane=openkruise --overwrite
rtk helm install kruise-test incubator/kruise \
  --namespace kruise-system \
  --wait \
  --timeout 5m \
  --set installation.createNamespace=false \
  --set manager.image.repository=mirrors.tencent.com/pavleli/kruise-manager \
  --set manager.image.tag=v1.8.3 \
  --set helmHooks.image.repository=mirrors.tencent.com/pavleli/kruise-helm-hook \
  --set helmHooks.image.tag=v0.1.0

9.2 StorageClass RBAC

controller-manager 日志中出现过非阻塞错误:

Failed to watch *v1.StorageClass: unknown (get storageclasses.storage.k8s.io)

权限检查:

rtk kubectl auth can-i get storageclasses.storage.k8s.io --as=system:serviceaccount:kruise-system:kruise-manager
rtk kubectl auth can-i watch storageclasses.storage.k8s.io --as=system:serviceaccount:kruise-system:kruise-manager

结果:

no
no

当前集群存在默认 StorageClass:

standard (default)   rancher.io/local-path   Delete   WaitForFirstConsumer

影响评估:

  • 本次 CloneSet、SidecarSet、ImagePullJob 场景不依赖 StorageClass watch,测试结果不受影响。
  • 如果后续要验证 StatefulSet、PersistentPodState 或 PVC 相关能力,建议先补充 kruise-manager-rolestorageclasses.storage.k8s.ioget/list/watch 权限,或明确该日志是否为预期降级行为。

9.3 单节点 kind 环境限制

本次环境为单节点 kind 集群:

  • 已覆盖控制器基础能力、webhook 注入、daemon 镜像预拉取。
  • 未覆盖多节点调度、跨 zone 拓扑分布、多架构节点混部、真实生产镜像仓库鉴权等场景。

10. 清理结果

已删除测试业务资源:

rtk kubectl delete sidecarset sample-sidecarset
rtk kubectl delete namespace kruise-user-scenarios --timeout=180s

清理后验证:

Error from server (NotFound): namespaces "kruise-user-scenarios" not found
Error from server (NotFound): sidecarsets.apps.kruise.io "sample-sidecarset" not found

保留 Kruise 安装:

NAME: kruise-test
NAMESPACE: kruise-system
STATUS: deployed
REVISION: 1

保留控制面状态:

NAME                                         READY   STATUS    RESTARTS
kruise-controller-manager-5684cfd475-4lx85   1/1     Running   0
kruise-controller-manager-5684cfd475-qqg2b   1/1     Running   0
kruise-daemon-tfqcs                          1/1     Running   0

11. 最终判定

incubator/kruise 在当前 kind 测试集群中可完成安装,并能正常提供核心 OpenKruise 能力:

  • CloneSet 能创建、扩容并保持期望副本数。
  • SidecarSet 能通过 webhook 对匹配 Pod 自动注入 sidecar。
  • ImagePullJob 能通过 controller 与 kruise-daemon 完成节点镜像预拉取。
  • Helm release、CRD、webhook service、controller-manager、daemon 均处于可用状态。

因此,本次安装和用户场景功能验证判定为通过。

@pavlelee

Copy link
Copy Markdown
Collaborator Author

lgtm

@pavlelee pavlelee merged commit a52071a into main Jun 16, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant