Repository: spidernet-io/spiderpool
Pull request #1667 (2023-04-14 07:17:44)

add kubernetes StatefulSet Start ordinal support
Ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#start-ordinal

Signed-off-by: Icarus9913 [icaruswu66@qq.com](mailto:icaruswu66@qq.com)


Patch:
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index cca4293b7..9b58851cd 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -17,7 +17,7 @@ version about:
 **Describe the bug**
 A clear and concise description of what the bug is.
 
-**How To Reproduce**
+**Hwo To Reproduce**
 Steps to reproduce the issue:
 
 **Expected behavior**
diff --git a/Makefile b/Makefile
index 331f37a01..cc777dd91 100644
--- a/Makefile
+++ b/Makefile
@@ -294,23 +294,19 @@ e2e:
 .PHONY: e2e_init
 e2e_init:
 	for NAME in $(SPIDERPOOL_IMAGES); do \
-			if $(CONTAINER_ENGINE) images $${NAME}:$(TEST_IMAGE_TAG) | grep -q "$(TEST_IMAGE_TAG)" &>/dev/null ; then \
-				echo "test's image $${NAME}:$(TEST_IMAGE_TAG) found" && continue ; \
-			fi ; \
-			if $(CONTAINER_ENGINE) pull $${NAME}:$(TEST_IMAGE_TAG) ; then \
-				echo "Successfully pulled test image $${NAME}:$(TEST_IMAGE_TAG)" && continue ; \
-			fi ; \
+			$(CONTAINER_ENGINE) images $${NAME}:$(TEST_IMAGE_TAG) | grep "$(TEST_IMAGE_TAG)" &>/dev/null  ; \
+			(($$?==0)) && continue ;  \
 			echo "error, failed to find $${NAME}:$(TEST_IMAGE_TAG), please run 'make build_image' firstly " >&2 && false ; \
 		 done
 	$(QUIET)  make -C test kind-init
 
 
-
 .PHONY: e2e_test
 e2e_test:
 	$(QUIET)  make -C test e2e_test
 
 
+
 .PHONY: preview_doc
 preview_doc: PROJECT_DOC_DIR := ${ROOT_DIR}/docs
 preview_doc:
diff --git a/Makefile.defs b/Makefile.defs
index 858fc4333..e991b9370 100644
--- a/Makefile.defs
+++ b/Makefile.defs
@@ -28,10 +28,10 @@ GO_IMAGE_VERSION := $(shell awk -F. '{ z=$$3; if (z == "") z=0; print $$1 "." $$
 CONTAINER_ENGINE?=docker
 
 #----------build-image--------
-SPIDERPOOL_REGISTER ?= ghcr.io
+REGISTER ?= ghcr.io
 GIT_REPO ?= spidernet-io/spiderpool
-SPIDERPOOL_AGENT_IMAGE_NAME := ${SPIDERPOOL_REGISTER}/${GIT_REPO}/spiderpool-agent
-SPIDERPOOL_CONTROLLER_IMAGE_NAME := ${SPIDERPOOL_REGISTER}/${GIT_REPO}/spiderpool-controller
+SPIDERPOOL_AGENT_IMAGE_NAME := ${REGISTER}/${GIT_REPO}/spiderpool-agent
+SPIDERPOOL_CONTROLLER_IMAGE_NAME := ${REGISTER}/${GIT_REPO}/spiderpool-controller
 SPIDERPOOL_IMAGES := $(SPIDERPOOL_AGENT_IMAGE_NAME) ${SPIDERPOOL_CONTROLLER_IMAGE_NAME}
 
 VERSION = $(shell cat $(dir $(lastword $(MAKEFILE_LIST)))/VERSION)
diff --git a/README-zh_CN.md b/README-zh_CN.md
index dbe216160..615a96240 100644
--- a/README-zh_CN.md
+++ b/README-zh_CN.md
@@ -16,7 +16,7 @@
 
 ## Spiderpool 介绍
 
-Spiderpool 是一个 kubernetes 的 IPAM 插件项目， 其针对 underlay 网络的 IP 地址管理需求而设计，为开源社区中的其它 CNI 项目提供了完整的 underlay 网络解决方案。
+Spiderpool 是一个 kubernetes 的 IPAM 插件项目， 其针对 underlay 网络的 IP 地址管理需求而设计，能够为任何兼容第三方 IPAM 插件的 CNI 项目所使用。
 
 为什么希望研发 Spiderpool ? 面对 underlay 网络的很多 IPAM 需求，当前开源社区中并未提供全面、友好、智能的开源解决方案，例如：
 
diff --git a/README.md b/README.md
index c75a1cb06..1e62c1c77 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@
 
 ## Introduction
 
-Spiderpool:an IP Address Management (IPAM) CNI plugin of Kubernetes for managing static ip for underlay network. Spiderpool provides kinds of complete solutions with other CNI projects compatible with third-party IPAM plugins.
+Spiderpool:an IP Address Management (IPAM) CNI plugin of Kubernetes for managing static ip for underlay network. Spiderpool can work well with any CNI project that is compatible with third-party IPAM plugins.
 
 Why Spiderpool? There has not yet been a comprehensive, user-friendly and intelligent open source solution for what underlay networks' IPAMs needs:
 
@@ -178,6 +178,8 @@ If you want to start some Pods with Spiderpool in minutes, refer to [Quick start
 
 * All above features can work in ipv4-only, ipv6-only, and dual-stack scenarios. See [example](./docs/usage/ipv6.md) for details
 
+* Good performance for assigning and release Pod IP, to guarantee the application release, to guarantee disaster recovery for the cluster. See [example](docs/usage/performance.md) for details
+
 ## Other features
 
 * [Metrics](./docs/concepts/metrics.md)
diff --git a/charts/spiderpool/templates/deployment.yaml b/charts/spiderpool/templates/deployment.yaml
index ab8b645a5..d74ea1dce 100644
--- a/charts/spiderpool/templates/deployment.yaml
+++ b/charts/spiderpool/templates/deployment.yaml
@@ -129,7 +129,6 @@ spec:
             path: /v1/runtime/readiness
             port: {{ .Values.spiderpoolController.httpPort }}
             scheme: HTTP
-          initialDelaySeconds: 15
           periodSeconds: {{ .Values.spiderpoolController.healthChecking.readinessProbe.periodSeconds }}
           successThreshold: 1
           failureThreshold: {{ .Values.spiderpoolController.healthChecking.readinessProbe.failureThreshold }}
diff --git a/cmd/spiderpool-agent/cmd/runtime_status.go b/cmd/spiderpool-agent/cmd/runtime_status.go
index 82ca99b5b..f88b360d8 100644
--- a/cmd/spiderpool-agent/cmd/runtime_status.go
+++ b/cmd/spiderpool-agent/cmd/runtime_status.go
@@ -43,6 +43,7 @@ func (g *_httpGetAgentReadiness) Handle(params runtime.GetRuntimeReadinessParams
 		return runtime.NewGetRuntimeReadinessInternalServerError()
 	}
 
+	logger.Info("check spiderpool-agent readiness probe successfully")
 	return runtime.NewGetRuntimeReadinessOK()
 }
 
diff --git a/cmd/spiderpool-controller/cmd/runtime_status.go b/cmd/spiderpool-controller/cmd/runtime_status.go
index 54f97ef25..7c81b26e1 100644
--- a/cmd/spiderpool-controller/cmd/runtime_status.go
+++ b/cmd/spiderpool-controller/cmd/runtime_status.go
@@ -46,7 +46,6 @@ func (g *_httpGetControllerReadiness) Handle(params runtime.GetRuntimeReadinessP
 	}
 
 	if g.Leader.IsElected() {
-		logger.Debug("try to check whether IP GC is healthy")
 		if !g.GCManager.Health() {
 			logger.Warn("failed to check spiderpool-controller readiness probe: the IP GC is still not ready, please wait for a while")
 			return runtime.NewGetRuntimeReadinessInternalServerError()
diff --git a/docs/develop/roadmap.md b/docs/develop/roadmap.md
index 50d6543c2..53115844a 100644
--- a/docs/develop/roadmap.md
+++ b/docs/develop/roadmap.md
@@ -46,7 +46,5 @@ In the future, spiderpool may support all operation of automatical ippool.
 
 * continually improve the performance in kinds of scenes
 
-## egress gateway for underlay solution 
-
 ## assign IP on public cloud platform
 
diff --git a/docs/images/spiderpoolWithName.svg b/docs/images/spiderpoolWithName.svg
deleted file mode 100644
index 36c2358b5..000000000
--- a/docs/images/spiderpoolWithName.svg
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
-  <defs>
-    <style>
-      .cls-1 {
-        fill: none;
-      }
-
-      .cls-2 {
-        fill: #1b1c1d;
-        font-family: Roboto-Bold, Roboto;
-        font-size: 48px;
-      }
-
-      .cls-3 {
-        fill: #33de72;
-      }
-
-      .cls-3, .cls-4 {
-        fill-rule: evenodd;
-      }
-    </style>
-  </defs>
-  <g id="Vertical">
-    <text class="cls-2" transform="translate(139.1 399.06)"><tspan x="0" y="0">Spiderpool</tspan></text>
-    <rect id="Frame" class="cls-1" x="0" width="512" height="512"/>
-  </g>
-  <g id="Horizontal">
-    <g id="Icon_Feature_Spiderpool_v1" data-name="Icon / Feature / Spiderpool_v1">
-      <path id="Combined_Shape" data-name="Combined Shape" class="cls-3" d="M345.21,156.71l-89.21-51.51-89.21,51.51v103.01l89.21,51.51,89.21-51.51v-103.01Zm-17.84,10.3l-71.37-41.2-71.37,41.2v82.41l71.37,41.2,71.37-41.2v-82.41Z"/>
-      <path id="Combined_Shape_2" data-name="Combined Shape_2" class="cls-4" d="M218.78,192.6v-28.31l-13.6,16.28v17.38l16.06,8.98-16.75,8.07v20.81l15.08,16.24v-30.23l36.41-20.17,36.64,20.17v30.23l14.89-16.24v-20.81l-16.55-8.07,15.77-8.98v-17.38l-13.44-16.28v28.31l-13.72,7.39-11.76-6.4,13.5-7.53v-21.78l-12.8-13.67v29.96l-12.49,7.57-12.44-7.57v-29.96l-12.68,13.67v21.78l13.49,7.53-12.07,6.4-13.52-7.39Zm37.19,21.79l-22.48,13.69v26.17l13.2,13.27v-33.03l9.31-5.43,9.39,5.43v33.03l13.05-13.27v-26.17l-22.48-13.69Z"/>
-    </g>
-  </g>
-</svg>
\ No newline at end of file
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index 7f603332c..6a0f3b1bb 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -47,7 +47,6 @@ nav:
       - Calico CNI: usage/get-started-calico.md
       - Weave CNI: usage/get-started-weave.md
       - Multus CNI: usage/multi-interfaces-annotation.md
-      - Kind: usage/get-started-kind.md
   - Installation:
       - Installation: usage/install.md
       - Upgrading: usage/upgrade.md
diff --git a/docs/usage/gc.md b/docs/usage/gc.md
index bc92a2041..c432e5af7 100644
--- a/docs/usage/gc.md
+++ b/docs/usage/gc.md
@@ -8,6 +8,8 @@ The spiderpool owns an IP garbage collection mechanism, it helps to clean up lea
 
 Check k8s deployment `spiderpool-controller` environment property `SPIDERPOOL_GC_IP_ENABLED` whether is already set to `true` or not. (It would be enabled by default)
 
+We can also control whether to trace `Terminating` status phase Pod or not with environment `SPIDERPOOL_GC_TERMINATING_POD_IP_ENABLED`. (It would be enabled by default)
+
 ```shell
 kubectl edit deploy spiderpool-controller -n kube-system
 ```
@@ -22,10 +24,7 @@ Here are several cases that we will release IP:
 
 * pod was `deleted`, except StatefulSet restarts its pod situation.
 
-* pod is `Terminating`, we will release its IPs after `pod.DeletionGracePeriodSeconds`, you can set environment `AdditionalGraceDelay`(default 0 seconds) to add delay duration. you can also determine whether gc `Terminating` status pod or not with environment `SPIDERPOOL_GC_TERMINATING_POD_IP_ENABLED`. (It would be enabled by default).
- There are 2 situation that this env may help: 1. If one node downtime in your cluster, you must reply on the IP GC to release the IPs. 2. In some underlay mode, if you do not release one IP with terminating pod and the new pod cannot fetch available IP to start because of the IP resources shortage.
-
-* pod is `Succeeded` or `Failed` phase, we'll clean the pod's IPs after `pod.DeletionGracePeriodSeconds`, you can set environment `AdditionalGraceDelay`(default 0 seconds) to add delay duration.
+* pod is `Terminating`, `Succeeded` or `Failed` phase, we'll clean the pod's IPs after `pod DeletionGracePeriodSeconds` + `AdditionalGraceDelay`(default 0 seconds).
 
 * SpiderIPPool allocated IP corresponding pod is not exist in the Kubernetes, except StatefulSet restarts its pod situation.
 
diff --git a/docs/usage/get-started-calico-zh_CN.md b/docs/usage/get-started-calico-zh_CN.md
index 2b0437aca..fa556d03b 100644
--- a/docs/usage/get-started-calico-zh_CN.md
+++ b/docs/usage/get-started-calico-zh_CN.md
@@ -28,8 +28,6 @@ helm install spiderpool spiderpool/spiderpool --namespace kube-system
 ```
 
 > Spiderpool 默认 IPv4-Only, 如需启用 IPv6 请参考 [Spiderpool IPv6](https://github.com/spidernet-io/spiderpool/blob/main/docs/usage/ipv6.md)
-> 
-> 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
 
 创建 Pod 的子网(SpiderSubnet):
 
diff --git a/docs/usage/get-started-kind-zh_CN.md b/docs/usage/get-started-kind-zh_CN.md
deleted file mode 100644
index a95459e26..000000000
--- a/docs/usage/get-started-kind-zh_CN.md
+++ /dev/null
@@ -1,130 +0,0 @@
-# Kind Quick Start
-
-[**English**](./get-started-kind.md) | **简体中文**
-
-Kind 是一个使用 Docker 容器节点运行本地 Kubernetes 集群的工具。Spiderpool 提供了安装 Kind 集群的脚本，能快速搭建一套以 Macvlan 为 main CNI 搭配 Multus、Spiderpool 的 Kind 集群，您可以使用它来进行 Spiderpool 的测试与体验。
-
-## 先决条件
-
-* 已安装 [Go](https://go.dev/)
-
-## Kind 上集群部署 Spiderpool
-
-1. 克隆 Spiderpool 代码仓库到本地主机上，并进入 Spiderpool 工程的根目录。
-  
-    ```bash
-    git clone https://github.com/spidernet-io/spiderpool.git && cd spiderpool
-    ```
-
-2. 执行 `make dev-doctor`，检查本地主机上的开发工具是否满足部署 Kind 集群与 Spiderpool 的条件，如果缺少组件会为您自动安装。
-
-
-3. 通过以下方式获取 Spiderpool 的最新镜像。
-
-    ```bash
-    ~# LATEST_IMAGE_TAG=$(curl -s https://api.github.com/repos/spidernet-io/spiderpool/releases | jq -r '.[].tag_name | select(("^v1.[0-9]*.[0-9]*$"))' | head -n 1)
-    ```
-
-4. 执行以下命令，创建 Kind 集群，并为您安装 Multus、Macvlan、Spiderpool。
-
-    ```bash
-    ~# make e2e_init -e TEST_IMAGE_TAG=$LATEST_IMAGE_TAG
-    ```
-
-    注意：如果您是国内用户，您可以使用如下命令，避免拉取 Spiderpool 与 Multus 镜像失败。
-
-    ```bash
-    ~# make e2e_init -e TEST_IMAGE_TAG=$LATEST_IMAGE_TAG -e SPIDERPOOL_REGISTER=ghcr.m.daocloud.io -e IMAGE_MULTUS_REPO=ghcr.m.daocloud.io
-    ```
-
-## 验证安装
-
-在 Spiderpool 工程的根目录下执行如下命令，为 kubectl 配置 Kind 集群的 KUBECONFIG。
-
-```bash
-~# export KUBECONFIG=$(pwd)/test/.cluster/spider/.kube/config
-```
-
-您可以看到如下的内容输出：
-
-```bash
-~# kubectl get nodes 
-NAME                   STATUS   ROLES           AGE     VERSION
-spider-control-plane   Ready    control-plane   2m29s   v1.26.2
-spider-worker          Ready    <none>          2m58s   v1.26.2
-
-~# kubectll get po -n kube-sysem | grep spiderpool
-spiderpool-agent-fmx74                         1/1     Running   0               4m26s
-spiderpool-agent-jzfh8                         1/1     Running   0               4m26s
-spiderpool-controller-79fcd4d75f-n9kmd         1/1     Running   0               4m25s
-spiderpool-controller-79fcd4d75f-scw2v         1/1     Running   0               4m25s
-spiderpool-init                                1/1     Running   0               4m26s
-
-~# kubectl get spidersubnet
-NAME                VERSION   SUBNET                    ALLOCATED-IP-COUNT   TOTAL-IP-COUNT
-default-v4-subnet   4         172.18.0.0/16             253                  253
-default-v6-subnet   6         fc00:f853:ccd:e793::/64   253                  253
-
-~# kubectl get spiderippool
-NAME                VERSION   SUBNET                    ALLOCATED-IP-COUNT   TOTAL-IP-COUNT   DEFAULT   DISABLE
-default-v4-ippool   4         172.18.0.0/16             5                    253              true      false
-default-v6-ippool   6         fc00:f853:ccd:e793::/64   5                    253              true      false
-```
-
-Spiderpool 提供的快速安装 Kind 集群脚本会自动为您创建一个应用，以验证您的 Kind 集群是否能够正常工作，以下是应用的运行状态：
-
-```bash
-~# kubectl get po -l app=test-pod -o wide
-NAME                       READY   STATUS    RESTARTS   AGE     IP             NODE            NOMINATED NODE   READINESS GATES
-test-pod-856f9689d-876nm   1/1     Running   0          5m34s   172.18.40.63   spider-worker   <none>           <none>
-```
-
-您也可以手动创建应用验证 Kind 集群是否能够正常工作，以下命令会创建 1 个副本 Deployment：
-
-```bash
-cat <<EOF | kubectl create -f -
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: test-app
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: test-app
-  template:
-    metadata:
-      labels:
-        app: test-app
-    spec:
-      containers:
-      - name: test-app
-        image: nginx
-        imagePullPolicy: IfNotPresent
-        ports:
-        - name: http
-          containerPort: 80
-          protocol: TCP
-EOF
-```
-
-```bash
-~# kubectl get po -l app=test-app -o wide
-NAME                        READY   STATUS    RESTARTS   AGE     IP              NODE                   NOMINATED NODE   READINESS GATES
-test-app-84d5699474-dbtl5   1/1     Running   0          6m23s   172.18.40.112   spider-control-plane   <none>           <none>
-```
-
-通过测试，Kind 集群一切正常，您可以基于它测试与体验 Spiderpool 的更多功能，请参阅 [快速启动](./docs/usage/install.md)。
-
-## 卸载
-
-* 卸载 Kind 集群
-
-    执行 `make clean` 卸载 Kind 集群。
-
-* 删除测试镜像
-
-    ```bash
-    ~# docker rmi -f $(docker images | grep spiderpool | awk '{print $3}') 
-    ~# docker rmi -f $(docker images | grep multus | awk '{print $3}')
-    ```
diff --git a/docs/usage/get-started-kind.md b/docs/usage/get-started-kind.md
deleted file mode 100644
index 3c10fba55..000000000
--- a/docs/usage/get-started-kind.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# Kind Quick Start
-
-**English** | [**简体中文**](./get-started-kind-zh_CN.md)
-
-kind is a tool for running local Kubernetes clusters using Docker container “nodes”. Spiderpool provides a script for installing a Kind cluster, which allows you to quickly build a set of Kind clusters with Macvlan as the main CNI and Multus and Spiderpool, which you can use to test and experience Spiderpool.
-
-## Prerequisites
-
-* [Go](https://go.dev/) has already been installed.
-
-## Deploying Spiderpool on a Kind cluster
-
-1. Clone the Spiderpool code repository to the local host and go to the root directory of the Spiderpool project.
-
-    ```bash
-    ~# git clone https://github.com/spidernet-io/spiderpool.git && cd spiderpool
-    ```
-
-2. Execute `make dev-doctor` to check that the development tools on the local host meet the conditions for deploying a Kind cluster with Spiderpool, and that the components are automatically installed for you if they are missing.
-
-3. Get the latest image of Spiderpool.
-
-    ```bash
-    ~# LATEST_IMAGE_TAG=$(curl -s https://api.github.com/repos/spidernet-io/spiderpool/releases | jq -r '.[].tag_name | select(("^v1.[0-9]*.[0-9]*$"))' | head -n 1)
-    ```
-
-4. Execute the following command to create a Kind cluster and install Multus, Macvlan, Spiderpool for you.
-    
-    ```bash
-    ~# make e2e_init -e TEST_IMAGE_TAG=$LATEST_IMAGE_TAG
-    ```
-
-    Note: If you are mainland user who is not available to access ghcr.io, you can use the following command to avoid failures in pulling Spiderpool and Multus images.
-
-    ```bash
-    ~# make e2e_init -e TEST_IMAGE_TAG=$LATEST_IMAGE_TAG -e SPIDERPOOL_REGISTER=ghcr.m.daocloud.io -e IMAGE_MULTUS_REPO=ghcr.m.daocloud.io
-    ```
-
-## Check that everything is working
-
-Execute the following command in the root directory of the Spiderpool project to configure KUBECONFIG for the Kind cluster for kubectl.
-
-```bash
-~# export KUBECONFIG=$(pwd)/test/.cluster/spider/.kube/config
-```
-
-It should be possible to observe the following:
-
-```bash
-~# kubectl get nodes 
-NAME                   STATUS   ROLES           AGE     VERSION
-spider-control-plane   Ready    control-plane   2m29s   v1.26.2
-spider-worker          Ready    <none>          2m58s   v1.26.2
-
-~# kubectll get po -n kube-sysem | grep spiderpool
-spiderpool-agent-fmx74                         1/1     Running   0               4m26s
-spiderpool-agent-jzfh8                         1/1     Running   0               4m26s
-spiderpool-controller-79fcd4d75f-n9kmd         1/1     Running   0               4m25s
-spiderpool-controller-79fcd4d75f-scw2v         1/1     Running   0               4m25s
-spiderpool-init                                1/1     Running   0               4m26s
-
-~# kubectl get spidersubnet
-NAME                VERSION   SUBNET                    ALLOCATED-IP-COUNT   TOTAL-IP-COUNT
-default-v4-subnet   4         172.18.0.0/16             253                  253
-default-v6-subnet   6         fc00:f853:ccd:e793::/64   253                  253
-
-~# kubectl get spiderippool
-NAME                VERSION   SUBNET                    ALLOCATED-IP-COUNT   TOTAL-IP-COUNT   DEFAULT   DISABLE
-default-v4-ippool   4         172.18.0.0/16             5                    253              true      false
-default-v6-ippool   6         fc00:f853:ccd:e793::/64   5                    253              true      false
-```
-
-The Quick Install Kind Cluster script provided by Spiderpool will automatically create an application for you to verify that your Kind cluster is working properly and the following is the running state of the application:
-
-```bash
-~# kubectl get po -l app=test-pod -o wide
-NAME                       READY   STATUS    RESTARTS   AGE     IP             NODE            NOMINATED NODE   READINESS GATES
-test-pod-856f9689d-876nm   1/1     Running   0          5m34s   172.18.40.63   spider-worker   <none>           <none>
-```
-
-You can also manually create an application to verify that the cluster is available, the following command will create 1 copy of Deployment:
-
-```bash
-cat <<EOF | kubectl create -f -
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: test-app
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: test-app
-  template:
-    metadata:
-      labels:
-        app: test-app
-    spec:
-      containers:
-      - name: test-app
-        image: nginx
-        imagePullPolicy: IfNotPresent
-        ports:
-        - name: http
-          containerPort: 80
-          protocol: TCP
-EOF
-```
-
-```bash
-~# kubectl get po -l app=test-app -o wide
-NAME                        READY   STATUS    RESTARTS   AGE     IP              NODE                   NOMINATED NODE   READINESS GATES
-test-app-84d5699474-dbtl5   1/1     Running   0          6m23s   172.18.40.112   spider-control-plane   <none>           <none>
-```
-
-As tested, everything works fine with the Kind cluster. You can test and experience more features of Spiderpool based on kind clusters, see [Quick start](./docs/usage/install.md).
-
-## Uninstall
-
-* Uninstall a Kind cluster
-
-    Execute `make clean` to uninstall the Kind cluster.
-
-* Delete test's images
-
-    ```bash
-    ~# docker rmi -f $(docker images | grep spiderpool | awk '{print $3}') 
-    ~# docker rmi -f $(docker images | grep multus | awk '{print $3}')
-    ```
diff --git a/docs/usage/get-started-macvlan-zh_CN.md b/docs/usage/get-started-macvlan-zh_CN.md
index c6d712158..9e4a47ca3 100644
--- a/docs/usage/get-started-macvlan-zh_CN.md
+++ b/docs/usage/get-started-macvlan-zh_CN.md
@@ -122,11 +122,10 @@ Spiderpool 可用作 Underlay 网络场景下提供固定 IP 的一种解决方
 
     helm repo update spiderpool
 
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system
+    helm install spiderpool spiderpool/spiderpool --namespace kube-system \
+        --set feature.enableIPv4=true --set feature.enableIPv6=false 
     ```
 
-    > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
-
 2. 创建 SpiderSubnet 实例。
 
     Macvlan 是以宿主机 eth0 为父接口，因此，需要创建 eth0 底层的 Underlay 子网供 Pod 使用。
diff --git a/docs/usage/get-started-macvlan.md b/docs/usage/get-started-macvlan.md
index 596b60632..34278ee78 100644
--- a/docs/usage/get-started-macvlan.md
+++ b/docs/usage/get-started-macvlan.md
@@ -115,7 +115,8 @@ chmod +x /opt/cni/bin/veth
     ```bash
     helm repo add spiderpool https://spidernet-io.github.io/spiderpool
     helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system
+    helm install spiderpool spiderpool/spiderpool --namespace kube-system \
+        --set feature.enableIPv4=true --set feature.enableIPv6=false 
     ```
 
 2. Create a SpiderSubnet instance.
diff --git a/docs/usage/get-started-sriov-zh_CN.md b/docs/usage/get-started-sriov-zh_CN.md
index b9c1c4a3e..b6a40af26 100644
--- a/docs/usage/get-started-sriov-zh_CN.md
+++ b/docs/usage/get-started-sriov-zh_CN.md
@@ -1,8 +1,8 @@
-# SRIOV Quick Start
+# Quick Start
 
 [**English**](./get-started-sriov.md) | **简体中文**
 
-Spiderpool 可用作 underlay 网络场景下提供固定 IP 的一种解决方案，本文将以 [Multus](https://github.com/k8snetworkplumbingwg/multus-cni)、[Sriov](https://github.com/k8snetworkplumbingwg/sriov-cni) 、[Veth](https://github.com/spidernet-io/plugins)、[Spiderpool](https://github.com/spidernet-io/spiderpool) 为例，搭建一套完整的 Underlay 网络解决方案，该方案能够满足以下各种功能需求：
+Spiderpool 可用作 underlay 网络场景下提供固定 IP 的一种解决方案，本文将以 [Multus](https://github.com/k8snetworkplumbingwg/multus-cni)、[Sriov](https://github.com/k8snetworkplumbingwg/sriov-cni) 、[Veth](https://github.com/spidernet-io/plugins)、[Spiderpool](https://github.com/spidernet-io/spiderpool) 为例，搭建一套完整的 underlay 网络解决方案，该方案能够满足以下各种功能需求：
 
 * 通过简易运维，应用可分配到固定的 Underlay IP 地址
 
@@ -90,7 +90,7 @@ chmod +x /opt/cni/bin/veth
     ```
 
     > resourceName 为 sriov 资源名称，在 configmap 声明后，在 sriov-plugin 生效后，会在 node 上产生一个名为 `intel.com/mlnx_sriov` 的 sriov 资源供 Pod 使用，前缀 `intel.com` 可通过 `resourcePrefix` 字段定义
-    > 具体配置规则参考 [Sriov Configmap](https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin#configurations)
+    >具体配置规则参考 [Sriov Configmap](https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin#configurations)
 
 ## 创建 Sriov VF
 
@@ -107,7 +107,7 @@ chmod +x /opt/cni/bin/veth
     echo 8 > /sys/class/net/enp4s0f0np0/device/sriov_numvfs
     ```
 
-    > 具体配置参考 sriov 官方文档 [Setting up Virtual Functions](https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin/blob/master/docs/vf-setup.md)
+    >具体配置参考 sriov 官方文档 [Setting up Virtual Functions](https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin/blob/master/docs/vf-setup.md)
 
 ## 安装 Sriov Device Plugin
 
@@ -182,7 +182,7 @@ kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/sriov-cn
     EOF
     ```
 
-    > `k8s.v1.cni.cncf.io/resourceName: intel.com/mlnx_sriov` 该 annotations 表示要使用的 sriov 资源名称.
+    > `k8s.v1.cni.cncf.io/resourceName: intel.com/mlnx_sriov` 该annotations 表示要使用的 sriov 资源名称
 
 ## 安装 Spiderpool
 
@@ -191,11 +191,10 @@ kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/sriov-cn
     ```shell
     helm repo add spiderpool https://spidernet-io.github.io/spiderpool
     helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system
+    helm install spiderpool spiderpool/spiderpool --namespace kube-system \
+        --set feature.enableIPv4=true --set feature.enableIPv6=false 
     ```
 
-    > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
-
 2. 创建 SpiderSubnet 实例。
    
     Pod 会从该子网中获取 IP，进行 Underlay 的网络通讯，所以该子网需要与接入的 Underlay 子网对应。
@@ -278,7 +277,7 @@ kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/sriov-cn
 
     > `intel.com/mlnx_sriov`: 该参数表示使用 Sriov 资源。
     > 
-    > `v1.multus-cni.io/default-network`：该 annotation 指定了使用的 Multus 的 CNI 配置。
+    >`v1.multus-cni.io/default-network`：该 annotation 指定了使用的 Multus 的 CNI 配置。
     >
     > 更多 Multus 注解使用请参考 [Multus 注解](https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/docs/quickstart.md)
 
diff --git a/docs/usage/get-started-sriov.md b/docs/usage/get-started-sriov.md
index d88bff39f..52fb58553 100644
--- a/docs/usage/get-started-sriov.md
+++ b/docs/usage/get-started-sriov.md
@@ -191,7 +191,8 @@ kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/sriov-cn
     ```shell
     helm repo add spiderpool https://spidernet-io.github.io/spiderpool
     helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system
+    helm install spiderpool spiderpool/spiderpool --namespace kube-system \
+        --set feature.enableIPv4=true --set feature.enableIPv6=false 
     ```
 
 2. Create a SpiderSubnet instance.
diff --git a/docs/usage/get-started-weave-zh_CN.md b/docs/usage/get-started-weave-zh_CN.md
index bc03488c2..f62ae73fc 100644
--- a/docs/usage/get-started-weave-zh_CN.md
+++ b/docs/usage/get-started-weave-zh_CN.md
@@ -31,8 +31,6 @@
     helm repo add spiderpool https://spidernet-io.github.io/spiderpool
     helm install spiderpool spiderpool/spiderpool --namespace kube-system 
     ```
-    
-    > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
 
     等待 Pod Running， 创建 Pod 的子网(SpiderSubnet):
 
diff --git a/docs/usage/install.md b/docs/usage/install.md
index 114e21630..8d9a786b4 100644
--- a/docs/usage/install.md
+++ b/docs/usage/install.md
@@ -22,8 +22,6 @@ Any CNI project compatible with third-party IPAM plugins, can work well with spi
 
 The following examples are guides to install spiderpool with different CNI:
 
-* [spiderpool with macvlan in Kind](./get-started-kind.md)
-
 * [spiderpool with macvlan CNI](./get-started-macvlan.md)
 
 * [spiderpool with SRIOV CNI](./get-started-sriov.md)
diff --git a/docs/usage/multi-interfaces-annotation.md b/docs/usage/multi-interfaces-annotation.md
index 233badf0a..cd46f05a2 100644
--- a/docs/usage/multi-interfaces-annotation.md
+++ b/docs/usage/multi-interfaces-annotation.md
@@ -11,11 +11,15 @@ Then run a pod with two NICs with IP in different subnets.
 
 ### Set up Spiderpool
 
-Follow the guide [installation](https://github.com/spidernet-io/spiderpool/blob/main/docs/usage/get-started-macvlan.md) to install Spiderpool. 
+Follow the guide [installation](https://github.com/spidernet-io/spiderpool/blob/main/docs/usage/install.md) to install Spiderpool. And Spiderpool also provides a [Veth](https://github.com/spidernet-io/plugins) The plug-in can help some CNIs (such as Macvlan, SR-IOV, etc.) solve the following problems:
+
+* Help the main CNI achieve communication between the Pod and the host to solve issues such as Pod access to clusterIP, and Pod host health checks.
+
+* Automatic coordination of policy routing between multiple NICs in Pod multi-NIC scenarios to resolve multi-NIC communications
 
 ### Set up Multus Configuration
 
-In this example, Macvlan will be used as the main CNI, Create two network-attachment-definitions，The following parameters need to be confirmed:
+Create two network-attachment-definitions，The following parameters need to be confirmed:
 
 * Confirm the host machine parent interface required for Macvlan. This example takes the ens192 and ens224 network cards of the host machine as examples to create a Macvlan sub interface for Pod to use.
 
@@ -46,7 +50,7 @@ subnet-test-ens224   4         10.7.0.1/16   0                    10
 In the following example Yaml, 2 copies of the Deployment are created：
 
 ```shell
-~# kubectl apply -f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/subnet-test-deploy.yaml
+~# kubectl apply -f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/subnet-test-deploy.yaml.yaml
 ```
 
 Eventually, when the Deployment is created, Spiderpool will select random IPs from the specified subnet to create two fixed IP pools to bind to each of the Deployment Pod's two NICs.
@@ -114,7 +118,7 @@ ippool-test-ens192     4         10.6.0.1/16   0                    5
 ippool-test-ens224     4         10.7.0.1/16   0                    5                false     false
 ```
 
-In the following example Yaml, 1 copies of the Deployment are created：
+In the following example Yaml, 2 copies of the Deployment are created：
 
 ```shell
 ~# kubectl apply -f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/ippool-test-deploy.yaml
@@ -166,6 +170,7 @@ default via 10.7.0.1 dev net1
 10.96.0.0/12 via 10.6.168.123 dev veth0
 ```
 
+
 ## Clean up
 
 Clean the relevant resources so that you can run this tutorial again.
@@ -173,10 +178,10 @@ Clean the relevant resources so that you can run this tutorial again.
 ```bash
 kubectl delete \
 -f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/multus-conf.yaml \
--f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/different-segment-ipv4-subnets.yaml \
--f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/subnet-test-deploy.yaml \
--f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/different-segment-ipv4-ippools.yaml \
+-f kubectl apply -f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/different-segment-ipv4-subnets.yaml \
+-f kubectl apply -f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/subnet-test-deploy.yaml.yaml \
+-f kubectl apply -f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/different-segment-ipv4-ippools.yaml \
 -f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/basic/custom-dual-ippool-deploy.yaml \
--f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/ippool-test-deploy.yaml \
+-f kubectl apply -f https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/example/multi-interfaces-annotation/ippool-test-deploy.yaml \
 --ignore-not-found=true
 ```
diff --git a/pkg/gcmanager/gc_manager.go b/pkg/gcmanager/gc_manager.go
index b4ff23718..6db7e7ebd 100644
--- a/pkg/gcmanager/gc_manager.go
+++ b/pkg/gcmanager/gc_manager.go
@@ -173,11 +173,17 @@ func (s *SpiderGC) TriggerGCAll() {
 const waitForCacheSyncTimeout = 5 * time.Second
 
 func (s *SpiderGC) Health() bool {
+	isHealth := true
+
 	ctx, cancelFunc := context.WithTimeout(context.TODO(), waitForCacheSyncTimeout)
 	defer cancelFunc()
 
+	if len(s.leader.GetLeader()) == 0 {
+		logger.Warn("no leader in the current cluster, the IP-GC manager is still not started")
+		return false
+	}
+
 	if s.leader.IsElected() {
-		logger.Debug("try to check pod informer cache sync")
 		if s.informerFactory == nil {
 			logger.Warn("the IP-GC manager pod informer is not ready")
 			return false
@@ -186,10 +192,10 @@ func (s *SpiderGC) Health() bool {
 		waitForCacheSync := s.informerFactory.WaitForCacheSync(ctx.Done())
 		for _, isCacheSync := range waitForCacheSync {
 			if !isCacheSync {
-				return false
+				isHealth = false
 			}
 		}
 	}
 
-	return true
+	return isHealth
 }
diff --git a/pkg/gcmanager/pod_cache.go b/pkg/gcmanager/pod_cache.go
index 7eca89386..bf14eb7b4 100644
--- a/pkg/gcmanager/pod_cache.go
+++ b/pkg/gcmanager/pod_cache.go
@@ -60,13 +60,13 @@ func (p *PodDatabase) DeletePodEntry(namespace, podName string) {
 	if !ok {
 		// already deleted
 		p.Unlock()
-		logger.Sugar().Debugf("PodDatabase already deleted %s/%s", namespace, podName)
+		logger.Sugar().Debugf("PodDatabase already deleted %s", podName)
 		return
 	}
 
 	delete(p.pods, ktypes.NamespacedName{Namespace: namespace, Name: podName})
 	p.Unlock()
-	logger.Sugar().Debugf("delete %s/%s pod cache successfully", namespace, podName)
+	logger.Sugar().Debugf("delete %s pod cache successfully", podName)
 }
 
 func (p *PodDatabase) ListAllPodEntries() []PodEntry {
@@ -131,23 +131,21 @@ func (s *SpiderGC) buildPodEntry(oldPod, currentPod *corev1.Pod, deleted bool) (
 	// TODO(Icarus9913): Replace with method GetPodTopController.
 	ownerRef := metav1.GetControllerOf(currentPod)
 
-	// check StatefulSet pod, we will trace it if its controller StatefulSet object was deleted or decreased its replicas and the pod index was out of the replicas.
-	if s.gcConfig.EnableStatefulSet && ownerRef != nil &&
-		ownerRef.APIVersion == appsv1.SchemeGroupVersion.String() && ownerRef.Kind == constant.KindStatefulSet {
-		isValidStsPod, err := s.stsMgr.IsValidStatefulSetPod(context.TODO(), currentPod.Namespace, currentPod.Name, ownerRef.Kind)
-		if nil != err {
-			return nil, err
-		}
+	// deleted pod
+	if deleted {
+		// check StatefulSet pod, we will trace it if its controller StatefulSet object was deleted or decreased its replicas and the pod index was out of the replicas.
+		if s.gcConfig.EnableStatefulSet && ownerRef != nil && ownerRef.APIVersion == appsv1.SchemeGroupVersion.String() && ownerRef.Kind == constant.KindStatefulSet {
+			isValidStsPod, err := s.stsMgr.IsValidStatefulSetPod(context.TODO(), currentPod.Namespace, currentPod.Name, ownerRef.Kind)
+			if nil != err {
+				return nil, err
+			}
 
-		// StatefulSet pod restarted, no need to trace it.
-		if isValidStsPod {
-			logger.Sugar().Debugf("the StatefulSet pod '%s/%s' just restarts, keep its IPs", currentPod.Namespace, currentPod.Name)
-			return nil, nil
+			// StatefulSet pod restarted, no need to trace it.
+			if isValidStsPod {
+				return nil, nil
+			}
 		}
-	}
 
-	// deleted pod
-	if deleted {
 		podEntry := &PodEntry{
 			PodName:             currentPod.Name,
 			Namespace:           currentPod.Namespace,
@@ -162,6 +160,11 @@ func (s *SpiderGC) buildPodEntry(oldPod, currentPod *corev1.Pod, deleted bool) (
 		podEntry.TracingStopTime = podEntry.TracingStartTime.Add(podEntry.TracingGracefulTime)
 		return podEntry, nil
 	} else {
+		// no need to trace Terminating StatefulSet pod.
+		if ownerRef != nil && ownerRef.APIVersion == appsv1.SchemeGroupVersion.String() && ownerRef.Kind == constant.KindStatefulSet {
+			return nil, nil
+		}
+
 		var podStatus types.PodStatus
 		var isBuildTerminatingPodEntry, isBuildSucceededOrFailedPodEntry bool
 		switch {
@@ -204,7 +207,7 @@ func (s *SpiderGC) buildPodEntry(oldPod, currentPod *corev1.Pod, deleted bool) (
 		if isBuildTerminatingPodEntry {
 			// disable for gc terminating pod
 			if !s.gcConfig.EnableGCForTerminatingPod {
-				logger.Sugar().Debugf("IP gc already turn off 'EnableGCForTerminatingPod' configuration, disacrd tracing pod '%s/%s'", currentPod.Namespace, currentPod.Name)
+				logger.Sugar().Debugf("IP gc already turn off 'EnableGCForTerminatingPod' configuration, disacrd pod '%s/%s'", currentPod.Namespace, currentPod.Name)
 				return nil, nil
 			}
 
diff --git a/pkg/gcmanager/pod_informer.go b/pkg/gcmanager/pod_informer.go
index fe5e44f5f..b09dc8eee 100644
--- a/pkg/gcmanager/pod_informer.go
+++ b/pkg/gcmanager/pod_informer.go
@@ -14,7 +14,7 @@ import (
 
 // startPodInformer will set up k8s pod informer in circle
 func (s *SpiderGC) startPodInformer(ctx context.Context) {
-	logger.Sugar().Infof("try to register pod informer")
+	logger.Sugar().Infof("register pod informer")
 
 	for {
 		select {
@@ -62,17 +62,6 @@ func (s *SpiderGC) startPodInformer(ctx context.Context) {
 		s.informerFactory = informerFactory
 		informerFactory.Start(innerCtx.Done())
 
-		// Let the leader trigger IP GC scan all.
-		// When the spiderpool-controller restarted, it will trigger IP GC scan all first.
-		// If the pod informer not starts and the user delete some pods, this will lead to IP leakage.
-		logger.Debug("try to trigger scan all with leader elected")
-		cacheSync := cache.WaitForCacheSync(innerCtx.Done())
-		if !cacheSync {
-			innerCancel()
-			continue
-		}
-		s.gcSignal <- struct{}{}
-
 		<-innerCtx.Done()
 		logger.Error("k8s pod informer broken")
 	}
diff --git a/pkg/gcmanager/tracePod_worker.go b/pkg/gcmanager/tracePod_worker.go
index 44d556e8d..f7d75c6b1 100644
--- a/pkg/gcmanager/tracePod_worker.go
+++ b/pkg/gcmanager/tracePod_worker.go
@@ -13,7 +13,6 @@ import (
 	"go.uber.org/zap"
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	"github.com/spidernet-io/spiderpool/pkg/constant"
 	"github.com/spidernet-io/spiderpool/pkg/metric"
@@ -110,7 +109,7 @@ func (s *SpiderGC) releaseIPPoolIPExecutor(ctx context.Context, workerIndex int)
 							podCache.Namespace, podCache.PodName, ips, poolName)
 
 						err := s.ippoolMgr.ReleaseIP(ctx, poolName, ips)
-						if client.IgnoreNotFound(err) != nil {
+						if nil != err {
 							isReleaseFailed.Store(true)
 							metric.IPGCFailureCounts.Add(ctx, 1)
 							log.Sugar().Errorf("failed to release pool '%s' IPs '%+v' in SpiderEndpoint '%s/%s', error: %v",
diff --git a/pkg/statefulsetmanager/sts_manager.go b/pkg/statefulsetmanager/sts_manager.go
index b1b872d4c..da854dfe6 100644
--- a/pkg/statefulsetmanager/sts_manager.go
+++ b/pkg/statefulsetmanager/sts_manager.go
@@ -85,6 +85,16 @@ func (sm *statefulSetManager) IsValidStatefulSetPod(ctx context.Context, namespa
 		return false, client.IgnoreNotFound(err)
 	}
 
+	// Ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#start-ordinal
+	if sts.Spec.Ordinals != nil {
+		startIndex := int(sts.Spec.Ordinals.Start)
+		endIndex := startIndex + int(*sts.Spec.Replicas) - 1
+		if startIndex <= replicas && replicas <= endIndex {
+			return true, nil
+		}
+		return false, nil
+	}
+
 	// The Pod controlled by StatefulSet is created or re-created.
 	if replicas <= int(*sts.Spec.Replicas)-1 {
 		return true, nil
diff --git a/pkg/subnetmanager/subnet_manager.go b/pkg/subnetmanager/subnet_manager.go
index f7f12b89e..7fc50b4bb 100644
--- a/pkg/subnetmanager/subnet_manager.go
+++ b/pkg/subnetmanager/subnet_manager.go
@@ -9,7 +9,6 @@ import (
 	"fmt"
 	"net"
 
-	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	apitypes "k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/pointer"
@@ -19,7 +18,6 @@ import (
 
 	"github.com/spidernet-io/spiderpool/pkg/applicationcontroller/applicationinformers"
 	"github.com/spidernet-io/spiderpool/pkg/constant"
-	"github.com/spidernet-io/spiderpool/pkg/event"
 	spiderpoolip "github.com/spidernet-io/spiderpool/pkg/ip"
 	spiderpoolv2beta1 "github.com/spidernet-io/spiderpool/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1"
 	"github.com/spidernet-io/spiderpool/pkg/logutils"
@@ -94,28 +92,13 @@ func (sm *subnetManager) ReconcileAutoIPPool(ctx context.Context, pool *spiderpo
 	if autoPoolProperty.DesiredIPNumber < 0 {
 		return nil, fmt.Errorf("%w: the required IP numbers '%d' is invalid", constant.ErrWrongInput, autoPoolProperty.DesiredIPNumber)
 	}
-
 	log := logutils.FromContext(ctx)
 
-	subnet, err := sm.GetSubnetByName(ctx, subnetName, constant.IgnoreCache)
-	if nil != err {
-		return nil, fmt.Errorf("failed to get SpiderSubnet %s, error: %w", subnetName, err)
-	}
-	if subnet.DeletionTimestamp != nil {
-		return nil, fmt.Errorf("%w: SpiderSubnet '%s' is terminating, we can't reconcile an auto-created IPPool from it", constant.ErrWrongInput, subnet.Name)
-	}
-
 	// check if the pool needs to be created
 	operationCreate := pool == nil
 
 	// check if the given pool's IPs numbers are equal with the desired IP number counts
 	if !operationCreate {
-		if pool.Spec.Subnet != subnet.Spec.Subnet {
-			event.EventRecorder.Eventf(pool, corev1.EventTypeWarning, "ApplicationSubnetChanged",
-				"the corresponding application specified SpiderSubnet changed from %s to %s", pool.Labels[constant.LabelIPPoolOwnerSpiderSubnet], subnetName)
-			return nil, fmt.Errorf("%w: it's invalid to change recoincile auto-created IPPool %s with different subnet SpiderSubnet %s", constant.ErrWrongInput, pool.Name, subnetName)
-		}
-
 		poolIPs, err := spiderpoolip.ParseIPRanges(autoPoolProperty.IPVersion, pool.Spec.IPs)
 		if nil != err {
 			return nil, fmt.Errorf("%w: failed to parse IPPool %s Spec IPs %s: %v", constant.ErrWrongInput, pool.Name, pool.Spec.IPs, err)
@@ -124,7 +107,17 @@ func (sm *subnetManager) ReconcileAutoIPPool(ctx context.Context, pool *spiderpo
 			log.Sugar().Debugf("Auto-created IPPool %s matches the desired IP number %d, no need to reconcile", pool.Name, autoPoolProperty.DesiredIPNumber)
 			return pool, nil
 		}
-	} else {
+	}
+
+	subnet, err := sm.GetSubnetByName(ctx, subnetName, constant.IgnoreCache)
+	if nil != err {
+		return nil, fmt.Errorf("failed to get SpiderSubnet %s, error: %w", subnetName, err)
+	}
+	if subnet.DeletionTimestamp != nil {
+		return nil, fmt.Errorf("%w: SpiderSubnet '%s' is terminating, we can't reconcile an auto-created IPPool from it", constant.ErrWrongInput, subnet.Name)
+	}
+
+	if operationCreate {
 		pool = &spiderpoolv2beta1.SpiderIPPool{
 			ObjectMeta: metav1.ObjectMeta{
 				Name: applicationinformers.SubnetPoolName(podController.Name, autoPoolProperty.IPVersion, autoPoolProperty.IfName, podController.UID),


Test patch:
diff --git a/docs/example/multi-interfaces-annotation/subnet-test-deploy.yaml b/docs/example/multi-interfaces-annotation/subnet-test-deploy.yaml
index 8cfe9b332..cd6d8977d 100644
--- a/docs/example/multi-interfaces-annotation/subnet-test-deploy.yaml
+++ b/docs/example/multi-interfaces-annotation/subnet-test-deploy.yaml
@@ -24,7 +24,6 @@ spec:
               ]
             }
          ]
-        ipam.spidernet.io/ippool-ip-number: '+1'
         v1.multus-cni.io/default-network: kube-system/macvlan-conf-ens192
         k8s.v1.cni.cncf.io/networks: kube-system/macvlan-conf-ens224
       labels:
diff --git a/pkg/statefulsetmanager/sts_manager_test.go b/pkg/statefulsetmanager/sts_manager_test.go
index 5b12fb1f0..ed0a89c74 100644
--- a/pkg/statefulsetmanager/sts_manager_test.go
+++ b/pkg/statefulsetmanager/sts_manager_test.go
@@ -278,6 +278,30 @@ var _ = Describe("StatefulSetManager", Label("sts_manager_test"), func() {
 				Expect(err).NotTo(HaveOccurred())
 				Expect(valid).To(BeTrue())
 			})
+
+			It("invalid pod mismatches the StatefulSet start ordinal", func() {
+				stsT.Spec.Replicas = pointer.Int32(1)
+				stsT.Spec.Ordinals = &appsv1.StatefulSetOrdinals{Start: 2}
+
+				err := tracker.Add(stsT)
+				Expect(err).NotTo(HaveOccurred())
+
+				valid, err := stsManager.IsValidStatefulSetPod(ctx, stsT.Namespace, fmt.Sprintf("%s-%d", stsName, 0), constant.KindStatefulSet)
+				Expect(err).NotTo(HaveOccurred())
+				Expect(valid).To(BeFalse())
+			})
+
+			It("a valid pod matches the StatefulSet start ordinal", func() {
+				stsT.Spec.Replicas = pointer.Int32(1)
+				stsT.Spec.Ordinals = &appsv1.StatefulSetOrdinals{Start: 2}
+
+				err := tracker.Add(stsT)
+				Expect(err).NotTo(HaveOccurred())
+
+				valid, err := stsManager.IsValidStatefulSetPod(ctx, stsT.Namespace, fmt.Sprintf("%s-%d", stsName, 2), constant.KindStatefulSet)
+				Expect(err).NotTo(HaveOccurred())
+				Expect(valid).To(BeTrue())
+			})
 		})
 	})
 })
diff --git a/test/Makefile.defs b/test/Makefile.defs
index 69d8c1bba..dd227270b 100644
--- a/test/Makefile.defs
+++ b/test/Makefile.defs
@@ -50,10 +50,8 @@ E2E_GINKGO_PROCS ?= 4
 E2E_SPIDERPOOL_ENABLE_SUBNET ?= true
 
 #============Image version===========
-IMAGE_MULTUS_REPO ?= ghcr.io
-IMAGE_MULTUS_NAME := ${IMAGE_MULTUS_REPO}/k8snetworkplumbingwg/multus-cni:v3.8-$(ARCH)
-IMAGE_WHEREABOUTS_REPO ?= ghcr.io
-IMAGE_WHEREABOUTS_NAME := ${IMAGE_WHEREABOUTS_REPO}/k8snetworkplumbingwg/whereabouts:latest-$(ARCH)
+IMAGE_MULTUS_NAME := ghcr.io/k8snetworkplumbingwg/multus-cni:v3.8-$(ARCH)
+IMAGE_WHEREABOUTS_NAME := ghcr.io/k8snetworkplumbingwg/whereabouts:latest-$(ARCH)
 TEST_IMAGE_NAME := alpine:latest
 
 #USE_TLS_METHOD := certmanager