Repository: spidernet-io/spiderpool
Pull request #2454 (2023-10-24 09:23:45)

doc: add en allocation
---
name: Pull request
about: Tell us about your contribution
labels: ["pr/release/none-required"]
---

---
## Thanks for contributing !

Before submitting a pull request, make sure you read about our Contribution notice here: <https://spidernet-io.github.io/spiderpool/latest/develop/contributing/>

**What this PR does / why we need it**:

**Which issue(s) this PR fixes**:

**Special notes for your reviewer**:

**make sure your commit is signed off**


weizhoublue: fix the conflict

Patch:
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index cca4293b7..000000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-name: Bug report
-about: Create a report to help us improve
-title: 'software bug'
-labels: issue/bug, issue/not-assign
-assignees: 'Icarus9913, iiiceoo'
-
----
-
-**Describe the version**
-version about:
-1. spiderpool
-2. kubernetes
-3. what CNI and itsversion
-
-
-**Describe the bug**
-A clear and concise description of what the bug is.
-
-**How To Reproduce**
-Steps to reproduce the issue:
-
-**Expected behavior**
-A clear and concise description of what you expected to happen.
-
-**Screenshots and log**
-If applicable, add screenshots and log to help explain your problem.
-
-**Additional context**
-Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml
new file mode 100644
index 000000000..91c059116
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yaml
@@ -0,0 +1,75 @@
+name: Bug Report
+description: Report a bug that you encountered
+labels: ["kind/bug"]
+assignees: ["Icarus9913", "cyclinder"]
+body:
+  - type: markdown
+    attributes:
+      value: |
+
+        Thanks for making this bug report.
+
+        ---
+  - type: input
+    id: spiderpool-version
+    attributes:
+      label: Spiderpool Version
+      description: |
+        [e.g. v0.8.0]
+    validations:
+      required: true
+  - type: dropdown
+    id: type
+    attributes:
+      label: Bug Type
+      multiple: false
+      options:
+        - "IPAM"
+        - "Communication Issue"
+        - "Installation Issue"
+        - "Spiderpool-Controller"
+        - "Spiderpoo-Agent"
+        - "Coordinator"
+        - "Other"
+    validations:
+      required: true
+  - type: input
+    id: main-cni
+    attributes:
+      label: Main CNI
+      description: |
+        The primary CNI used in the deployment (e.g. macvlan,ipvlan,sriov)
+    validations:
+      required: true
+  - type: textarea
+    id: bug-report
+    attributes:
+      label: What happened?
+      description: A clear and concise description of what the bug is.
+    validations:
+      required: true
+  - type: textarea
+    id: exp-behaviour
+    attributes:
+      label: What did you expect to happen?
+      description: a clear and concise description of what you expected to happen.
+    validations:
+      required: true
+  - type: textarea
+    id: reproduce
+    attributes:
+      label: How to reproduce it (as minimally and precisely as possible)
+      description: Make sure that if you follow these steps again yourself the bug happens again.
+      placeholder: |
+        1. Apply the following IPPool and Spidermultusconfig
+        2. Annotate the annotations to Pod
+        3. Show your Spidercoordinator config in your cluster
+    validations:
+      required: true
+  - type: textarea
+    id: add-context
+    attributes:
+      label: Additional Context
+      description: Add any other context about the problem here.
+    validations:
+      required: false
diff --git a/.github/ISSUE_TEMPLATE/ci-failure.md b/.github/ISSUE_TEMPLATE/ci-failure.md
deleted file mode 100644
index 187df8299..000000000
--- a/.github/ISSUE_TEMPLATE/ci-failure.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-name: CI failure
-about: Create a report to help us improve
-title: 'CI failure'
-labels: issue/ci-fail, issue/not-assign
-assignees: 'Icarus9913, iiiceoo'
-
----
-
-Set title to be in the format CI: <test-name>.
-
-Copy-paste the output the test failure.
-
-Upload the zip file generated from that test failure.
-
-Copy-paste the link of the CI build where that test failure has happen.
-
-Include any output from logs that you think may be relevant (to ease GitHub searches).
diff --git a/.github/ISSUE_TEMPLATE/ci-failure.yaml b/.github/ISSUE_TEMPLATE/ci-failure.yaml
new file mode 100644
index 000000000..0383e7f0a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/ci-failure.yaml
@@ -0,0 +1,29 @@
+name: CI failure
+description: Report continuously failing tests or jobs in CI
+labels: ["kind/ci-bug"]
+assignees: ["ty-dc"]
+body:
+  - type: textarea
+    id: jobs
+    attributes:
+      label: Which tests are failing?
+    validations:
+      required: true
+  - type: textarea
+    id: since
+    attributes:
+      label: Since when has it been failing?
+    validations:
+      required: true
+  - type: input
+    id: testgrid
+    attributes:
+      label: Job's Link
+  - type: textarea
+    id: reason
+    attributes:
+      label: Reason for failure (if possible)
+  - type: textarea
+    id: additional
+    attributes:
+      label: Anything else we need to know?
diff --git a/.github/ISSUE_TEMPLATE/doc.md b/.github/ISSUE_TEMPLATE/doc.md
deleted file mode 100644
index 9ef2646e7..000000000
--- a/.github/ISSUE_TEMPLATE/doc.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-name: Documentation issue
-about: documentation is not right
-title: 'documentation issue'
-labels: issue/doc, issue/not-assign
-assignees: 'Icarus9913, iiiceoo'
-
----
-
-**Documentation issue**
-1. miss documentation
-2. documentation go wrong
-
diff --git a/.github/ISSUE_TEMPLATE/doc.yaml b/.github/ISSUE_TEMPLATE/doc.yaml
new file mode 100644
index 000000000..ba44470dd
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/doc.yaml
@@ -0,0 +1,32 @@
+name: Documentation issue
+description: help us improve doc
+labels: kind/doc
+body:
+  - type: dropdown
+    id: opt-doc
+    attributes:
+      label: The Type of Document Issue
+      multiple: true
+      options:
+        - "Lacking"
+        - "Wrong"
+        - "Outdated"
+        - "Other"
+    validations:
+      required: true
+  - type: textarea
+    id: doc
+    attributes:
+      label: What's wrong with this document?
+      placeholder: |
+        the document is outdated
+    validations:
+      required: true
+  - type: input
+    id: doc-path
+    attributes:
+      label: Document Path Or Link
+      placeholder: |
+        https://github.com/spidernet-io/spiderpool/blob/main/README.md
+    validations:
+      required: true
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index bccfa8d2e..000000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,41 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for this project
-title: 'feature'
-labels: issue/feature, issue/not-assign
-assignees: 'Icarus9913, iiiceoo'
-
----
-
-**1 Code requirement**
-
-necessary comment for your additional code , and comment for goDoc
-
-function and variable name must not be at will
-
-do not make huge function
-
-**2 observe opensource license**
-
-announce license at the beginning of file
-
-**3 sign-off your commit**
-
-your commit must be signed off
-
-**4 Is your feature request related to a problem? Please describe.**
-
-A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
-
-**5 Describe the solution you'd like**
-
-A clear and concise description of what you want to happen.
-
-**6 Describe alternatives you've considered**
-
-A clear and concise description of any alternative solutions or features you've considered.
-
-**7 Additional context**
-
-Add any other context or screenshots about the feature request here.
-
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml
new file mode 100644
index 000000000..16bc43a72
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yaml
@@ -0,0 +1,42 @@
+name: Feature Request
+description: Provide supporting details for a feature in development Spiderpool
+labels: ["kind/feature"]
+assignees: ["Icarus9913", "cyclinder"]
+body:
+  - type: markdown
+    attributes:
+      value: |
+
+        Thanks for making this suggestion!
+
+        ___
+  - type: textarea
+    attributes:
+      label: What would you like to be added?
+      description: A clear and concise description of what the problem is.
+      placeholder: I hope Spiderpool could be support...
+    validations:
+      required: true
+  - type: textarea
+    attributes:
+      label: Why is this needed?
+      placeholder: I think this feature can help us...
+  - type: textarea
+    attributes:
+      label: How to implement it (if possible)?
+    validations:
+      required: true
+  - type: textarea
+    attributes:
+      label: Additional context
+      description: Add any other context about the feature request here.
+    validations:
+      required: false
+  - type: checkboxes
+    attributes:
+      label: I've read and agree with the following
+      options:
+        - label: I've checked all open and closed issues and my request is not there.
+          required: true
+        - label: I've checked all open and closed pull requests and my request is not there.
+          required: true
diff --git a/.github/ISSUE_TEMPLATE/usage.md b/.github/ISSUE_TEMPLATE/usage.md
deleted file mode 100644
index 93c55c78c..000000000
--- a/.github/ISSUE_TEMPLATE/usage.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-name: usage issue
-about: no idea how to use
-title: 'usage issue'
-labels: issue/usage, issue/not-assign
-assignees: 'Icarus9913, iiiceoo'
-
----
-
-**usage issue**
-1. doubts about how to use the software
-
diff --git a/.github/ISSUE_TEMPLATE/usage.yaml b/.github/ISSUE_TEMPLATE/usage.yaml
new file mode 100644
index 000000000..5745e2171
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/usage.yaml
@@ -0,0 +1,23 @@
+name: Support
+description: Support request or question relating to Spiderpool
+labels: ["kind/support"]
+assignees: ['ty-dc']
+body:
+  - type: markdown
+    attributes:
+      value: |
+
+        You are welcome to ask us for help, You can join the [#Spiderpool](https://cloud-native.slack.com/messages/spiderpool) 
+        channel on CNCF Slack by requesting an **[invitation](https://slack.cncf.io/)** from CNCF Slack. Or refer to the 
+        [MAINTAINERS.md](https://github.com/spidernet-io/spiderpool/blob/main/MAINTAINERS.md) to find the email addresses 
+        of all maintainers. Feel free to contact them via email to report any issues or ask questions.
+
+        ---
+  - type: textarea
+    id: help
+    attributes:
+      label: What help do you need？
+      placeholder: |
+        I don't know how to start use Spiderpool...
+    validations:
+      required: true
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index f339dac0b..ddfb2709c 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,18 +1,33 @@
----
-name: Pull request
-about: Tell us about your contribution
-labels: ["pr/release/none-required"]
----
+## Thanks for contributing!
 
----
-## Thanks for contributing !
+<!--Before submitting a pull request, make sure you read about our Contribution notice here: <https://spidernet-io.github.io/spiderpool/latest/develop/contributing/>-->
 
-Before submitting a pull request, make sure you read about our Contribution notice here: <https://spidernet-io.github.io/spiderpool/latest/develop/contributing/>
+#### What type of PR is this?
+
+<!--
+Add one of the following kinds:
+
+Required labels:
+
+- release/none 
+- release/bug 
+- release/feature
+
+Optional labels:
+
+- kind/bug
+- kind/feature
+- kind/ci-bug
+- kind/doc
+-->
 
 **What this PR does / why we need it**:
 
 **Which issue(s) this PR fixes**:
+<!--
+*Automatically closes linked issue when PR is merged.
+Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
+-->
+Fixes #
 
 **Special notes for your reviewer**:
-
-**make sure your commit is signed off**
diff --git a/.github/workflows/call-release-chart.yaml b/.github/workflows/call-release-chart.yaml
index ca84aba56..4c3df8e97 100644
--- a/.github/workflows/call-release-chart.yaml
+++ b/.github/workflows/call-release-chart.yaml
@@ -20,6 +20,10 @@ on:
       submit:
         required: true
         type: string
+    outputs:
+      artifact:
+        description: "name of artifact"
+        value: chart_package_artifact
   workflow_dispatch:
     inputs:
       ref:
diff --git a/.github/yamllint-conf.yml b/.github/yamllint-conf.yml
index 8d7794c59..abf5e5f8d 100644
--- a/.github/yamllint-conf.yml
+++ b/.github/yamllint-conf.yml
@@ -12,6 +12,7 @@ ignore: |
   vendor/
   charts/
   test/yamls
+  .github/ISSUE_TEMPLATE
   .licenserc.yaml
 
 rules:
diff --git a/VERSION b/VERSION
index d24a8bed9..48d29d1c6 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-v0.8.0-rc0
\ No newline at end of file
+v0.8.0-rc1
\ No newline at end of file
diff --git a/charts/spiderpool/Chart.yaml b/charts/spiderpool/Chart.yaml
index 6f94d8b56..a3c8cf0be 100644
--- a/charts/spiderpool/Chart.yaml
+++ b/charts/spiderpool/Chart.yaml
@@ -5,11 +5,11 @@ icon: https://raw.githubusercontent.com/spidernet-io/spiderpool/main/docs/images
 # application or library
 type: application
 # no need to modify this version , CI will auto update it with /VERSION
-version: 0.8.0-rc0
+version: 0.8.0-rc1
 # This field is informational, and has no impact on chart version calculations .
 # Leaving it unquoted can lead to parsing issues in some cases
 # no need to modify this version , CI will auto update it with /VERSION
-appVersion: "0.8.0-rc0"
+appVersion: "0.8.0-rc1"
 kubeVersion: ">= 1.16.0-0"
 description: ipam for kubernetes cni
 sources:
diff --git a/charts/spiderpool/README.md b/charts/spiderpool/README.md
index 0e20e3762..45d439f3f 100644
--- a/charts/spiderpool/README.md
+++ b/charts/spiderpool/README.md
@@ -368,29 +368,31 @@ helm install spiderpool spiderpool/spiderpool --wait --namespace kube-system \
 
 ### spiderpoolInit parameters
 
-| Name                                        | Description                                                                                                                 | Value                                           |
-| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
-| `spiderpoolInit.name`                       | the init job for installing default spiderippool                                                                            | `spiderpool-init`                               |
-| `spiderpoolInit.binName`                    | the binName name of spiderpoolInit                                                                                          | `/usr/bin/spiderpool-init`                      |
-| `spiderpoolInit.hostnetwork`                | enable hostnetwork mode of spiderpoolInit pod. Notice, if no CNI available before spiderpool installation, must enable this | `true`                                          |
-| `spiderpoolInit.image.registry`             | the image registry of spiderpoolInit                                                                                        | `ghcr.io`                                       |
-| `spiderpoolInit.image.repository`           | the image repository of spiderpoolInit                                                                                      | `spidernet-io/spiderpool/spiderpool-controller` |
-| `spiderpoolInit.image.pullPolicy`           | the image pullPolicy of spiderpoolInit                                                                                      | `IfNotPresent`                                  |
-| `spiderpoolInit.image.digest`               | the image digest of spiderpoolInit, which takes preference over tag                                                         | `""`                                            |
-| `spiderpoolInit.image.tag`                  | the image tag of spiderpoolInit, overrides the image tag whose default is the chart appVersion.                             | `""`                                            |
-| `spiderpoolInit.image.imagePullSecrets`     | the image imagePullSecrets of spiderpoolInit                                                                                | `[]`                                            |
-| `spiderpoolInit.priorityClassName`          | the priority Class Name for spiderpoolInit                                                                                  | `system-node-critical`                          |
-| `spiderpoolInit.affinity`                   | the affinity of spiderpoolInit                                                                                              | `{}`                                            |
-| `spiderpoolInit.extraArgs`                  | the additional arguments of spiderpoolInit container                                                                        | `[]`                                            |
-| `spiderpoolInit.resources.limits.cpu`       | the cpu limit of spiderpoolInit pod                                                                                         | `200m`                                          |
-| `spiderpoolInit.resources.limits.memory`    | the memory limit of spiderpoolInit pod                                                                                      | `256Mi`                                         |
-| `spiderpoolInit.resources.requests.cpu`     | the cpu requests of spiderpoolInit pod                                                                                      | `100m`                                          |
-| `spiderpoolInit.resources.requests.memory`  | the memory requests of spiderpoolInit pod                                                                                   | `128Mi`                                         |
-| `spiderpoolInit.extraEnv`                   | the additional environment variables of spiderpoolInit container                                                            | `[]`                                            |
-| `spiderpoolInit.securityContext`            | the security Context of spiderpoolInit pod                                                                                  | `{}`                                            |
-| `spiderpoolInit.podAnnotations`             | the additional annotations of spiderpoolInit pod                                                                            | `{}`                                            |
-| `spiderpoolInit.podLabels`                  | the additional label of spiderpoolInit pod                                                                                  | `{}`                                            |
-| `spiderpoolInit.serviceAccount.annotations` | the annotations of spiderpoolInit service account                                                                           | `{}`                                            |
+| Name                                             | Description                                                                                                                 | Value                                           |
+| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
+| `spiderpoolInit.name`                            | the init job for installing default spiderippool                                                                            | `spiderpool-init`                               |
+| `spiderpoolInit.binName`                         | the binName name of spiderpoolInit                                                                                          | `/usr/bin/spiderpool-init`                      |
+| `spiderpoolInit.hostnetwork`                     | enable hostnetwork mode of spiderpoolInit pod. Notice, if no CNI available before spiderpool installation, must enable this | `true`                                          |
+| `spiderpoolInit.image.registry`                  | the image registry of spiderpoolInit                                                                                        | `ghcr.io`                                       |
+| `spiderpoolInit.image.repository`                | the image repository of spiderpoolInit                                                                                      | `spidernet-io/spiderpool/spiderpool-controller` |
+| `spiderpoolInit.image.pullPolicy`                | the image pullPolicy of spiderpoolInit                                                                                      | `IfNotPresent`                                  |
+| `spiderpoolInit.image.digest`                    | the image digest of spiderpoolInit, which takes preference over tag                                                         | `""`                                            |
+| `spiderpoolInit.image.tag`                       | the image tag of spiderpoolInit, overrides the image tag whose default is the chart appVersion.                             | `""`                                            |
+| `spiderpoolInit.image.imagePullSecrets`          | the image imagePullSecrets of spiderpoolInit                                                                                | `[]`                                            |
+| `spiderpoolInit.priorityClassName`               | the priority Class Name for spiderpoolInit                                                                                  | `system-node-critical`                          |
+| `spiderpoolInit.affinity`                        | the affinity of spiderpoolInit                                                                                              | `{}`                                            |
+| `spiderpoolInit.extraArgs`                       | the additional arguments of spiderpoolInit container                                                                        | `[]`                                            |
+| `spiderpoolInit.resources.limits.cpu`            | the cpu limit of spiderpoolInit pod                                                                                         | `200m`                                          |
+| `spiderpoolInit.resources.limits.memory`         | the memory limit of spiderpoolInit pod                                                                                      | `256Mi`                                         |
+| `spiderpoolInit.resources.requests.cpu`          | the cpu requests of spiderpoolInit pod                                                                                      | `100m`                                          |
+| `spiderpoolInit.resources.requests.memory`       | the memory requests of spiderpoolInit pod                                                                                   | `128Mi`                                         |
+| `spiderpoolInit.readinessProbe.failureThreshold` | the failure threshold of startup probe for spiderpool-init health checking                                                  | `30`                                            |
+| `spiderpoolInit.readinessProbe.periodSeconds`    | the period seconds of startup probe for spiderpool-init health checking                                                     | `10`                                            |
+| `spiderpoolInit.extraEnv`                        | the additional environment variables of spiderpoolInit container                                                            | `[]`                                            |
+| `spiderpoolInit.securityContext`                 | the security Context of spiderpoolInit pod                                                                                  | `{}`                                            |
+| `spiderpoolInit.podAnnotations`                  | the additional annotations of spiderpoolInit pod                                                                            | `{}`                                            |
+| `spiderpoolInit.podLabels`                       | the additional label of spiderpoolInit pod                                                                                  | `{}`                                            |
+| `spiderpoolInit.serviceAccount.annotations`      | the annotations of spiderpoolInit service account                                                                           | `{}`                                            |
 
 ### sriov network operator parameters
 
diff --git a/charts/spiderpool/crds/spiderpool.spidernet.io_spiderippools.yaml b/charts/spiderpool/crds/spiderpool.spidernet.io_spiderippools.yaml
index 948e74be3..880338cff 100644
--- a/charts/spiderpool/crds/spiderpool.spidernet.io_spiderippools.yaml
+++ b/charts/spiderpool/crds/spiderpool.spidernet.io_spiderippools.yaml
@@ -273,6 +273,7 @@ spec:
                 type: string
               vlan:
                 default: 0
+                description: 'DEPRECATED: Vlan is deprecated.'
                 format: int64
                 maximum: 4094
                 minimum: 0
diff --git a/charts/spiderpool/crds/spiderpool.spidernet.io_spidersubnets.yaml b/charts/spiderpool/crds/spiderpool.spidernet.io_spidersubnets.yaml
index 41fa46d5c..c44aab216 100644
--- a/charts/spiderpool/crds/spiderpool.spidernet.io_spidersubnets.yaml
+++ b/charts/spiderpool/crds/spiderpool.spidernet.io_spidersubnets.yaml
@@ -87,6 +87,7 @@ spec:
                 type: string
               vlan:
                 default: 0
+                description: 'DEPRECATED: Vlan is deprecated.'
                 format: int64
                 maximum: 4094
                 minimum: 0
diff --git a/charts/spiderpool/templates/daemonset.yaml b/charts/spiderpool/templates/daemonset.yaml
index 8e8eb852d..0aed7d0fe 100644
--- a/charts/spiderpool/templates/daemonset.yaml
+++ b/charts/spiderpool/templates/daemonset.yaml
@@ -108,7 +108,7 @@ spec:
             - "/bin/sh"
             - "-c"
             - |
-              BIN_LIST="multus"
+              ITEM="multus"
               rm -f /host/opt/cni/bin/${ITEM}.old || true
               ( [ -f "/host/opt/cni/bin/${ITEM}" ] && mv /host/opt/cni/bin/${ITEM} /host/opt/cni/bin/${ITEM}.old ) || true
               cp /usr/src/multus-cni/bin/${ITEM} /host/opt/cni/bin/${ITEM}
diff --git a/charts/spiderpool/templates/pod.yaml b/charts/spiderpool/templates/pod.yaml
index e44b0cdb1..806a534f2 100644
--- a/charts/spiderpool/templates/pod.yaml
+++ b/charts/spiderpool/templates/pod.yaml
@@ -59,6 +59,16 @@ spec:
     args:
     {{- toYaml . | trim | nindent 4 }}
     {{- end }}
+    readinessProbe:
+      exec:
+        command:
+        - cat
+        - "/etc/spiderpool/ready"
+      initialDelaySeconds: 15
+      periodSeconds: {{ .Values.spiderpoolInit.readinessProbe.periodSeconds }}
+      successThreshold: 1
+      failureThreshold: {{ .Values.spiderpoolInit.readinessProbe.failureThreshold }}
+      timeoutSeconds: 1
     {{- with .Values.spiderpoolInit.resources }}
     resources:
     {{- toYaml . | trim | nindent 6 }}
@@ -132,6 +142,8 @@ spec:
     {{- if eq .Values.multus.multusCNI.defaultCniCRName "" }}
     - name: SPIDERPOOL_INIT_DEFAULT_CNI_DIR
       value: {{ .Values.global.cniConfHostPath | quote }}
+    - name: SPIDERPOOL_INIT_READINESS_FILE
+      value: "/etc/spiderpool/ready"
     volumeMounts:
       - name: cni
         mountPath: {{ .Values.global.cniConfHostPath }}
diff --git a/charts/spiderpool/values.yaml b/charts/spiderpool/values.yaml
index a079861e0..1f4883b26 100644
--- a/charts/spiderpool/values.yaml
+++ b/charts/spiderpool/values.yaml
@@ -801,6 +801,13 @@ spiderpoolInit:
       ## @param spiderpoolInit.resources.requests.memory the memory requests of spiderpoolInit pod
       memory: 128Mi
 
+  readinessProbe:
+    ## @param spiderpoolInit.readinessProbe.failureThreshold the failure threshold of startup probe for spiderpool-init health checking
+    failureThreshold: 30
+
+    ## @param spiderpoolInit.readinessProbe.periodSeconds the period seconds of startup probe for spiderpool-init health checking
+    periodSeconds: 10
+
   ## @param spiderpoolInit.extraEnv the additional environment variables of spiderpoolInit container
   extraEnv: []
 
diff --git a/cmd/coordinator/cmd/command_add.go b/cmd/coordinator/cmd/command_add.go
index 5c715a013..3efaa9d6c 100644
--- a/cmd/coordinator/cmd/command_add.go
+++ b/cmd/coordinator/cmd/command_add.go
@@ -270,6 +270,29 @@ func CmdAdd(args *skel.CmdArgs) (err error) {
 	}
 	logger.Debug("Get currentRuleTable", zap.Int("ruleTable", c.currentRuleTable))
 
+	allPodVethAddrs, err := networking.IPAddressByName(c.netns, defaultOverlayVethName, c.ipFamily)
+	if err != nil {
+		logger.Error(err.Error())
+		return err
+	}
+
+	for idx := range allPodVethAddrs {
+		copyAddr := allPodVethAddrs[idx]
+		if c.v4PodOverlayNicAddr == nil && copyAddr.IP.To4() != nil {
+			c.v4PodOverlayNicAddr = copyAddr.IPNet
+			continue
+		}
+
+		if c.v6PodOverlayNicAddr == nil && copyAddr.IP.To16() != nil {
+			// for ipv6, maybe kernel require the src must be from the device in
+			// some kernel version.
+			// refer to https://bugzilla.kernel.org/show_bug.cgi?id=107071
+			c.v6PodOverlayNicAddr = nil
+		}
+	}
+
+	logger.Debug("Show the addrs of pod's eth0", zap.Any("v4PodOverlayNicAddr", c.v4PodOverlayNicAddr), zap.Any("v6PodOverlayNicAddr", c.v6PodOverlayNicAddr))
+
 	if err = c.setupHostRoutes(logger); err != nil {
 		logger.Error(err.Error())
 		return err
@@ -280,7 +303,7 @@ func CmdAdd(args *skel.CmdArgs) (err error) {
 		return err
 	}
 
-	if c.tuneMode == ModeUnderlay {
+	if c.tuneMode == ModeUnderlay && c.firstInvoke {
 		if err = c.makeReplyPacketViaVeth(logger); err != nil {
 			logger.Error("failed to makeReplyPacketViaVeth", zap.Error(err))
 			return fmt.Errorf("failed to makeReplyPacketViaVeth: %v", err)
diff --git a/cmd/coordinator/cmd/utils.go b/cmd/coordinator/cmd/utils.go
index bbf9a4e77..93df8dc2a 100644
--- a/cmd/coordinator/cmd/utils.go
+++ b/cmd/coordinator/cmd/utils.go
@@ -28,6 +28,7 @@ type coordinator struct {
 	netns                                       ns.NetNS
 	hostVethHwAddress, podVethHwAddress         net.HardwareAddr
 	currentAddress                              []netlink.Addr
+	v4PodOverlayNicAddr, v6PodOverlayNicAddr    *net.IPNet
 	hostIPRouteForPod                           []net.IP
 }
 
@@ -251,23 +252,30 @@ func (c *coordinator) setupHijackRoutes(logger *zap.Logger, ruleTable int) error
 				return err
 			}
 
-			if nip.To4() != nil && v4Gw == nil {
-				logger.Warn("ignore adding hijack routing table(ipv4), due to ipv4 gateway is nil", zap.String("IPv4 Hijack cidr", hijack))
-				continue
+			var src *net.IPNet
+			if nip.To4() != nil {
+				if v4Gw == nil {
+					logger.Warn("ignore adding hijack routing table(ipv4), due to ipv4 gateway is nil", zap.String("IPv4 Hijack cidr", hijack))
+					continue
+				}
+				src = c.v4PodOverlayNicAddr
 			}
 
-			if nip.To4() == nil && v6Gw == nil {
-				logger.Warn("ignore adding hijack routing table(ipv6), due to ipv6 gateway is nil", zap.String("IPv6 Hijack cidr", hijack))
-				continue
+			if nip.To4() == nil {
+				if v6Gw == nil {
+					logger.Warn("ignore adding hijack routing table(ipv6), due to ipv6 gateway is nil", zap.String("IPv6 Hijack cidr", hijack))
+					continue
+				}
+				src = c.v6PodOverlayNicAddr
 			}
 
-			if err := networking.AddRoute(logger, ruleTable, c.ipFamily, netlink.SCOPE_UNIVERSE, c.podVethName, ipNet, v4Gw, v6Gw); err != nil {
+			if err := networking.AddRoute(logger, ruleTable, c.ipFamily, netlink.SCOPE_UNIVERSE, c.podVethName, src, ipNet, v4Gw, v6Gw); err != nil {
 				logger.Error("failed to AddRoute for hijackCIDR", zap.String("Dst", ipNet.String()), zap.Error(err))
 				return fmt.Errorf("failed to AddRoute for hijackCIDR: %v", err)
 			}
 
 			if c.tuneMode == ModeOverlay && c.firstInvoke {
-				if err := networking.AddRoute(logger, unix.RT_TABLE_MAIN, c.ipFamily, netlink.SCOPE_UNIVERSE, c.podVethName, ipNet, v4Gw, v6Gw); err != nil {
+				if err := networking.AddRoute(logger, unix.RT_TABLE_MAIN, c.ipFamily, netlink.SCOPE_UNIVERSE, c.podVethName, src, ipNet, v4Gw, v6Gw); err != nil {
 					logger.Error("failed to AddRoute for hijackCIDR", zap.String("Dst", ipNet.String()), zap.Error(err))
 					return fmt.Errorf("failed to AddRoute for hijackCIDR: %v", err)
 				}
@@ -291,15 +299,21 @@ func (c *coordinator) setupHostRoutes(logger *zap.Logger) error {
 		// eq: "ip r add <ipAddressOnNode> dev veth0/eth0 table <ruleTable>"
 		for _, hostAddress := range c.hostIPRouteForPod {
 			ipNet := networking.ConvertMaxMaskIPNet(hostAddress)
-			if err = networking.AddRoute(logger, c.currentRuleTable, c.ipFamily, netlink.SCOPE_LINK, c.podVethName, ipNet, nil, nil); err != nil {
+			var src *net.IPNet
+			if hostAddress.To4() != nil {
+				src = c.v4PodOverlayNicAddr
+			} else {
+				src = c.v6PodOverlayNicAddr
+			}
+			if err = networking.AddRoute(logger, c.currentRuleTable, c.ipFamily, netlink.SCOPE_LINK, c.podVethName, src, ipNet, nil, nil); err != nil {
 				logger.Error("failed to AddRoute for ipAddressOnNode", zap.Error(err))
-				return fmt.Errorf("failed to AddRouteTable for ipAddressOnNode: %v", err)
+				return err
 			}
 
 			if c.tuneMode == ModeOverlay && c.firstInvoke {
-				if err = networking.AddRoute(logger, unix.RT_TABLE_MAIN, c.ipFamily, netlink.SCOPE_LINK, c.podVethName, ipNet, nil, nil); err != nil {
+				if err = networking.AddRoute(logger, unix.RT_TABLE_MAIN, c.ipFamily, netlink.SCOPE_LINK, c.podVethName, src, ipNet, nil, nil); err != nil {
 					logger.Error("failed to AddRoute for ipAddressOnNode", zap.Error(err))
-					return fmt.Errorf("failed to AddRouteTable for ipAddressOnNode: %v", err)
+					return err
 				}
 				logger.Debug("Add Route for hostAddress in pod successfully", zap.String("Dst", ipNet.String()))
 			}
@@ -357,7 +371,7 @@ func (c *coordinator) setupHostRoutes(logger *zap.Logger) error {
 
 		// set routes for host
 		// equivalent: ip add  <chainedIPs> dev <hostVethName> table  on host
-		if err = networking.AddRoute(logger, c.hostRuleTable, c.ipFamily, netlink.SCOPE_LINK, c.hostVethName, ipNet, nil, nil); err != nil {
+		if err = networking.AddRoute(logger, c.hostRuleTable, c.ipFamily, netlink.SCOPE_LINK, c.hostVethName, nil, ipNet, nil, nil); err != nil {
 			logger.Error("failed to AddRouteTable for preInterfaceIPAddress", zap.Error(err))
 			return fmt.Errorf("failed to AddRouteTable for preInterfaceIPAddress: %v", err)
 		}
@@ -607,7 +621,14 @@ func (c *coordinator) makeReplyPacketViaVeth(logger *zap.Logger) error {
 				return fmt.Errorf("failed to add rule table with mark: %v", err)
 			}
 
-			if err = networking.AddRoute(logger, c.hostRuleTable, family, netlink.SCOPE_UNIVERSE, c.podVethName, nil, v4Gw, v6Gw); err != nil {
+			var src *net.IPNet
+			if family == netlink.FAMILY_V4 {
+				src = c.v4PodOverlayNicAddr
+			} else {
+				src = c.v6PodOverlayNicAddr
+			}
+
+			if err = networking.AddRoute(logger, c.hostRuleTable, family, netlink.SCOPE_UNIVERSE, c.podVethName, src, nil, v4Gw, v6Gw); err != nil {
 				return err
 			}
 		}
diff --git a/cmd/spiderpool-agent/cmd/crd_manager.go b/cmd/spiderpool-agent/cmd/crd_manager.go
index 9891eb625..2e713ba54 100644
--- a/cmd/spiderpool-agent/cmd/crd_manager.go
+++ b/cmd/spiderpool-agent/cmd/crd_manager.go
@@ -6,12 +6,14 @@ package cmd
 import (
 	"strconv"
 
+	"github.com/go-logr/logr"
 	"k8s.io/apimachinery/pkg/runtime"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	kubevirtv1 "kubevirt.io/api/core/v1"
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
+	controllerruntimelog "sigs.k8s.io/controller-runtime/pkg/log"
 	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
 	spiderpoolv2beta1 "github.com/spidernet-io/spiderpool/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1"
@@ -26,10 +28,13 @@ func init() {
 }
 
 func newCRDManager() (ctrl.Manager, error) {
+	// set logger for controller-runtime framework
+	// The controller-runtime would print debug stack if we do not init the log previously: https://github.com/kubernetes-sigs/controller-runtime/pull/2357
+	ctrl.SetLogger(logr.New(controllerruntimelog.NullLogSink{}))
+
 	config := ctrl.GetConfigOrDie()
 	config.Burst = 100
 	config.QPS = 50
-
 	mgr, err := ctrl.NewManager(config, ctrl.Options{
 		Scheme: scheme,
 		Metrics: metricsserver.Options{
diff --git a/cmd/spiderpool-controller/cmd/crd_manager.go b/cmd/spiderpool-controller/cmd/crd_manager.go
index 5dac7aee3..51bc286da 100644
--- a/cmd/spiderpool-controller/cmd/crd_manager.go
+++ b/cmd/spiderpool-controller/cmd/crd_manager.go
@@ -10,6 +10,7 @@ import (
 	"path"
 	"strconv"
 
+	"github.com/go-logr/logr"
 	multusv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
 	calicov1 "github.com/tigera/operator/pkg/apis/crd.projectcalico.org/v1"
 	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
@@ -19,6 +20,7 @@ import (
 	kubevirtv1 "kubevirt.io/api/core/v1"
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
+	controllerruntimelog "sigs.k8s.io/controller-runtime/pkg/log"
 	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
 	runtimeWebhook "sigs.k8s.io/controller-runtime/pkg/webhook"
 
@@ -37,6 +39,10 @@ func init() {
 }
 
 func newCRDManager() (ctrl.Manager, error) {
+	// set logger for controller-runtime framework
+	// The controller-runtime would print debug stack if we do not init the log previously: https://github.com/kubernetes-sigs/controller-runtime/pull/2357
+	ctrl.SetLogger(logr.New(controllerruntimelog.NullLogSink{}))
+
 	port, err := strconv.Atoi(controllerContext.Cfg.WebhookPort)
 	if err != nil {
 		return nil, err
@@ -45,7 +51,6 @@ func newCRDManager() (ctrl.Manager, error) {
 	config := ctrl.GetConfigOrDie()
 	config.Burst = 200
 	config.QPS = 100
-
 	mgr, err := ctrl.NewManager(config, ctrl.Options{
 		Scheme: scheme,
 		Metrics: metricsserver.Options{
diff --git a/cmd/spiderpool-init/cmd/client.go b/cmd/spiderpool-init/cmd/client.go
index 41ee3a65f..8f75cfe41 100644
--- a/cmd/spiderpool-init/cmd/client.go
+++ b/cmd/spiderpool-init/cmd/client.go
@@ -188,9 +188,9 @@ func (c *CoreClient) WaitPodListReady(ctx context.Context, namespace string, lab
 	var err error
 	noReady := true
 	for noReady {
-		if err = c.List(ctx, &podList, client.MatchingLabels(labels), client.InNamespace(namespace)); err != nil && !apierrors.IsNotFound(err) {
-			logger.Sugar().Errorf("failed to get multus pod lists: %v", err)
-			return err
+		if err = c.List(ctx, &podList, client.MatchingLabels(labels), client.InNamespace(namespace)); err != nil {
+			logger.Sugar().Errorf("failed to get spiderAgent pods: %v, retrying...", err)
+			continue
 		}
 
 		if podList.Items == nil {
@@ -214,5 +214,6 @@ func (c *CoreClient) WaitPodListReady(ctx context.Context, namespace string, lab
 			time.Sleep(interval)
 		}
 	}
+
 	return nil
 }
diff --git a/cmd/spiderpool-init/cmd/config.go b/cmd/spiderpool-init/cmd/config.go
index 11767b067..4d8ebb6c9 100644
--- a/cmd/spiderpool-init/cmd/config.go
+++ b/cmd/spiderpool-init/cmd/config.go
@@ -51,11 +51,13 @@ const (
 	ENVDefaultCNIName         = "SPIDERPOOL_INIT_DEFAULT_CNI_NAME"
 	ENVDefaultCNINamespace    = "SPIDERPOOL_INIT_DEFAULT_CNI_NAMESPACE"
 	ENVDefaultMultusConfigMap = "SPIDERPOOL_INIT_MULTUS_CONFIGMAP"
+	ENVDefaultReadinessFile   = "SPIDERPOOL_INIT_READINESS_FILE"
 )
 
 var (
 	legacyCalicoCniName = "k8s-pod-network"
 	calicoCniName       = "calico"
+	readinessFileName   = "/etc/spiderpool/ready"
 )
 
 type InitDefaultConfig struct {
@@ -91,6 +93,9 @@ type InitDefaultConfig struct {
 	DefaultCNIName      string
 	DefaultCNINamespace string
 	MultusConfigMap     string
+
+	// readiness
+	ReadinessFile string
 }
 
 func NewInitDefaultConfig() InitDefaultConfig {
@@ -282,6 +287,10 @@ func parseENVAsDefault() InitDefaultConfig {
 	config.DefaultCNIName = strings.ReplaceAll(os.Getenv(ENVDefaultCNIName), "\"", "")
 	config.DefaultCNINamespace = strings.ReplaceAll(os.Getenv(ENVDefaultCNINamespace), "\"", "")
 	config.MultusConfigMap = strings.ReplaceAll(os.Getenv(ENVDefaultMultusConfigMap), "\"", "")
+	config.ReadinessFile = strings.ReplaceAll(os.Getenv(ENVDefaultReadinessFile), "\"", "")
+	if config.ReadinessFile == "" {
+		config.ReadinessFile = readinessFileName
+	}
 
 	logger.Sugar().Infof("Init default config: %+v", config)
 
diff --git a/cmd/spiderpool-init/cmd/multus.go b/cmd/spiderpool-init/cmd/multus.go
index db8bb5634..29425d83a 100644
--- a/cmd/spiderpool-init/cmd/multus.go
+++ b/cmd/spiderpool-init/cmd/multus.go
@@ -6,7 +6,8 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"time"
+	"os"
+	"path"
 
 	"github.com/spidernet-io/spiderpool/pkg/multuscniconfig"
 	"github.com/spidernet-io/spiderpool/pkg/utils"
@@ -84,6 +85,23 @@ func InitMultusDefaultCR(ctx context.Context, config *InitDefaultConfig, client
 	if err = restartSpiderAgent(ctx, client, config.AgentName, config.DefaultCNINamespace); err != nil {
 		return err
 	}
+
+	logger.Sugar().Infof("successfully restart spiderpool-agent")
+	return nil
+}
+
+func makeReadinessReady(config *InitDefaultConfig) error {
+	// tell readness by writing to the file that the spiderpool is ready
+	readinessDir := path.Dir(config.ReadinessFile)
+	err := os.MkdirAll(readinessDir, 0644)
+	if err != nil {
+		return err
+	}
+
+	if err = os.WriteFile(config.ReadinessFile, []byte("ready"), 0777); err != nil {
+		return err
+	}
+	logger.Sugar().Infof("success to make spiderpool-init pod's readiness to ready")
 	return nil
 }
 
@@ -122,7 +140,6 @@ func restartSpiderAgent(ctx context.Context, client *CoreClient, name, ns string
 		return err
 	}
 
-	time.Sleep(3 * time.Second)
 	if err = client.WaitPodListReady(ctx, ns, spiderAgent.Spec.Template.Labels); err != nil {
 		return err
 	}
diff --git a/cmd/spiderpool-init/cmd/root.go b/cmd/spiderpool-init/cmd/root.go
index cd9cd918d..043872d97 100644
--- a/cmd/spiderpool-init/cmd/root.go
+++ b/cmd/spiderpool-init/cmd/root.go
@@ -150,7 +150,11 @@ func Execute() {
 		logger.Fatal(err.Error())
 	}
 
-	logger.Info("Finish init")
-	// Wait for helm --wait.
+	if err = makeReadinessReady(&config); err != nil {
+		logger.Fatal(err.Error())
+	}
+
+	// helm wait
 	time.Sleep(300 * time.Second)
+	logger.Info("Finish init")
 }
diff --git a/docs/concepts/ipam-zh_CN.md b/docs/concepts/ipam-zh_CN.md
index a004fb157..9b3be281b 100644
--- a/docs/concepts/ipam-zh_CN.md
+++ b/docs/concepts/ipam-zh_CN.md
@@ -104,7 +104,7 @@ Underlay 网络方案的实施，有两种典型的场景：一种是集群部
 
 - 候选池排序：对于多候选池，Spiderpool 根据 SpiderIPPool 对象中的优先级规则对这些候选者进行排序，然后按顺序从有空闲 IP 的 IP 池中开始选择 IP 地址进行分配。
 
-### 获取候选池
+#### 获取候选池
 
 Spiderpool 提供多种池选择规则，在为 Pod 分配 IP 地址时，会严格遵守 **高优先级到低优先级** 的池选择规则。以下规则按照从 **高优先级到低优先级** 的顺序列出，如果同时存在下面的多个规则，前一个规则将 **覆盖** 后一个规则。
 
@@ -128,7 +128,7 @@ Spiderpool 提供多种池选择规则，在为 Pod 分配 IP 地址时，会严
 
     在 SpiderIPPool CR 对象中，可以通过将 **spec.default** 字段设置为 `true`，将池设置为集群默认 IPPool，默认为 `false`。详细信息请参考[集群默认 IPPool](../reference/crd-spiderippool.md)
 
-### 过滤候选池
+#### 过滤候选池
 
 通过上述的池选择规则，获得 IPv4 和 IPv6 的 IPPool 候选后，Spiderpool 会根据以下规则进行过滤，了解哪个候选 IPPool 可用。
 
@@ -150,7 +150,7 @@ Spiderpool 提供多种池选择规则，在为 Pod 分配 IP 地址时，会严
 
 - IPPool 的可用 IP 资源被耗尽，则该 IPPool 也将被过滤。
 
-### 候选池排序
+#### 候选池排序
 
 过滤候选池后，可能仍存在多个候选池，Spiderpool 会进一步使用自定义优先级规则对这些候选者进行排序，然后按顺序从有空闲 IP 的 IP 池中开始选择 IP 地址进行分配。
 
diff --git a/docs/concepts/ipam.md b/docs/concepts/ipam.md
index 0e188b081..8cac170af 100644
--- a/docs/concepts/ipam.md
+++ b/docs/concepts/ipam.md
@@ -88,52 +88,79 @@ Any CNI project compatible with third-party IPAM plugins can work well with Spid
 
 ### IP Allocation Algorithm
 
-When a pod is creating, it will follow steps below to get IP allocations.
+When creating a Pod, it will follow the steps below to get IP allocations.The lifecycle of IP allocation involves three major stages: `candidate pool acquisition`, `candidate pool filtering`, and `candidate pool sorting`.
 
-1. Get all IPPool candidates.
+- Candidate pool acquisition: Spiderpool follows a strict rule of selecting pools from **high to low priority**. It identifies all pools that match **the high priority rules** and marks them as candidates for further consideration.
 
-    For which IPPool is used by a pod, the following rules are listed from **high to low priority** which means the previous rule would **override** the latter rule.
+- Candidate pool filtering: Spiderpool applies filtering mechanisms such as affinity to carefully select the appropriate candidate pools from the available options. This ensures that specific requirements or complex usage scenarios are satisfied.
 
-    * SpiderSubnet annotation. `ipam.spidernet.io/subnets` and `ipam.spidernet.io/subnet` will choose to use auto-created ippool if the SpiderSubnet feature is enabled. See [SpiderSubnet](../usage/spider-subnet.md) for details.
-    * Honor pod annotation. `ipam.spidernet.io/ippools" and "ipam.spidernet.io/ippool` could be used to specify an ippool. See [Pod Annotation](../reference/annotation.md) for details.
-    * Namespace annotation. `ipam.spidernet.io/defaultv4ippool` and `ipam.spidernet.io/defaultv6ippool` could be used to specify an ippool. See [namespace annotation](../reference/annotation.md) for details.
-    * CNI configuration file. It can be set to `default_ipv4_ippool` and `default_ipv6_ippool` in the CNI configuration file. See [configuration](../reference/plugin-ipam.md) for details.
-    * Cluster default IPPool. We can set SpiderIPPool CR object with `default` property, in which we'll regard it as a default pool in cluster.  See [configuration](../reference/crd-spiderippool.md) for details.
+- Candidate pool sorting: in cases where multiple candidate pools exist, Spiderpool sorts them based on the priority rules defined in the SpiderIPPool object. IP addresses are then allocated sequentially, starting from the pool with available addresses.
 
-2. Filter valid IPPool candidates.
+#### Candidate Pool Acquisition
 
-    After getting IPv4 and IPv6 IPPool candidates, it looks into each IPPool and figures out whether it meets following rules, and learns which candidate IPPool is available.
+Spiderpool offers a variety of pool selection rules when assigning IP addresses to Pods. The selection process strictly adheres to a **high to low priority** order. The following rules are listed in **descending order of priority**, and if multiple rules apply at the same time, the preceding rule will **overwrite** the subsequent one.
 
-    * Filter terminating IPPools.
-    * The `disable` field of the IPPool is `false`. This property means the IPPool is not available to be used.
-    * Check `IPPool.Spec.NodeName` and `IPPool.Spec.NodeAffinity` properties whether match the scheduled node of the pod or not. If not match, this IPPool would be filtered. (`NodeName` has higher priority than `NodeAffinity`)
-    * Check `IPPool.Spec.NamespaceName` and `IPPool.Spec.NamespaceAffinity` properties whether match the namespace of the pod or not. If not match, this IPPool would be filtered. (`NamespaceName` has higher priority than `NamespaceAffinity`)
-    * The `IPPool.Spec.PodAffinity` field of the IPPool must meet the pod
-    * Check `IPPool.Spec.MultusName` properties whether match the pod current NIC Multus configuration or not. If not match, this IPPool would be filtered.
-    * The available IP resource of the IPPool is not exhausted
+- The 1st priority: SpiderSubnet annotation
 
-3. Sort IPPool candidates.
+    The SpiderSubnet resource represents a collection of IP addresses. When an application requires a fixed IP address, the application administrator needs to inform their platform counterparts about the available IP addresses and routing attributes. However, as they belong to different operational departments, this process becomes cumbersome, resulting in complex workflows for creating each application. To simplify this, Spiderpool's SpiderSubnet feature automatically allocates IP addresses from subnets to IPPool and assigns fixed IP addresses to applications. This greatly reduces operational costs. When creating an application, you can use the `ipam.spidernet.io/subnets` or `ipam.spidernet.io/subnet` annotation to specify the Subnet. This allows for the automatic creation of an IP pool by randomly selecting IP addresses from the subnet, which can then be allocated as fixed IPs for the application. For more details, please refer to [SpiderSubnet](../usage/spider-subnet.md).
 
-   We'll sort these IPPool candidates with our custom priority rules, then the IPAM prefers allocating IP addresses from the candidates in sequence.
+- The 2nd priority: SpiderIPPool annotation
 
-   * The IPPool resource with `IPPool.Spec.PodAffinity` property has the highest priority.
-   * The IPPool resource with `IPPool.Spec.NodeName` or `IPPool.Spec.NodeAffinity` property has the second-highest priority.
-   * The IPPool resource with `IPPool.Spec.NamespaceName` or `IPPool.Spec.NamespaceAffinity` property has the second-highest priority.
-   * The IPPool resource with `IPPool.Spec.MultusName` property has the lowest priority.
+    Different IP addresses within a Subnet can be stored in separate instances of IPPool (Spiderpool ensures that there is no overlap between the address sets of IPPools). The size of the IP collection in SpiderIPPool can vary based on requirements. This design feature is particularly beneficial when dealing with limited IP address resources in the Underlay network. When creating an application, the SpiderIPPool annotation `ipam.spidernet.io/ippools` or `ipam.spidernet.io/ippool` can be used to bind different IPPools or share the same IPPool. This allows all applications to share the same Subnet while maintaining "micro-isolation". For more details, please refer to [SpiderIPPool annotation](../reference/annotation.md).
 
-   > Notice: here are some simple instance to describe this rule.
-   >
-   > 1. *IPPoolA* with properties `IPPool.Spec.PodAffinity` and `IPPool.Spec.NodeName` has higher priority than *IPPoolB* with single affinity property `IPPool.Spec.PodAffinity`.
-   > 2. *IPPoolA* with single property `IPPool.Spec.PodAffinity` has higher priority than *IPPoolB* with properties `IPPool.Spec.NodeName` and `IPPool.Spec.NamespaceName`.
-   > 3. *IPPoolA* with properties `IPPool.Spec.PodAffinity` and `IPPool.Spec.NodeName` has higher priority than *IPPoolB* with properties `IPPool.Spec.PodAffinity`,`IPPool.Spec.NamespaceName` and `IPPool.Spec.MultusName`.
+- The 3th priority: namespace default IP pool
 
-4. Assign IP from valid IPPool candidates.
+    By setting the annotation `ipam.spidernet.io/default-ipv4-ippool` or `ipam.spidernet.io/default-ipv6-ippool` in the namespace, you can specify the default IP pool. When creating an application within that tenant, if there are no other higher-priority pool rules, it will attempt to allocate an IP address from the available candidate pools for that tenant. For more details, please refer to [Namespace Annotation](../reference/annotation.md).
 
-    When trying to assign IP from the IPPool candidates, it follows rules as below.
+- The fourth priority: CNI configuration file
 
-    * The IP is not reserved by the "exclude_ips" field of the IPPool and all ReservedIP instances
+    The global CNI default pool can be set by configuring the `default_ipv4_ippool` and `default_ipv6_ippool` fields in the CNI configuration file. Multiple IP pools can be defined as alternative pools. When an application uses this CNI configuration network and invokes Spiderpool, each application replica is sequentially assigned an IP address according to the order of elements in the "IP pool array". In scenarios where nodes belong to different regions or data centers, if the node where an application replica scheduled matches the node affinity rule of the first IP pool, the Pod obtains an IP from that pool. If it doesn't meet the criteria, Spiderpool attempts to assign an IP from the alternative pools until all options have been exhausted. For more information, please refer to [CNI Configuration](../reference/plugin-ipam.md).
 
-> Notice: If the pod belongs to StatefulSet, it would be assigned IP addresses with the upper rules firstly. And it will try to reuse the last allocated IP addresses once the pod 'restarts'. 
+- The fifth priority: cluster's default IP pool
+
+    Within the SpiderIPPool CR object, setting the **spec.default** field to `true` designates the pool as the cluster's default IP pool (default value is `false`). For more information, please refer to [Cluster's Default IP Pool](../reference/crd-spiderippool.md).
+
+#### Candidate Pool Filtering
+
+To determine the availability of candidate IP pools for IPv4 and IPv6, Spiderpool filters them using the following rules:
+
+- IP pools in the `terminating` state are filtered out.
+
+- The `spec.disable` field of an IP pool indicates its availability. A value of `false` means the IP pool is not usable.
+
+- Check if the `IPPool.Spec.NodeName` and `IPPool.Spec.NodeAffinity` match the Pod's scheduling node. Mismatching values result in filtering out the IP pool.
+
+- Check if the `IPPool.Spec.NamespaceName` and `IPPool.Spec.NamespaceAffinity` match the Pod's namespace. Mismatching values lead to filtering out the IP pool.
+
+- Check if the `IPPool.Spec.NamespaceName` matches the Pod's `matchLabels`. Mismatching values lead to filtering out the IP pool.
+
+- Check if the `IPPool.Spec.MultusName` matches the current NIC Multus configuration of the Pod. If there is no match, the IP pool is filtered out.
+
+- Check if all IPs within the IP pool are included in the IPPool instance's `exclude_ips` field. If it is, the IP pool is filtered out.
+
+- Check if all IPs in the pool are reserved in the ReservedIP instance. If it is, the IP pool is filtered out.
+
+- An IP pool will be filtered out if its available IP resources are exhausted.
+
+#### Candidate Pool Sorting
+
+After filtering the candidate pools, Spiderpool may have multiple pools remaining. To determine the order of IP address allocation, Spiderpool applies custom priority rules to sort these candidates. IP addresses are then selected from the pools with available IPs in the following manner:
+
+- IP pool resources with the `IPPool.Spec.PodAffinity` property are given the highest priority.
+
+- IPPool resources with either the `IPPool.Spec.NodeName` or `IPPool.Spec.NodeAffinity` property are given the secondary priority. The `NodeName` takes precedence over `NodeAffinity`.
+
+- Following that, IP pool resources with either the `IPPool.Spec.NamespaceName` or `IPPool.Spec.NamespaceAffinity` property maintain the third-highest priority. The `NamespaceName` takes precedence over `NamespaceAffinity`.
+
+- IP pool resources with the `IPPool.Spec.MultusName` property receive the lowest priority.
+
+> Here are some simple instances to describe this rule.
+>
+> 1. *IPPoolA* with properties `IPPool.Spec.PodAffinity` and `IPPool.Spec.NodeName` has higher priority than *IPPoolB* with single affinity property `IPPool.Spec.PodAffinity`.
+> 2. *IPPoolA* with single property `IPPool.Spec.PodAffinity` has higher priority than *IPPoolB* with properties `IPPool.Spec.NodeName` and `IPPool.Spec.NamespaceName`.
+> 3. *IPPoolA* with properties `IPPool.Spec.PodAffinity` and `IPPool.Spec.NodeName` has higher priority than *IPPoolB* with properties `IPPool.Spec.PodAffinity`,`IPPool.Spec.NamespaceName` and `IPPool.Spec.MultusName`.
+>
+> If a Pod belongs to StatefulSet, IP addresses that meet the aforementioned rules will be allocated with priority. When a Pod is restarted, it will attempt to reuse the previously assigned IP address.
 
 ## IP Garbage Collection
 
@@ -146,19 +173,19 @@ But on cases, it may go wrong and IP of IPAM database is still marked as used by
 
 when some errors happened, the CNI plugin is not called correctly when pod deletion. This could happen like cases:
 
-* When a CNI plugin is called, its network communication goes wrong and fails to release IP.
+- When a CNI plugin is called, its network communication goes wrong and fails to release IP.
 
-* The container runtime goes wrong and fails to call CNI plugin.
+- The container runtime goes wrong and fails to call CNI plugin.
 
-* A node breaks down and then always can not recover, the api-server makes pods of the breakdown node to be `deleting` status, but the CNI plugin fails to be called.
+- A node breaks down and then always can not recover, the api-server makes pods of the breakdown node to be `deleting` status, but the CNI plugin fails to be called.
 
 BTW, this fault could be simply simulated by removing the CNI binary on a host when pod deletion.
 
 This issue will make a bad result:
 
-* the new pod may fail to run because the expected IP is still occupied.
+- the new pod may fail to run because the expected IP is still occupied.
 
-* the IP resource is exhausted gradually although the actual number of pods does not grow.
+- the IP resource is exhausted gradually although the actual number of pods does not grow.
 
 Some CNI or IPAM plugins could not handle this issue. For some CNIs, the administrator self needs to find the IP with this issue and use a CLI tool to reclaim them.
 For some CNIs, it runs an interval job to find the IP with this issue and not reclaim them in time. For some CNIs, there is not any mechanism at all to fix the IP issue.
@@ -174,11 +201,11 @@ The spiderpool controller takes charge of this responsibility. For more details,
 
 To prevent IP from leaking when the ippool resource is deleted, Spiderpool has some rules:
 
-* For an ippool, if IP still taken by pods, Spiderpool uses webhook to reject deleting request of the ippool resource.
+- For an ippool, if IP still taken by pods, Spiderpool uses webhook to reject deleting request of the ippool resource.
 
-* For a deleting ippool, the IPAM plugin will stop assigning IP from it, but could release IP from it.
+- For a deleting ippool, the IPAM plugin will stop assigning IP from it, but could release IP from it.
 
-* The ippool sets a finalizer by the spiderpool controller once it is created. After the ippool goes to be `deleting` status,
+- The ippool sets a finalizer by the spiderpool controller once it is created. After the ippool goes to be `deleting` status,
   the spiderpool controller will remove the finalizer when all IPs in the ippool are free, then the ippool object will be deleted.
 
 ### SpiderEndpoint garbage collection
@@ -198,8 +225,8 @@ The IP addresses assigned to Pods are recorded in IPAM, but these Pods no longer
 
 When `deleting Pod` in the cluster, but due to problems such as `network exception` or `cni binary crash`, the call to `cni delete` fails, resulting in the IP address not being reclaimed by cni.
 
-* In failure scenarios such as `cni delete failure`, if a Pod that has been assigned an IP is destroyed, but the IP address is still recorded in the IPAM, a phenomenon of zombie IP is formed. For this kind of problem, Spiderpool will automatically recycle these zombie IP addresses based on the cycle and event scanning mechanism.
+- In failure scenarios such as `cni delete failure`, if a Pod that has been assigned an IP is destroyed, but the IP address is still recorded in the IPAM, a phenomenon of zombie IP is formed. For this kind of problem, Spiderpool will automatically recycle these zombie IP addresses based on the cycle and event scanning mechanism.
 
 After a node goes down unexpectedly, the Pod in the cluster is permanently in the `deleting` state, and the IP address occupied by the Pod cannot be released.
 
-* For a Pod in `Terminating` state, Spiderpool will automatically release its IP address after the Pod's `spec.terminationGracePeriodSecond`. This feature can be controlled by the environment variable `SPIDERPOOL_GC_TERMINATING_POD_IP_ENABLED`. This capability can be used to solve the failure scenario of `unexpected node downtime`.
+- For a Pod in `Terminating` state, Spiderpool will automatically release its IP address after the Pod's `spec.terminationGracePeriodSecond`. This feature can be controlled by the environment variable `SPIDERPOOL_GC_TERMINATING_POD_IP_ENABLED`. This capability can be used to solve the failure scenario of `unexpected node downtime`.
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index e517c7845..3ada4a805 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -46,21 +46,21 @@ markdown_extensions:
 
 nav:
   - README.md
-  - GetStarted: usage/readme.md
+  - Get Started: usage/readme.md
   - Installation:
-      - Underlay installation:
+      - Underlay Installation:
           - Calico: usage/install/underlay/get-started-calico.md
           - Weave: usage/install/underlay/get-started-weave.md
           - Macvlan: usage/install/underlay/get-started-kind.md
           - Ovs: usage/install/underlay/get-started-ovs.md
-          - SRIOV: usage/install/underlay/get-started-sriov.md
-      - Overlay installation:
+          - SR-IOV: usage/install/underlay/get-started-sriov.md
+      - Overlay Installation:
           - Calico: usage/install/overlay/get-started-calico.md
           - Cilium: usage/install/overlay/get-started-cilium.md
-      - Public cloud installation:
-          - alibaba cloud: usage/install/cloud/get-started-alibaba.md
-          - vmware vsphere: usage/install/cloud/get-started-vmware.md
-          - openstack: usage/install/cloud/get-started-openstack.md
+      - Public Cloud Installation:
+          - Alibaba Cloud: usage/install/cloud/get-started-alibaba.md
+          - VWware vSphere: usage/install/cloud/get-started-vmware.md
+          - OpenStack: usage/install/cloud/get-started-openstack.md
       - Upgrading: usage/install/upgrade.md
   - Usage:
       - SpiderMultusConfig: usage/spider-multus-config.md
@@ -71,12 +71,14 @@ nav:
       - IPAM for custom controllers: usage/third-party-controller.md
       - IPAM for StatefulSet: usage/statefulset.md
       - IPAM of Reserved IP: usage/reserved-ip.md
-      - Multiple interfaces: usage/multi-interfaces-annotation.md
-      - IPv6 support: usage/ipv6.md
-      - Route support: usage/route.md
+      - MultipleInterfaces: usage/multi-interfaces-annotation.md
+      - Egress Policy: usage/egress.md
+      - IPv6 Support: usage/ipv6.md
+      - Route Support: usage/route.md
+      - Service Support: usage/service.md
       - Plugin coordinator: usage/coordinator.md
       - Plugin ifacer: usage/ifacer.md
-      - node-based topology: usage/network-topology.md
+      - Node-based Topology: usage/network-topology.md
       - RDMA: usage/rdma.md
       - Kubevirt: usage/kubevirt.md
       - FAQ: usage/debug.md
@@ -84,7 +86,7 @@ nav:
       - Architecture: concepts/arch.md
       - IPAM: concepts/ipam.md
       - IPAM Performance: concepts/ipam-performance.md
-      - IO Performance: concepts/io-performance.md
+      - I/O Performance: concepts/io-performance.md
       - Blogs: concepts/blog.md
   - Reference:
       - Annotations: reference/annotation.md
@@ -99,7 +101,7 @@ nav:
       - CRD SpiderEndpoint: reference/crd-spiderendpoint.md
       - CRD SpiderReservedIP: reference/crd-spiderreservedip.md
       - Coordinatorr plugin: reference/plugin-coordinator.md
-      - Ifacer plugin: reference/plugin-ifacer.md
+      - ifacer plugin: reference/plugin-ifacer.md
       - IPAM plugin: reference/plugin-ipam.md
   - Development:
       - Contribution Guide: develop/contributing.md
diff --git a/docs/reference/crd-spiderippool.md b/docs/reference/crd-spiderippool.md
index 764f60442..f1d88d551 100644
--- a/docs/reference/crd-spiderippool.md
+++ b/docs/reference/crd-spiderippool.md
@@ -42,7 +42,7 @@ This is the IPPool spec for users to configure.
 | ips               | IP ranges for this pool to use                                                                             | list of strings                                                                                                                        | optional   | array of IP ranges and single IP address |         |
 | excludeIPs        | isolated IP ranges for this pool to filter                                                                 | list of strings                                                                                                                        | optional   | array of IP ranges and single IP address |         |
 | gateway           | gateway for this pool                                                                                      | string                                                                                                                                 | optional   | an IP address                            |         |
-| vlan              | vlan ID                                                                                                    | int                                                                                                                                    | optional   | [0,4094]                                 | 0       |
+| vlan              | vlan ID(deprecated)                                                                                        | int                                                                                                                                    | optional   | [0,4094]                                 | 0       |
 | routes            | custom routes in this pool (please don't set default route `0.0.0.0/0` if property `gateway` exists)       | list of [route](./crd-spiderippool.md#Route)                                                                                           | optional   |                                          |         |
 | podAffinity       | specify which pods can use this pool                                                                       | [labelSelector](https://github.com/kubernetes/kubernetes/blob/v1.27.0/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go#L1195) | optional   | kubernetes LabelSelector                 |         |
 | namespaceAffinity | specify which namespaces pods can use this pool                                                            | [labelSelector](https://github.com/kubernetes/kubernetes/blob/v1.27.0/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go#L1195) | optional   | kubernetes LabelSelector                 |         |
diff --git a/docs/reference/crd-spidersubnet.md b/docs/reference/crd-spidersubnet.md
index 48e7a5b79..a00fb8e0d 100644
--- a/docs/reference/crd-spidersubnet.md
+++ b/docs/reference/crd-spidersubnet.md
@@ -40,7 +40,7 @@ This is the SpiderSubnet spec for users to configure.
 | ips               | IP ranges for this resource to use             | list of strings                              | optional   | array of IP ranges and single IP address |         |
 | excludeIPs        | isolated IP ranges for this resource to filter | list of strings                              | optional   | array of IP ranges and single IP address |         |
 | gateway           | gateway for this resource                      | string                                       | optional   | an IP address                            |         |
-| vlan              | vlan ID                                        | int                                          | optional   | [0,4094]                                 | 0       |
+| vlan              | vlan ID(deprecated)                            | int                                          | optional   | [0,4094]                                 | 0       |
 | routes            | custom routes in this resource                 | list of [Route](./crd-spiderippool.md#Route) | optional   |                                          |         |
 
 ### Status (subresource)
diff --git a/docs/usage/egress-zh_CN.md b/docs/usage/egress-zh_CN.md
new file mode 100644
index 000000000..b0760c0c6
--- /dev/null
+++ b/docs/usage/egress-zh_CN.md
@@ -0,0 +1,3 @@
+# Egress Policy
+
+[**English**](./egress.md) | **简体中文**
diff --git a/docs/usage/egress.md b/docs/usage/egress.md
new file mode 100644
index 000000000..ca21a5c0b
--- /dev/null
+++ b/docs/usage/egress.md
@@ -0,0 +1,3 @@
+# Egress Policy
+
+**English** | [**简体中文**](./egress-zh_CN.md)
diff --git a/docs/usage/install/cloud/get-started-alibaba-zh_CN.md b/docs/usage/install/cloud/get-started-alibaba-zh_CN.md
index 6affa5ea1..8d7f6534d 100644
--- a/docs/usage/install/cloud/get-started-alibaba-zh_CN.md
+++ b/docs/usage/install/cloud/get-started-alibaba-zh_CN.md
@@ -55,7 +55,7 @@ helm install spiderpool spiderpool/spiderpool --namespace kube-system --set ipam
 >
 > Spiderpool 可以为控制器类型为：`Statefulset` 的应用副本固定 IP 地址。在公有云的 Underlay 网络场景中，云主机只能使用限定的 IP 地址，当 StatefulSet 类型的应用副本漂移到其他节点，但由于原固定的 IP 在其他节点是非法不可用的，新的 Pod 将出现网络不可用的问题。对此场景，将 `ipam.enableStatefulSet` 设置为 `false`，禁用该功能。
 >
-> 通过 `multus.multusCNI.defaultCniCRName` 指定集群的 Multus clusterNetwork，clusterNetwork 是 Multus 插件的一个特定字段，用于指定 Pod 的默认网络接口。
+> 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
 ### 安装 CNI 配置
 
diff --git a/docs/usage/install/cloud/get-started-alibaba.md b/docs/usage/install/cloud/get-started-alibaba.md
index 8f4f88752..012e9ef5b 100644
--- a/docs/usage/install/cloud/get-started-alibaba.md
+++ b/docs/usage/install/cloud/get-started-alibaba.md
@@ -50,12 +50,12 @@ helm install spiderpool spiderpool/spiderpool --namespace kube-system --set ipam
 ```
 
 > If IPVlan is not installed in your cluster, you can specify the Helm parameter `--set plugins.installCNI=true` to install IPVlan in your cluster.
-> 
+>
 > If you are using a cloud server from a Chinese mainland cloud provider, you can enhance image pulling speed by specifying the parameter `--set global.imageRegistryOverride=ghcr.m.daocloud.io`.
 >
 > Spiderpool allows for fixed IP addresses for application replicas with a controller type of `StatefulSet`. However, in the underlay network scenario of public clouds, cloud instances are limited to using specific IP addresses. When StatefulSet replicas migrate to different nodes, the original fixed IP becomes invalid and unavailable on the new node, causing network unavailability for the new Pods. To address this issue, set `ipam.enableStatefulSet` to `false` to disable this feature.
 >
-> Specify the Multus clusterNetwork for the cluster using `multus.multusCNI.defaultCniCRName`. `clusterNetwork` is a specific field within the Multus plugin used to define the default network interface for Pods.
+> Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
 ### Install CNI
 
@@ -116,7 +116,7 @@ ipvlan-eth0   10m
 ipvlan-eth1   10m
 ```
 
-### Create IPPools
+### Create IP Pools
 
 The Spiderpool's CRD, `SpiderIPPool`, introduces the following fields: `nodeName`, `multusName`, and `ips`:
 
diff --git a/docs/usage/install/cloud/get-started-aws-zh_CN.md b/docs/usage/install/cloud/get-started-aws-zh_CN.md
index 4011ebb7e..ded54cdeb 100644
--- a/docs/usage/install/cloud/get-started-aws-zh_CN.md
+++ b/docs/usage/install/cloud/get-started-aws-zh_CN.md
@@ -1,4 +1,4 @@
-# AWS环境运行
+# AWS 环境运行
 
 **简体中文** | [**English**](./get-started-aws.md)
 
@@ -8,43 +8,43 @@
 
 ## 项目功能
 
-Spiderpool 能基于 IPVlan Underlay CNI 运行在公有云环境上，并实现有节点拓扑、解决 MAC 地址合法性等功能，它的实现原理如下：
+Spiderpool 能基于 ipvlan Underlay CNI 运行在公有云环境上，并实现有节点拓扑、解决 MAC 地址合法性等功能，它的实现原理如下：
 
-1. 公有云下使用 Underlay 网络，但公有云的每个云服务器的每张网卡只能分配有限的 IP 地址，当应用运行在某个云服务器上时，需要同步获取到 VPC 网络中分配给该云服务器不同网卡的合法 IP 地址，才能实现通信。根据上述分配 IP 的特点，Spiderpool 的 CRD：`SpiderIPPool` 可以设置 nodeName，multusName 实现节点拓扑的功能，通过 IP 池与节点、IPvlan Multus 配置的亲和性，能最大化的利用与管理节点可用的 IP 地址，给应用分配到合法的 IP 地址，让应用在 VPC 网络内自由通信，包括 Pod 与 Pod 通信，Pod 与云服务器通信等。
+1. 公有云下使用 Underlay 网络，但公有云的每个云服务器的每张网卡只能分配有限的 IP 地址，当应用运行在某个云服务器上时，需要同步获取到 VPC 网络中分配给该云服务器不同网卡的合法 IP 地址，才能实现通信。根据上述分配 IP 的特点，Spiderpool 的 CRD：`SpiderIPPool` 可以设置 nodeName，multusName 实现节点拓扑的功能，通过 IP 池与节点、ipvlan Multus 配置的亲和性，能最大化的利用与管理节点可用的 IP 地址，给应用分配到合法的 IP 地址，让应用在 VPC 网络内自由通信，包括 Pod 与 Pod 通信，Pod 与云服务器通信等。
 
-2. 公有云的 VPC 网络中，处于网络安全管控和数据包转发的原理，当网络数据报文中出现 VPC 网络未知的 MAC 和 IP 地址时，它无法得到正确的转发。例如，基于 Macvlan 和 OVS 原理的 Underlay CNI 插件，Pod 网卡中的 MAC 地址是新生成的，会导致 Pod 无法通信。针对该问题，Spiderpool 可搭配 [IPVlan](https://www.cni.dev/plugins/current/main/ipvlan/) CNI 进行解决。IPVlan 基于三层网络，无需依赖二层广播，并且不会重新生成 Mac 地址，与父接口保持一致，因此通过 IPvlan 可以解决公有云中关于 MAC 地址合法性的问题。
+2. 公有云的 VPC 网络中，由于网络安全管控和数据包转发的原理，当网络数据报文中出现 VPC 网络未知的 MAC 和 IP 地址时，它无法得到正确的转发。例如，基于 Macvlan 和 OVS 原理的 Underlay CNI 插件，Pod 网卡中的 MAC 地址是新生成的，会导致 Pod 无法通信。针对该问题，Spiderpool 可搭配 [ipvlan](https://www.cni.dev/plugins/current/main/ipvlan/) CNI 进行解决。ipvlan 基于三层网络，无需依赖二层广播，并且不会重新生成 Mac 地址，与父接口保持一致，因此通过 ipvlan 可以解决公有云中关于 MAC 地址合法性的问题。
 
 ## 实施要求
 
-1. 使用 IPVlan 做集群 CNI 时，系统内核版本必须大于 4.2。
+1. 使用 ipvlan 做集群 CNI 时，系统内核版本必须大于 4.2。
 
 2. 已安装 [Helm](https://helm.sh/docs/intro/install/)。
 
 3. 了解 [AWS VPC 公有 & 私有子网](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html) 基础知识。
 
-    在 AWS VPC下创建的子网，如果设置了出口路由0.0.0.0/0, ::/0的下一跳为 Internet Gateway，则该子网就隶属于 *公有子网* ，否则就是 *私有子网* 。
+    在 AWS VPC 下创建的子网，如果设置了出口路由 0.0.0.0/0, ::/0 的下一跳为 Internet Gateway，则该子网就隶属于 *公有子网* ，否则就是 *私有子网* 。
 
     ![aws-subnet-concept](../../../images/aws/aws-subnet-concept.png)
 
 ## 步骤
 
-### AWS环境
+### AWS 环境
 
-- 在 VPC 下创建公有子网以及私有子网，并在私有子网下创建虚拟机，如图：
+1. 在 VPC 下创建公有子网以及私有子网，并在私有子网下创建虚拟机，如图：
 
-    > 本例会在同一个 VPC 下先创建1个公有子网以及2个私有子网(请将子网部署在不同的可用区)，接着会在公有子网下创建一个 AWS EC2 实例作为跳板机，然后会在两个不同的私有子网下创建对应的 AWS EC2 实例用于部署 kubernetes 集群。
+    > 本例会在同一个 VPC 下先创建 1 个公有子网以及 2 个私有子网(请将子网部署在不同的可用区)，接着会在公有子网下创建一个 AWS EC2 实例作为跳板机，然后会在两个不同的私有子网下创建对应的 AWS EC2 实例用于部署 Kubernetes 集群。
 
     ![aws-subnet-1](../../../images/aws/aws-subnet-1.png)
 
-- 额外创建两个私有子网用于给实例补充第二张网卡(请将子网部署在与实例相同的可用区)，如图：
+2. 额外创建两个私有子网用于给实例补充第二张网卡(请将子网部署在与实例相同的可用区)，如图：
 
     ![aws-subnet-2](../../../images/aws/aws-subnet-2.png)
 
     ![aws-interfaces](../../../images/aws/aws-interfaces.png)
 
-- 给实例们的每张网卡均分配一些辅助私网 IP，如图:
+3. 给实例们的每张网卡均分配一些辅助私网 IP，如图:
 
-    > 因为根据 [AWS EC2实例规格](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/using-eni.html)，实例的网卡数量以及每张网卡对应可绑定的辅助IP有限制，为了能够尽可能的充分利用实例资源来部署应用，我们因此选择给实例绑定2张网卡以及对应的辅助IP.
+    > 因为根据 [AWS EC2 实例规格](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/using-eni.html)，实例的网卡数量以及每张网卡对应可绑定的辅助 IP 有限制，为了能够尽可能的充分利用实例资源来部署应用，我们因此选择给实例绑定2张网卡以及对应的辅助 IP。
 
     ![aws-web-network](../../../images/aws/aws-secondary-nic.png)
 
@@ -55,19 +55,19 @@ Spiderpool 能基于 IPVlan Underlay CNI 运行在公有云环境上，并实现
     | worker1 | 180.17.16.17    | 180.17.16.11-180.17.16.15 | 210.22.32.10    | 210.22.32.11-210.22.32.15 |
     ```
 
-- 创建 AWS NAT 网关，AWS 的 NAT 网关能实现为 VPC 私有子网中的实例连接到VPC外部的服务。通过 NAT 网关，实现集群的流量出口访问。参考 [NAT 网关文档](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) 创建 NAT 网关，如图：
+4. 创建 AWS NAT 网关，AWS 的 NAT 网关能实现为 VPC 私有子网中的实例连接到 VPC 外部的服务。通过 NAT 网关，实现集群的流量出口访问。参考 [NAT 网关文档](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) 创建 NAT 网关，如图：
 
-    > 在上述的公有子网 `public-172-31-0-0` 下创建NAT网关，并为私有子网的路由表配置0.0.0.0/0出口路由的下一跳为该NAT网关。(注意IPv6是由AWS分配的全局唯一的地址，可直接借助Internet Gateway访问互联网)
+    > 在上述的公有子网 `public-172-31-0-0` 下创建 NAT 网关，并为私有子网的路由表配置 0.0.0.0/0 出口路由的下一跳为该 NAT 网关。(注意 IPv6 是由 AWS 分配的全局唯一的地址，可直接借助 Internet Gateway 访问互联网)
 
     ![aws-nat-gateway](../../../images/aws/aws-nat-gateway.png)
 
     ![aws-nat-route](../../../images/aws/aws-nat-route.png)
 
-- 使用上述配置的虚拟机，搭建一套 kubernetes 集群，节点的的可用 IP 及集群网络拓扑图如下：
+5. 使用上述配置的虚拟机，搭建一套 Kubernetes 集群，节点的的可用 IP 及集群网络拓扑图如下：
 
     ![网络拓扑](../../../images/aws/aws-k8s-network.png)
 
-### 安装Spiderpool
+### 安装 Spiderpool
 
 通过 helm 安装 Spiderpool。
 
@@ -83,11 +83,11 @@ helm install spiderpool spiderpool/spiderpool --namespace kube-system --set ipam
 >
 > - Spiderpool 可以为控制器类型为：`Statefulset` 的应用副本固定 IP 地址。在公有云的 Underlay 网络场景中，云主机只能使用限定的 IP 地址，当 StatefulSet 类型的应用副本漂移到其他节点，但由于原固定的 IP 在其他节点是非法不可用的，新的 Pod 将出现网络不可用的问题。对此场景，将 `ipam.enableStatefulSet` 设置为 `false`，禁用该功能。
 >
-> - 通过 `multus.multusCNI.defaultCniCRName` 指定集群的 Multus clusterNetwork，clusterNetwork 是 Multus 插件的一个特定字段，用于指定 Pod 的默认网络接口。
+> - 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
 ### 安装 CNI 配置
 
-Spiderpool 为简化书写 JSON 格式的 Multus CNI 配置，它提供了 SpiderMultusConfig CR 来自动管理 Multus NetworkAttachmentDefinition CR。根据前面创建 AWS EC2 实例虚拟机过程中创建的网卡情况，为虚拟机的每个用于运行 IPvlan CNI 的网卡创建如下 SpiderMultusConfig 配置的示例：
+Spiderpool 为简化书写 JSON 格式的 Multus CNI 配置，它提供了 SpiderMultusConfig CR 来自动管理 Multus NetworkAttachmentDefinition CR。根据前面创建 AWS EC2 实例虚拟机过程中创建的网卡情况，为虚拟机的每个用于运行 ipvlan CNI 的网卡创建如下 SpiderMultusConfig 配置的示例：
 
 ```shell
 IPVLAN_MASTER_INTERFACE0="ens5"
@@ -120,7 +120,7 @@ spec:
 EOF
 ```
 
-在本文示例中，使用如上配置，创建如下的两个 IPvlan SpiderMultusConfig，将基于它们自动生成的 Multus NetworkAttachmentDefinition CR，它们分别对应了宿主机的 `eth5` 与 `eth6` 网卡。
+在本文示例中，使用如上配置，创建如下的两个 ipvlan SpiderMultusConfig，将基于它们自动生成的 Multus NetworkAttachmentDefinition CR，它们分别对应了宿主机的 `eth5` 与 `eth6` 网卡。
 
 ```bash
 ~# kubectl get spidermultusconfigs.spiderpool.spidernet.io -A
@@ -134,7 +134,7 @@ default       ipvlan-ens5   8d
 default       ipvlan-ens6   8d
 ```
 
-### 创建 IPPools
+### 创建 IP 池
 
 Spiderpool 的 CRD：`SpiderIPPool` 提供了 `nodeName`、`multusName` 与 `ips` 字段：
 
@@ -142,9 +142,9 @@ Spiderpool 的 CRD：`SpiderIPPool` 提供了 `nodeName`、`multusName` 与 `ips
 
 - `multusName`：Spiderpool 通过该字段与 Multus CNI 深度结合以应对多网卡场景。当 `multusName` 不为空时，SpiderIPPool 会使用对应的 Multus CR 实例为 Pod 配置网络，若 `multusName` 对应的 Multus CR 不存在，那么 Spiderpool 将无法为 Pod 指定 Multus CR。当 `multusName` 为空时，Spiderpool 对 Pod 所使用的 Multus CR 不作限制。
 
-- `spec.ips`：根据上文AWS EC2实例的网卡以及辅助IP地址等信息，故该值的范围必须在 `nodeName` 对应主机的辅助私网 IP 范围内，且对应唯一的一张实例网卡。
+- `spec.ips`：根据上文 AWS  EC2 实例的网卡以及辅助 IP 地址等信息，故该值的范围必须在 `nodeName` 对应主机的辅助私网 IP 范围内，且对应唯一的一张实例网卡。
 
-结合上文 [AWS环境](./get-started-aws-zh_CN.md#AWS环境) 每台实例的网卡以及对应的辅助IP信息，使用如下的 Yaml，为每个节点的每张网卡( ens5、ens6 )分别创建了一个 SpiderIPPool，它们将为不同节点上的 Pod 提供 IP 地址。
+结合上文 [AWS 环境](./get-started-aws-zh_CN.md#AWS环境) 每台实例的网卡以及对应的辅助 IP 信息，使用如下的 Yaml，为每个节点的每张网卡( ens5、ens6) 分别创建了一个 SpiderIPPool，它们将为不同节点上的 Pod 提供 IP 地址。
 
 ```shell
 ~# cat <<EOF | kubectl apply -f -
@@ -208,9 +208,9 @@ EOF
 
 ### 创建应用
 
-以下的示例 Yaml 中，会创建1个 Deployment 应用，其中：
+以下的示例 Yaml 中，会创建 1 个 Deployment 应用，其中：
 
-- `v1.multus-cni.io/default-network`：用于指定应用的 CNI 配置，示例中的应用选择使用对应于宿主机 ens5 的 IPvlan 配置，并根据我们的缺省 SpiderIPPool 资源默认挑选其对应的子网。
+- `v1.multus-cni.io/default-network`：用于指定应用的 CNI 配置，示例中的应用选择使用对应于宿主机 ens5 的 ipvlan 配置，并根据我们的缺省 SpiderIPPool 资源默认挑选其对应的子网。
 
 ```shell
 cat <<EOF | kubectl create -f -
@@ -238,7 +238,7 @@ spec:
 EOF
 ```
 
-查看 Pod 的运行状态我们可以发现，我们两个节点上都运行了1个 Pod 且使用的IP都对应宿主机的第一张网卡的辅助 IP:
+查看 Pod 的运行状态我们可以发现，我们两个节点上都运行了 1 个 Pod 且使用的 IP 都对应宿主机的第一张网卡的辅助 IP:
 
 ```shell
 ~# kubectl get po -owide
@@ -268,7 +268,7 @@ nginx-lb-1-55d4c48fc8-jl8b9   1/1     Running   0          5s    180.17.16.14
 
 #### 集群内的 Pod 流量出口访问
 
-借助上文我们创建的[AWS NAT网关](./get-started-aws-zh_CN.md#AWS环境)，我们的 VPC 私网已可实现访问互联网。
+借助上文我们创建的 [AWS NAT 网关](./get-started-aws-zh_CN.md#AWS环境)，我们的 VPC 私网已可实现访问互联网。
 
 > ~# kubectl exec -it nginx-lb-1-55d4c48fc8-skrxh -- curl www.baidu.com -I
 
@@ -276,33 +276,34 @@ nginx-lb-1-55d4c48fc8-jl8b9   1/1     Running   0          5s    180.17.16.14
 
 ##### 部署 AWS Load Balancer Controller
 
-AWS 基础产品 `负载均衡` 拥有 NLB(Network Load Balancer) 和 ALB(Application Load Balancer) 两种模式分别对应 Layer4 与 Layer7。 aws-load-balancer-controller 是 AWS 提供的一个用于 kubernetes 与 AWS 基础产品进行对接的组件，可实现 kubernetes Service LoadBalancer 和 Ingress 功能。本文中通过该组件结合AWS基础设施完成负载均衡的流量入口访问。本例基于 `v2.6` 版本进行安装演示， 参考下列步骤与 [aws-load-balancer-controller 文档](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/) 完成 aws-load-balancer-controller 的部署。
+AWS 基础产品 `负载均衡` 拥有 NLB (Network Load Balancer) 和 ALB(Application Load Balancer) 两种模式分别对应 Layer4 与 Layer7。 aws-load-balancer-controller 是 AWS 提供的一个用于 Kubernetes 与 AWS 基础产品进行对接的组件，可实现 kubernetes Service LoadBalancer 和 Ingress 功能。本文中通过该组件结合 AWS 基础设施完成负载均衡的流量入口访问。本例基于 `v2.6` 版本进行安装演示， 参考下列步骤与 [aws-load-balancer-controller 文档](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/) 完成 aws-load-balancer-controller 的部署。
 
 1. 集群节点配置 `providerID`
 
-    务必为kubernetes上的每个 Node 设置上 providerID ，您可通过以下两种方式实现:
-    - 可直接在AWS EC2 dashboard中找到instances的Instance ID.
-    - 使用AWS CLI来查询Instance ID: `aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Instance:InstanceId}'`.
+    务必为 Kubernetes 上的每个 Node 设置上 `providerID`，您可通过以下两种方式实现:
+    - 可直接在 AWS EC2 dashboard 中找到实例的Instance ID.
+    - 使用 AWS CLI 来查询Instance ID: `aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Instance:InstanceId}'`.
 
-2. 为AWS EC2实例所使用的 IAM role 补充 policy
+2. 为 AWS EC2 实例所使用的 IAM role 补充 policy
 
-    > 1. 介于 aws-load-balancer-controller 运行在每个节点上且需要访问 AWS 的 NLB/ALB APIs，因此需要 AWS IAM 关于NLB/ALB 相关请求的授权。又因我们是自建集群，我们需要借用节点自身的 IAM Role来实现授权，详情可看 [aws-load-balancer-controller IAM](aws-load-balancer-controller)。
+    > 1. 介于 aws-load-balancer-controller 运行在每个节点上且需要访问 AWS 的 NLB/ALB APIs，因此需要 AWS IAM 关于 NLB/ALB 相关请求的授权。又因我们是自建集群，我们需要借用节点自身的 IAM Role 来实现授权，详情可看[aws-load-balancer-controller IAM](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/)。
     > 2. `curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.6.0/docs/install/iam_policy.json`
     > 3. 使用如上获取的 json 内容，在 AWS IAM Dashboard 中创建一个新的policy，并将该 policy 与您当前虚拟机实例的 IAM Role 进行关联。
-   
+
     ![aws-iam-policy](../../../images/aws/aws-iam-policy.png)
 
     ![aws-iam-role](../../../images/aws/aws-iam-role.png)
 
-3. 为您AWS EC2实例所在的可用区创建一个public subnet并打上可自动发现的tag.
+3. 为您 AWS EC2 实例所在的可用区创建一个 public subnet 并打上可自动发现的 tag.
 
-    - ALB 的使用需要至少2个跨可用区的子网，对于 NLB 的使用需要至少1个子网。详情请看 [子网自动发现](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/deploy/subnet_discovery/)。 
+    - ALB 的使用需要至少 2 个跨可用区的子网，对于 NLB 的使用需要至少 1 个子网。详情请看 [子网自动发现](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/deploy/subnet_discovery/)。
     - 对于公网访问的 LB，您需要为实例所在可用区的 public subnet 打上 tag: `kubernetes.io/role/elb:1`，对于 VPC 间访问的 LB，请创建 private subnet 并打上 tag:`kubernetes.io/role/internal-elb:1`，请结合 [AWS 环境](./get-started-aws-zh_CN.md#AWS环境) 来创建所需的子网：
-      - > 针对因特网暴露的负载均衡器，创建 public subnet: 在 AWS VPC Dashboard Subnets 栏选择创建子网，并选择与 EC2 相同的可用区。随后在 Route tables 栏选中我们的 Main 路由表并选择子网关联。(注意 Main 路由表的0.0.0.0/0路由的下一跳默认为 Internet 网关，若丢失请自行创建该路由规则)。
-      - > 在 AWS VPC Dashboard Route tables栏创建一个新的路由表并配置 0.0.0.0/0的路由下一跳为 NAT 网关，::/0路由下一跳为 Internet 网关。
-      - > 针对 VPC 间访问的负载均衡器，创建 private subnet: 在 AWS VPC Dashboard Subnets 栏选择创建子网，并选择与 EC2 相同的可用区。随后在 Route tables 栏选中上一步创建的路由表并选择子网关联。
 
-4. 使用helm安装aws-load-balancer-controller(本例基于 `v2.6` 版本进行安装)
+      > - 针对因特网暴露的负载均衡器，创建 public subnet: 在 AWS VPC Dashboard Subnets 栏选择创建子网，并选择与 EC2 相同的可用区。随后在 Route tables 栏选中我们的 Main 路由表并选择子网关联。(注意 Main 路由表的 0.0.0.0/0 路由的下一跳默认为 Internet 网关，若丢失请自行创建该路由规则)。
+      > - 在 AWS VPC Dashboard Route tables 栏创建一个新的路由表并配置 0.0.0.0/0 的路由下一跳为 NAT 网关，::/0 路由下一跳为 Internet 网关。
+      > - 针对 VPC 间访问的负载均衡器，创建 private subnet: 在 AWS VPC Dashboard Subnets 栏选择创建子网，并选择与 EC2 相同的可用区。随后在 Route tables 栏选中上一步创建的路由表并选择子网关联。
+
+4. 使用 helm 安装aws-load-balancer-controller(本例基于 `v2.6` 版本进行安装)
 
     ```shell
     helm repo add eks https://aws.github.io/eks-charts
@@ -323,7 +324,7 @@ AWS 基础产品 `负载均衡` 拥有 NLB(Network Load Balancer) 和 ALB(Applic
 
 ##### 为应用创建 Loadbalancer 负载均衡访问入口
 
-集合上文中已创建的 [应用](./get-started-aws-zh_CN.md#创建应用), 我们为它创建一个 kubernetes Service LoadBalancer 资源(若有双栈需求请放开 `service.beta.kubernetes.io/aws-load-balancer-ip-address-type: dualstack` 注解):
+上文中已创建 [应用](./get-started-aws-zh_CN.md#创建应用), 现在我们为它创建一个 kubernetes Service LoadBalancer 资源(若有双栈需求请放开 `service.beta.kubernetes.io/aws-load-balancer-ip-address-type: dualstack` 注解):
 
 ```shell
 cat <<EOF | kubectl create -f -
@@ -354,7 +355,7 @@ EOF
 我们可以在 AWS Dashboard EC2 Load Balancing 栏中看到已经有一个 NLB 已被创建出来且可被访问。
 
 > - NLB 还可支持 instance 模式创建 LB，只需修改注解 `service.beta.kubernetes.io/aws-load-balancer-nlb-target-type` 即可，但因配合 `service.spec.externalTraffic=Local` 模式不支持监听节点漂移，因此不推荐使用。
-> - 可通过注解 `service.beta.kubernetes.io/load-balancer-source-ranges` 来限制可访问源IP。(注意，该功能与注解 `service.beta.kubernetes.io/aws-load-balancer-ip-address-type` 关联，若默认 ipv4 则该值默认为 `0.0.0.0/0`, 若是 dualstack 则默认为 `0.0.0.0/0, ::/0`)。
+> - 可通过注解 `service.beta.kubernetes.io/load-balancer-source-ranges` 来限制可访问源 IP。注意，该功能与注解 `service.beta.kubernetes.io/aws-load-balancer-ip-address-type` 关联，若默认 ipv4 则该值默认为 `0.0.0.0/0`, 若是 dualstack 则默认为 `0.0.0.0/0, ::/0`。
 > - 可通过注解 `service.beta.kubernetes.io/aws-load-balancer-scheme` 选择此 NLB 是暴露给公网访问还是留给 VPC 间访问，默认值为 `internal` 供 VPC 间访问。
 > - 注解 `service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true` 提供了客户端源 IP 保留功能。
 
@@ -471,8 +472,8 @@ spec:
 我们可以在 AWS Dashboard EC2 Load Balancing 栏中看到已经有一个 ALB 已被创建出来且可被访问。
 
 > - ALB 也可支持 instance 模式创建 LB，只需修改注解 `alb.ingress.kubernetes.io/target-type`即可，但因配合 `service.spec.externalTraffic=Local` 模式不支持监听节点漂移，因此不推荐使用。
-> - 使用 ALB 的 instance 模式需要指定 service 为nodePort模式。
+> - 使用 ALB 的 instance 模式需要指定 service 为 NodePort 模式。
 > - 可通过注解 `alb.ingress.kubernetes.io/inbound-cidrs` 来限制可访问源IP。(注意，该功能与注解 `alb.ingress.kubernetes.io/ip-address-type` 关联，若默认 ipv4 则该值默认为 `0.0.0.0/0`, 若是 dualstack 则默认为 `0.0.0.0/0, ::/0`)。
 > - 可通过注解 `alb.ingress.kubernetes.io/scheme` 选择此 ALB 是暴露给公网访问还是留给 VPC 间访问，默认值为 `internal` 供 VPC 间访问。
 > - 若想整合多个 Ingress 资源共享同一个入口，可配置注解 `alb.ingress.kubernetes.io/group.name` 来显示指定一个名字。（注意，默认不指定该注解的 Ingresses 资源并不属于任何 IngressGroup，系统会将其视为由 Ingress 本身组成的 "隐式 IngressGroup"）
-> - 如果想指定 Ingress 的 host，需要搭配 externalDNS 使用。(详情请查看 [配置 externalDNS](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/guide/integrations/external_dns/))
+> - 如果想指定 Ingress 的 host，需要搭配 externalDNS 使用。详情请查看 [配置 externalDNS](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/guide/integrations/external_dns/)。
diff --git a/docs/usage/install/cloud/get-started-aws.md b/docs/usage/install/cloud/get-started-aws.md
index e43742d90..f2fb066f4 100644
--- a/docs/usage/install/cloud/get-started-aws.md
+++ b/docs/usage/install/cloud/get-started-aws.md
@@ -1,3 +1,480 @@
 # Running On AWS
 
 **English** | [**简体中文**](./get-started-aws-zh_CN.md)
+
+## Introduction
+
+With a multitude of public cloud providers available, such as Alibaba Cloud, Huawei Cloud, Tencent Cloud, AWS, and more, it can be challenging to use mainstream open-source CNI plugins to operate on these platforms using underlay networks. Instead, one has to rely on proprietary CNI plugins provided by each cloud vendor, leading to a lack of standardized underlay solutions for public clouds. This page introduces [Spiderpool](../../../README.md), an underlay networking solution designed to work seamlessly in any public cloud environment. A unified CNI solution offers easier management across multiple clouds, particularly in hybrid cloud scenarios.
+
+## Features
+
+Spiderpool can operate in public cloud environments using the ipvlan underlay CNI and provide features such as node topology and MAC address validity resolution. Here is how it works:
+
+1. When using underlay networks in a public cloud environment, each network interface of a cloud server can only be assigned a limited number of IP addresses. To enable communication when an application runs on a specific cloud server, it needs to obtain the valid IP addresses allocated to different network interfaces within the VPC network. To address this IP allocation requirement, Spiderpool introduces a CRD named `SpiderIPPool`. By configuring the nodeName and multusName fields in `SpiderIPPool`, it enables node topology functionality. Spiderpool leverages the affinity between the IP pool and nodes, as well as the affinity between the IP pool and ipvlan Multus, facilitating the utilization and management of available IP addresses on the nodes. This ensures that applications are assigned valid IP addresses, enabling seamless communication within the VPC network, including communication between Pods and also between Pods and cloud servers.
+
+2. In a public cloud VPC network, network security controls and packet forwarding principles dictate that when network data packets contain MAC and IP addresses unknown to the VPC network, correct forwarding becomes unattainable. This issue arises in scenarios where Macvlan or OVS based underlay CNI plugins generate new MAC addresses for Pod NICs, resulting in communication failures among Pods. To address this challenge, Spiderpool offers a solution in conjunction with [ipvlan CNI](https://www.cni.dev/plugins/current/main/ipvlan/). The ipvlan CNI operates at the L3 of the network, eliminating the reliance on L2 broadcasts and avoiding the generation of new MAC addresses. Instead, it maintains consistency with the parent interface. By incorporating ipvlan, the legitimacy of MAC addresses in a public cloud environment can be effectively resolved.
+
+## Prerequisites
+
+1. The system kernel version must be greater than 4.2 when using ipvlan as the cluster's CNI.
+
+2. [Helm](https://helm.sh/docs/intro/install/) is installed.
+
+3. Understand the basics of [AWS VPC Public and Private Subnets](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html).
+
+    In an AWS VPC, a subnet is categorized as a *public subnet* if it has an outbound route configured with the Internet Gateway as the next hop for destinations 0.0.0.0/0 or ::/0. Otherwise, a subnet is considered a *private subnet* if it lacks this specific outbound routing configuration.
+
+    ![aws-subnet-concept](../../../images/aws/aws-subnet-concept.png)
+
+## Steps
+
+### AWS Environment
+
+1. Create a public subnet and multiple private subnets within a VPC, and deploy virtual machines in the private subnets as shown in the following picture:
+
+    > We will create one public subnet and two private subnets within the same VPC. Each private subnet should be deployed in a different availability zone. A EC2 instance as a jump server will be created in the public subnet for secure access. Additionally, two AWS EC2 instances will be created in the respective different private subnets to set up the Kubernetes cluster.
+
+    ![aws-subnet-1](../../../images/aws/aws-subnet-1.png)
+
+2. Create two additional private subnets in the same availability zones as the instances to provide secondary network interfaces for the instances, as the picture below:
+
+    ![aws-subnet-2](../../../images/aws/aws-subnet-2.png)
+
+    ![aws-interfaces](../../../images/aws/aws-interfaces.png)
+
+3. Allocate some secondary private IP addresses to each network interface of the instances:
+
+    > To make the most efficient use of instance resources for application deployment, it is recommended to attach two network interfaces with their corresponding secondary IP addresses to each instance. This approach helps overcome limitations on the number of network interfaces and secondary IP addresses per instance, as specified in the [AWS EC2 instance specifications](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html).
+
+    ![aws-web-network](../../../images/aws/aws-secondary-nic.png)
+
+    ```shell
+    | Node    | ens5 primary IP | ens5 secondary IPs        | ens6 primary IP | ens6 secondary IPs        |  
+    |---------|-----------------|---------------------------|-----------------|---------------------------|
+    | master  | 172.31.22.228   | 172.31.16.4-172.31.16.8   | 210.22.16.10    | 210.22.16.11-210.22.16.15 |
+    | worker1 | 180.17.16.17    | 180.17.16.11-180.17.16.15 | 210.22.32.10    | 210.22.32.11-210.22.32.15 |
+    ```
+
+4. Create an AWS NAT gateway to allow instances in the VPC's private subnets to connect to external services. The NAT gateway serves as an outbound traffic gateway for the cluster. Follow the [NAT gateway documentation](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) to create a NAT gateway:
+
+    > Create a NAT gateway in the public subnet, `public-172-31-0-0`, and configure the route table of the private subnets to set the next-hop of the outbound route 0.0.0.0/0 to NAT gateway. (IPv6 addresses provided by AWS are globally unique and can access the internet directly via the Internet Gateway).
+
+    ![aws-nat-gateway](../../../images/aws/aws-nat-gateway.png)
+
+    ![aws-nat-route](../../../images/aws/aws-nat-route.png)
+
+5. Use the configured virtual machines to establish a Kubernetes cluster. The available IP addresses for the nodes and the network topology diagram of the cluster are shown below:
+
+    ![topology](../../../images/aws/aws-k8s-network.png)
+
+### Install Spiderpool
+
+Install Spiderpool via helm:
+
+```shell
+helm repo add spiderpool https://spidernet-io.github.io/spiderpool
+
+helm repo update spiderpool
+
+helm install spiderpool spiderpool/spiderpool --namespace kube-system --set ipam.enableStatefulSet=false --set multus.multusCNI.defaultCniCRName="default/ipvlan-ens5"
+```
+
+> - If you are using a cloud server from a Chinese mainland cloud provider, you can enhance image pulling speed by specifying the parameter `--set global.imageRegistryOverride=ghcr.m.daocloud.io`.
+>
+> - Spiderpool allows for fixed IP addresses for application replicas with a controller type of `StatefulSet`. However, in the underlay network scenario of public clouds, cloud instances are limited to using specific IP addresses. When StatefulSet replicas migrate to different nodes, the original fixed IP becomes invalid and unavailable on the new node, causing network unavailability for the new Pods. To address this issue, set `ipam.enableStatefulSet` to `false` to disable this feature.
+>
+> - Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
+
+### Install CNI
+
+To simplify the creation of JSON-formatted Multus CNI configurations, Spiderpool offers the SpiderMultusConfig CR to automatically manage Multus NetworkAttachmentDefinition CRs. Based on the network interface configuration created during the process of setting up the AWS EC2 instances, here is an example configuration of SpiderMultusConfig for each network interface used to run ipvlan CNI:
+
+```shell
+IPVLAN_MASTER_INTERFACE0="ens5"
+IPVLAN_MULTUS_NAME0="ipvlan-$IPVLAN_MASTER_INTERFACE0"
+IPVLAN_MASTER_INTERFACE1="ens6"
+IPVLAN_MULTUS_NAME1="ipvlan-$IPVLAN_MASTER_INTERFACE1"
+
+cat <<EOF | kubectl apply -f -
+apiVersion: spiderpool.spidernet.io/v2beta1
+kind: SpiderMultusConfig
+metadata:
+  name: ${IPVLAN_MULTUS_NAME0}
+  namespace: default
+spec:
+  cniType: ipvlan
+  ipvlan:
+    master:
+    - ${IPVLAN_MASTER_INTERFACE0}
+---
+apiVersion: spiderpool.spidernet.io/v2beta1
+kind: SpiderMultusConfig
+metadata:
+  name: ${IPVLAN_MULTUS_NAME1}
+  namespace: default
+spec:
+  cniType: ipvlan
+  ipvlan:
+    master:
+    - ${IPVLAN_MASTER_INTERFACE1}
+EOF
+```
+
+This case uses the given configuration to create two ipvlan SpiderMultusConfig instances. These instances will automatically generate corresponding Multus NetworkAttachmentDefinition CRs for the host's `eth5` and `eth6` network interfaces.
+
+```bash
+~# kubectl get spidermultusconfigs.spiderpool.spidernet.io -A
+NAMESPACE     NAME                AGE
+default       ipvlan-ens5   8d
+default       ipvlan-ens6   8d
+
+~# kubectl get network-attachment-definitions.k8s.cni.cncf.io -A
+NAMESPACE     NAME                AGE
+default       ipvlan-ens5   8d
+default       ipvlan-ens6   8d
+```
+
+### Create IP Pools
+
+The Spiderpool's CRD, `SpiderIPPool`, introduces the following fields: `nodeName`, `multusName`, and `ips`:
+
+- `nodeName`: when `nodeName` is not empty, Pods are scheduled on a specific node and attempt to acquire an IP address from the corresponding SpiderIPPool. If the Pod's node matches the specified `nodeName`, it successfully obtains an IP. Otherwise, it cannot obtain an IP from that SpiderIPPool. When `nodeName` is empty, Spiderpool does not impose any allocation restrictions on the Pod.
+
+- `multusName`：Spiderpool integrates with Multus CNI to cope with cases involving multiple network interface cards. When `multusName` is not empty, SpiderIPPool utilizes the corresponding Multus CR instance to configure the network for the Pod. If the Multus CR specified by `multusName` does not exist, Spiderpool cannot assign a Multus CR to the Pod. When `multusName` is empty, Spiderpool does not impose any restrictions on the Multus CR used by the Pod.
+
+- `spec.ips`: based on the information provided about the network interfaces and secondary IP addresses of the AWS EC2 instances, the specified range of values must fall within the auxiliary private IP range of the host associated with the specified `nodeName`. Each value should correspond to a unique instance network interface.
+
+Taking into account the network interfaces and associated secondary IP information for each instance in the [AWS environment](./get-started-aws.md#aws-environment), the following YAML is used to create a separate SpiderIPPool for each network interface (ens5, ens6) on each node. These pools will provide IP addresses for Pods on different nodes:
+
+```shell
+~# cat <<EOF | kubectl apply -f -
+apiVersion: spiderpool.spidernet.io/v2beta1
+kind: SpiderIPPool
+metadata:
+  name: master-v4-ens5
+spec:
+  ipVersion: 4
+  subnet: 172.31.16.0/20
+  ips:
+    - 172.31.16.4-172.31.16.8
+  gateway: 172.31.16.1
+  default: true
+  nodeName: ["master"]
+  multusName: ["default/ipvlan-ens5"]
+---
+apiVersion: spiderpool.spidernet.io/v2beta1
+kind: SpiderIPPool
+metadata:
+  name: master-v4-ens6
+spec:
+  ipVersion: 4
+  subnet: 210.22.16.0/24
+  ips:
+    - 210.22.16.11-210.22.16.15
+  gateway: 210.22.16.1
+  default: true
+  nodeName: ["master"]
+  multusName: ["default/ipvlan-ens6"]
+---
+apiVersion: spiderpool.spidernet.io/v2beta1
+kind: SpiderIPPool
+metadata:
+  name: worker1-v4-ens5
+spec:
+  ipVersion: 4
+  subnet: 180.17.16.0/24
+  ips:
+    - 180.17.16.11-180.17.16.15
+  gateway: 180.17.16.1
+  default: true
+  nodeName: ["worker1"]
+  multusName: ["default/ipvlan-ens5"]
+---
+apiVersion: spiderpool.spidernet.io/v2beta1
+kind: SpiderIPPool
+metadata:
+  name: worker1-v4-ens6
+spec:
+  ipVersion: 4
+  subnet: 210.22.32.0/24
+  ips:
+    - 210.22.32.11-210.22.32.15
+  gateway: 210.22.32.1
+  default: true
+  nodeName: ["worker1"]
+  multusName: ["default/ipvlan-ens6"]
+EOF
+```
+
+### Create Applications
+
+The following YAML example creates a Deployment application with the following configuration:
+
+- `v1.multus-cni.io/default-network`: specify the CNI configuration for the application. In this example, the application is configured to use the ipvlan configuration associated with the ens5 interface of the host machine. The subnet is selected automatically according to the default SpiderIPPool resource.
+
+```shell
+cat <<EOF | kubectl create -f -
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: nginx-lb-1
+spec:
+  selector:
+    matchLabels:
+      run: nginx-lb-1
+  replicas: 2
+  template:
+    metadata:
+      annotations:
+        v1.multus-cni.io/default-network: "default/ipvlan-ens5"
+      labels:
+        run: nginx-lb-1
+    spec:
+      containers:
+      - name: nginx-lb-1
+        image: nginx
+        ports:
+        - containerPort: 80
+EOF
+```
+
+By checking the running status of the Pods, you can observe that one Pod is running on each node, and the Pods are assigned the secondary IP address of the first network interface of their respective host machines:
+
+```shell
+~# kubectl get po -owide
+NAME                          READY   STATUS    RESTARTS   AGE   IP             NODE      NOMINATED NODE   READINESS GATES
+nginx-lb-1-55d4c48fc8-skrxh   1/1     Running   0          5s    172.31.16.5    master    <none>           <none>
+nginx-lb-1-55d4c48fc8-jl8b9   1/1     Running   0          5s    180.17.16.14   worker1   <none>           <none>
+```
+
+### Test East-West Connectivity
+
+- Test communication between Pods and their hosts:
+
+> export NODE_MASTER_IP=172.31.22.228  
+> export NODE_WORKER1_IP= 180.17.16.17  
+> ~# kubectl exec -it nginx-lb-1-55d4c48fc8-skrxh -- ping ${NODE_MASTER_IP} -c 1  
+> ~# kubectl exec -it nginx-lb-1-55d4c48fc8-jl8b9 -- ping ${NODE_WORKER1_IP} -c 1  
+
+- Test communication between Pods across different nodes and subnets:
+
+> ~# kubectl exec -it nginx-lb-1-55d4c48fc8-skrxh -- ping 180.17.16.14 -c 1
+
+- Test communication between Pods and ClusterIP:
+
+> ~# kubectl exec -it nginx-lb-1-55d4c48fc8-skrxh -- ping ${CLUSTER_IP} -c 1
+
+### Test North-South Connectivity
+
+#### Test egress traffic from Pods to external destinations
+
+With the [AWS NAT gateway](./get-started-aws.md#aws-environment) created in the previous section, our VPC's private network can now be accessed from the internet.
+
+> ~# kubectl exec -it nginx-lb-1-55d4c48fc8-skrxh -- curl www.baidu.com -I
+
+#### Load Balancer Ingress Access (Optional)
+
+##### Deploy AWS Load Balancer Controller
+
+The AWS Load Balancer product offers two modes: NLB (Network Load Balancer) and ALB (Application Load Balancer), corresponding to Layer 4 and Layer 7, respectively. The aws-load-balancer-controller is an AWS-provided component that integrates Kubernetes with AWS Load Balancer, enabling Kubernetes Service LoadBalancer and Ingress functionality. We will use this component to facilitate load balancing ingress access with AWS infrastructure. The installation demo is based on version `v2.6`. You can follow the steps below and refer to the [aws-load-balancer-controller documentation](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/) for aws-load-balancer-controller deployment:
+
+1. Configure `providerID` for cluster nodes.
+
+    It is necessary to set the `providerID` for each Node in Kubernetes. You can achieve this in either of the following ways:
+
+    - Find the Instance ID for each instance directly in the AWS EC2 dashboard.
+    - Use the AWS CLI to query the Instance ID: `aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Instance:InstanceId}'`.
+
+2. Add necessary IAM role policy for AWS EC2 instances
+
+    > 1. The aws-load-balancer-controller runs on each node and requires access to AWS NLB/ALB APIs. Therefore, it needs authorization to make requests related to NLB/ALB through AWS IAM. As we are deploying a self-managed cluster, we need to leverage the IAM Role of the nodes themselves to grant this authorization. For more details, refer to the [aws-load-balancer-controller IAM](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/).
+    > 2. `curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.6.0/docs/install/iam_policy.json`
+    > 3. Create a new policy in the AWS IAM Dashboard by using the obtained JSON content and associate it with the IAM Role of your virtual machine instance.
+
+    ![aws-iam-policy](../../../images/aws/aws-iam-policy.png)
+
+    ![aws-iam-role](../../../images/aws/aws-iam-role.png)
+
+3. Create a public subnet for the availability zone where your AWS EC2 instances are located and apply an auto-discoverable tag.
+
+    - For ALB, you need at least two subnets across different availability zones. For NLB, at least one subnet is required. Refer to the [Subnet Discovery](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/deploy/subnet_discovery/) for more details.
+    - To enable LB with public access, add the `kubernetes.io/role/elb:1` tag to the public subnet in the availability zone where the instances reside. Regarding cross-VPC access for LB, create a private subnet and apply the `kubernetes.io/role/internal-elb:1` tag. Use the [AWS environment](./get-started-aws.md#aws-environment) to create the necessary subnets:
+
+      > - To create a public subnet for an internet-exposed load balancer, go to the AWS VPC Dashboard, select "Create subnet" in the Subnets section, and choose the same availability zone as the EC2 instance, and associate the subnet with the Main route table (make sure the default 0.0.0.0/0 route in the Main route table has the Internet Gateway as the next hop; if not, create this route rule).
+      > - Create a new route table in the AWS VPC Dashboard and configure the 0.0.0.0/0 route with the NAT Gateway as the next hop, and the ::/0 route with the Internet Gateway as the next hop.
+      > - To create a private subnet for LB with cross-VPC access, go to the AWS VPC Dashboard Subnets section, select "Create subnet," choose the same availability zone as the EC2 instance, and associate it with the route table created in the previous step.
+
+4. Install aws-load-balancer-controller v2.6 using Helm.
+
+    ```shell
+    helm repo add eks https://aws.github.io/eks-charts
+    
+    kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"
+    
+    helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=<cluster-name>
+    ```
+
+5. Check if  aws-load-balancer-controller has been installed already
+
+    ```shell
+    ~# kubectl get po -n kube-system | grep aws-load-balancer-controller
+    NAME                                            READY   STATUS    RESTARTS       AGE
+    aws-load-balancer-controller-5984487f57-q6qcq   1/1     Running   0              30s
+    aws-load-balancer-controller-5984487f57-wdkxl   1/1     Running   0              30s
+    ```
+
+##### Create a LoadBalancer for Application Access
+
+To provide access to the application created in the previous section [Create Applications](./get-started-aws.md#create-applications), we will create a Kubernetes Service of type LoadBalancer. If you have a dual-stack requirement, add the annotation  `service.beta.kubernetes.io/aws-load-balancer-ip-address-type: dualstack`:
+
+```shell
+cat <<EOF | kubectl create -f -
+apiVersion: v1
+kind: Service
+metadata:
+  name: nginx-svc-lb-1
+  labels:
+    run: nginx-lb-1
+  annotations:
+    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
+    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
+    service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
+    # service.beta.kubernetes.io/aws-load-balancer-ip-address-type: dualstack 
+spec:
+  type: LoadBalancer
+  ports:
+  - port: 80
+    protocol: TCP
+  selector:
+    run: nginx-lb-1
+
+EOF
+```
+
+![aws-network-load-balancer](../../../images/aws/aws-lb.png)
+
+As shown in the AWS EC2 Load Balancing dashboard, an NLB has been created and is accessible.
+
+> - NLB also supports creating LB in instance mode by just modifying the annotation `service.beta.kubernetes.io/aws-load-balancer-nlb-target-type`. However, instance mode does not support node drift when using `service.spec.externalTraffic=Local`, so it is not recommended.
+> - Use the annotation `service.beta.kubernetes.io/load-balancer-source-ranges` to restrict the source IP addresses that can access the NLB. This feature is associated with the annotation `service.beta.kubernetes.io/aws-load-balancer-ip-address-type`. If the default mode is IPv4, the value is `0.0.0.0/0`. For dualstack, the default is `0.0.0.0/0, ::/0`.
+> - Use the annotation `service.beta.kubernetes.io/aws-load-balancer-scheme` to specify whether the NLB should be exposed for public access or restricted to cross-VPC communication. The default value is `internal` for cross-VPC communication.
+> - The annotation `service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true` enables client source IP preservation ability.
+
+##### Create an Ingress for Application Access
+
+Next, we will create a Kubernetes Ingress resource using the second network interface bound in AWS EC2. If you have a dual-stack requirement, add the annotation `alb.ingress.kubernetes.io/ip-address-type: dualstack`:
+
+```shell
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: nginx-ingress
+spec:
+  selector:
+    matchLabels:
+      run: nginx-ingress
+  replicas: 2
+  template:
+    metadata:
+      annotations:
+        v1.multus-cni.io/default-network: "default/ipvlan-ens6"
+      labels:
+        run: nginx-ingress
+    spec:
+      containers:
+      - name: nginx-ingress
+        image: nginx
+        ports:
+        - containerPort: 80
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: nginx-svc-ingress
+  labels:
+    run: nginx-ingress
+spec:
+  type: NodePort
+  ports:
+  - port: 80
+    protocol: TCP
+  selector:
+    run: nginx-ingress
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: echoserver
+spec:
+  selector:
+    matchLabels:
+      app: echoserver
+  replicas: 2
+  template:
+    metadata:
+      annotations:
+        v1.multus-cni.io/default-network: "default/ipvlan-ens6"
+      labels:
+        app: echoserver
+    spec:
+      containers:
+      - image: k8s.gcr.io/e2e-test-images/echoserver:2.5
+        imagePullPolicy: Always
+        name: echoserver
+        ports:
+        - containerPort: 8080
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: echoserver
+spec:
+  ports:
+    - port: 80
+      targetPort: 8080
+      protocol: TCP
+  type: NodePort
+  selector:
+    app: echoserver
+---
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: k8s-app-ingress
+  annotations:
+    alb.ingress.kubernetes.io/target-type: ip
+    alb.ingress.kubernetes.io/scheme: internet-facing
+    # alb.ingress.kubernetes.io/ip-address-type: dualstack
+spec:
+  ingressClassName: alb
+  rules:
+    - http:
+        paths:
+          - path: /
+            pathType: Exact
+            backend:
+              service:
+                name: nginx-svc-ingress
+                port:
+                  number: 80
+    - http:
+        paths:
+          - path: /echo
+            pathType: Exact
+            backend:
+              service:
+                name: echoserver
+                port:
+                  number: 80
+```
+
+![aws-application-load-balancer](../../../images/aws/aws-ingress.png)
+
+As shown in the AWS EC2 Load Balancing dashboard, an ALB has been created and is accessible.
+
+> - ALB also supports creating LB in instance mode by just modifying the annotation `alb.ingress.kubernetes.io/target-type`. However, instance mode does not support node drift when using `service.spec.externalTraffic=Local`, so it is not recommended.
+> - When using ALB in instance mode, specify the service as NodePort mode.
+> - Use the annotation `alb.ingress.kubernetes.io/inbound-cidrs` to restrict the source IP addresses that can access the NLB. This feature is associated with the annotation `alb.ingress.kubernetes.io/ip-address-type`. If the default mode is IPv4, the value is `0.0.0.0/0`. For dualstack, the default is `0.0.0.0/0, ::/0`.
+> - Use the annotation `alb.ingress.kubernetes.io/scheme` to specify whether the ALB should be exposed for public access or restricted to cross-VPC communication. The default value is `internal` for cross-VPC communication.
+> - To integrate multiple Ingress resources and share the same entry point, configure the annotation `alb.ingress.kubernetes.io/group.name` to specify a name. Ingress resources without this annotation are treated as an "implicit IngressGroup" composed by the Ingress itself.
+> - To specify the host for the Ingress, refer to[Configuring externalDNS](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/guide/integrations/external_dns/) to enable it.
diff --git a/docs/usage/install/overlay/get-started-calico-zh_cn.md b/docs/usage/install/overlay/get-started-calico-zh_cn.md
index e11db2d04..d5c8598bd 100644
--- a/docs/usage/install/overlay/get-started-calico-zh_cn.md
+++ b/docs/usage/install/overlay/get-started-calico-zh_cn.md
@@ -20,13 +20,6 @@
    ~# kubectl wait --for=condition=ready -l k8s-app=calico-node  pod -n kube-system 
    ```
 
-- 如果你的集群中每个节点 `/opt/cni/bin`下未安装 [cni plugins](https://www.cni.dev/plugins/current/) 。可参考以下的命令安装:
-
-   ```shell
-   ~# wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
-   ~# tar xvfzp ./cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
-   ```
-  
 - Helm 二进制
 
 ## 安装 Spiderpool
@@ -39,8 +32,9 @@
 ~# helm install spiderpool spiderpool/spiderpool --namespace kube-system  --set coordinator.mode=overlay --wait 
 ```
 
-> 默认情况下，Spiderpool 会自动安装 Multus 组件, 如果您已经在本地安装了 Multus, 你可以使用以下命令跳过安装 Multus: `helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.install=false` 
-> 需要指定 coordinator 运行在 overlay 模式
+> 如果您的集群未安装 Macvlan CNI, 可指定 Helm 参数 `--set plugins.installCNI=true` 安装 Macvlan 到每个节点。
+>
+> 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
 等待安装完成，查看 Spiderpool 组件状态:
 
diff --git a/docs/usage/install/overlay/get-started-calico.md b/docs/usage/install/overlay/get-started-calico.md
index 3b93d1940..0cec5987e 100644
--- a/docs/usage/install/overlay/get-started-calico.md
+++ b/docs/usage/install/overlay/get-started-calico.md
@@ -20,12 +20,6 @@ This page showcases the utilization of `Spiderpool`, a comprehensive Underlay ne
    ~# kubectl wait --for=condition=ready -l k8s-app=calico-node  pod -n kube-system 
    ```
 
-- If the [cni plugins](https://www.cni.dev/plugins/current/) are not installed under `/opt/cni/bin` on each node of your cluster, follow the commands below for installation:
-
-   ```shell
-   ~# wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
-   ~# tar xvfzp ./cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
-   ```
   
 - Helm binary
 
@@ -39,8 +33,9 @@ Follow the command below to install Spiderpool:
 ~# helm install spiderpool spiderpool/spiderpool --namespace kube-system  --set coordinator.mode=overlay --wait 
 ```
 
-> By default, Spiderpool automatically installs Multus. However, if Multus has been already installed, you can skip the installation via the following command: `helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.install=false` 
-> It is necessary to specify that the coordinator operates in overlay mode
+> If Macvlan CNI is not installed in your cluster, you can install it on each node by using the Helm parameter `--set plugins.installCNI=true`.
+>
+> Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
 Check the status of Spiderpool after the installation is complete:
 
diff --git a/docs/usage/install/overlay/get-started-cilium-zh_cn.md b/docs/usage/install/overlay/get-started-cilium-zh_cn.md
index caf3ecb36..3fbf7fbc0 100644
--- a/docs/usage/install/overlay/get-started-cilium-zh_cn.md
+++ b/docs/usage/install/overlay/get-started-cilium-zh_cn.md
@@ -21,13 +21,6 @@
    ~# kubectl wait --for=condition=ready -l k8s-app=cilium pod -n kube-system
    ```
 
-- 如果你的集群中每个节点 `/opt/cni/bin`下未安装 [cni plugins](https://www.cni.dev/plugins/current/) 。可参考以下的命令安装:
-
-   ```shell
-   ~# wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
-   ~# tar xvfzp ./cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
-   ```
-
 - Helm 二进制
 
 ## 安装 Spiderpool
@@ -40,8 +33,9 @@
 ~# helm install spiderpool spiderpool/spiderpool --namespace kube-system --set coordinator.mode=overlay --wait 
 ```
 
-> 默认情况下，Spiderpool 会自动安装 Multus 组件, 如果您已经在本地安装了 Multus, 你可以使用以下命令跳过安装 Multus: `helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.install=false`
-> 需要指定 coordinator 运行在 overlay 模式
+> 如果您的集群未安装 Macvlan CNI, 可指定 Helm 参数 `--set plugins.installCNI=true` 安装 Macvlan 到每个节点。
+>
+> 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
 等待安装完成，查看 Spiderpool 组件状态:
 
diff --git a/docs/usage/install/overlay/get-started-cilium.md b/docs/usage/install/overlay/get-started-cilium.md
index 07f101524..e1d171c3e 100644
--- a/docs/usage/install/overlay/get-started-cilium.md
+++ b/docs/usage/install/overlay/get-started-cilium.md
@@ -21,13 +21,6 @@ This page showcases the utilization of `Spiderpool`, a comprehensive Underlay ne
    ~# kubectl wait --for=condition=ready -l k8s-app=cilium pod -n kube-system
    ```
 
-- If the [cni plugins](https://www.cni.dev/plugins/current/) are not installed under `/opt/cni/bin` on each node of your cluster, follow the commands below for installation:
-
-   ```shell
-   ~# wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
-   ~# tar xvfzp ./cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
-   ```
-
 - Helm binary
 
 ## Install Spiderpool
@@ -40,8 +33,9 @@ Follow the command below to install Spiderpool:
 ~# helm install spiderpool spiderpool/spiderpool --namespace kube-system --set coordinator.mode=overlay --wait 
 ```
 
-> By default, Spiderpool automatically installs Multus. However, if Multus has been already installed, you can skip the installation via the following command: `helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.install=false`
-> It is necessary to specify that coordinator operates in overlay mode
+> If Macvlan CNI is not installed in your cluster, you can install it on each node by using the Helm parameter `--set plugins.installCNI=true`.
+>
+> Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
 Check the status of Spiderpool after the installation is complete:
 
diff --git a/docs/usage/install/underlay/get-started-calico-zh_CN.md b/docs/usage/install/underlay/get-started-calico-zh_CN.md
index c6f6845f7..cfee855f2 100644
--- a/docs/usage/install/underlay/get-started-calico-zh_CN.md
+++ b/docs/usage/install/underlay/get-started-calico-zh_CN.md
@@ -29,6 +29,8 @@ helm install spiderpool spiderpool/spiderpool --namespace kube-system --set mult
 ```
 
 > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
+>
+> 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
 创建 Pod 使用的 SpiderIPPool 实例:
 
diff --git a/docs/usage/install/underlay/get-started-calico.md b/docs/usage/install/underlay/get-started-calico.md
index 49d8e1739..7ad73dc87 100644
--- a/docs/usage/install/underlay/get-started-calico.md
+++ b/docs/usage/install/underlay/get-started-calico.md
@@ -29,6 +29,8 @@ helm install spiderpool spiderpool/spiderpool --namespace kube-system --set mult
 ```
 
 > If you are mainland user who is not available to access ghcr.io，You can specify the parameter `-set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pulling failures for Spiderpool.
+>
+> Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
 Create the SpiderIPPool instance used by the Pod:
 
diff --git a/docs/usage/install/underlay/get-started-macvlan-zh_CN.md b/docs/usage/install/underlay/get-started-macvlan-zh_CN.md
index 61cda8bd4..5de4fffc0 100644
--- a/docs/usage/install/underlay/get-started-macvlan-zh_CN.md
+++ b/docs/usage/install/underlay/get-started-macvlan-zh_CN.md
@@ -32,7 +32,7 @@ Spiderpool 可用作 Underlay 网络场景下提供固定 IP 的一种解决方
     > 
     > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
     >
-    > 通过 `multus.multusCNI.defaultCniCRName` 指定集群的 Multus clusterNetwork，clusterNetwork 是 Multus 插件的一个特定字段，用于指定 Pod 的默认网络接口。
+   > 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
 2. 创建 SpiderIPPool 实例。
 
diff --git a/docs/usage/install/underlay/get-started-macvlan.md b/docs/usage/install/underlay/get-started-macvlan.md
index 82c1c37d4..5cac8025c 100644
--- a/docs/usage/install/underlay/get-started-macvlan.md
+++ b/docs/usage/install/underlay/get-started-macvlan.md
@@ -30,7 +30,7 @@ Spiderpool provides a solution for assigning static IP addresses in underlay net
     >
     > If you are mainland user who is not available to access ghcr.io，You can specify the parameter `-set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pulling failures for Spiderpool.
     >
-    > Specify the Multus clusterNetwork of the cluster through `multus.multusCNI.defaultCniCRName`, clusterNetwork is a specific field of the Multus plugin, which is used to specify the default network interface of the Pod.
+    > Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
 2. Create a SpiderIPPool instance.
 
diff --git a/docs/usage/install/underlay/get-started-ovs-zh_CN.md b/docs/usage/install/underlay/get-started-ovs-zh_CN.md
index d3fbd3c31..d7dce5108 100644
--- a/docs/usage/install/underlay/get-started-ovs-zh_CN.md
+++ b/docs/usage/install/underlay/get-started-ovs-zh_CN.md
@@ -4,6 +4,8 @@
 
 Spiderpool 可用作 Underlay 网络场景下提供固定 IP 的一种解决方案，本文将以 [Multus](https://github.com/k8snetworkplumbingwg/multus-cni)、[Ovs-cni](https://github.com/k8snetworkplumbingwg/ovs-cni) 、[Spiderpool](https://github.com/spidernet-io/spiderpool) 为例，搭建一套完整的 Underlay 网络解决方案，该方案能将可用的网桥公开为节点资源，供集群使用。
 
+[`ovs-cni`](https://github.com/k8snetworkplumbingwg/ovs-cni) 是一个基于 Open vSwitch（OVS）的 Kubernetes CNI 插件，它提供了一种在 Kubernetes 集群中使用 OVS 进行网络虚拟化的方式。
+
 ## 先决条件
 
 1. 一个多节点的 Kubernetes 集群
@@ -19,36 +21,37 @@ Spiderpool 可用作 Underlay 网络场景下提供固定 IP 的一种解决方
     ~# sudo systemctl start openvswitch-switch
     ```
 
-## 安装 Ovs-cni
-
-[`ovs-cni`](https://github.com/k8snetworkplumbingwg/ovs-cni) 是一个基于 Open vSwitch（OVS）的 Kubernetes CNI 插件，它提供了一种在 Kubernetes 集群中使用 OVS 进行网络虚拟化的方式。
-
-确认节点上是否存在二进制文件 /opt/cni/bin/ovs 。如果节点上不存在该二进制文件，可在安装 Spiderpool 时通过指定 Helm 参数安装: 
-
-```bash
-helm install spiderpool spiderpool/spiderpool --namespace kube-system --set plugins.installOvsCNI=true
-```
-
-Ovs-cni 不会配置网桥，由用户创建它们，并将它们连接到 L2、L3 网络。以下是创建网桥的示例，请在每个节点上执行：
+## 安装 Spiderpool
 
-1. 创建 Open vSwitch 网桥。
+1. 安装 Spiderpool。
 
     ```bash
-    ~# ovs-vsctl add-br br1
+    helm repo add spiderpool https://spidernet-io.github.io/spiderpool
+    helm repo update spiderpool
+    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.multusCNI.defaultCniCRName="ovs-conf" --set plugins.installOvsCNI=true
     ```
 
-2. 网络接口连接到网桥
+    > 如果未安装 ovs-cni, 可以通过 Helm 参数 '-set plugins.installOvsCNI=true' 安装它。
+    >
+    > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 以帮助您快速的拉取镜像。
+    >
+    > 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
+
+2. 在每个节点上配置 Open vSwitch 网桥。
 
-    此过程取决于您的平台，以下命令只是示例说明，它可能会破坏您的系统。首先使用 `ip link show` 查询主机的可用接口，示例中使用主机上的接口：`eth0` 为例。
+    创建网桥并配置网桥，以 `eth0` 为例。
 
     ```bash
+    ~# ovs-vsctl add-br br1
     ~# ovs-vsctl add-port br1 eth0
     ~# ip addr add <IP地址>/<子网掩码> dev br1
     ~# ip link set br1 up
     ~# ip route add default via <默认网关IP> dev br1
     ```
 
-3. 创建后，可以在每个节点上查看到如下的网桥信息：
+    请把以上命令配置在系统行动脚本中，以在主机重启时能够生效
+
+    创建后，可以在每个节点上查看到如下的网桥信息：
 
     ```bash
     ~# ovs-vsctl show
@@ -64,22 +67,7 @@ Ovs-cni 不会配置网桥，由用户创建它们，并将它们连接到 L2、
         ovs_version: "2.17.3"
     ```
 
-## 安装 Spiderpool
-
-1. 安装 Spiderpool。
-
-    ```bash
-    helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-    helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.multusCNI.defaultCniCRName="ovs-conf" --set plugins.installOvsCNI=true
-    ```
-
-    > 如果未安装 ovs-cni, 可以通过 Helm 参数 '-set plugins.installOvsCNI=true' 安装它。
-    > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 以帮助您快速的拉取镜像。
-    >
-    > 通过 `multus.multusCNI.defaultCniCRName` 指定集群的 Multus clusterNetwork，clusterNetwork 是 Multus 插件的一个特定字段，用于指定 Pod 的默认网络接口。
-
-2. 创建 SpiderIPPool 实例。
+3. 创建 SpiderIPPool 实例。
 
     Pod 会从该 IP 池中获取 IP，进行 Underlay 的网络通讯，所以该 IP 池的子网需要与接入的 Underlay 子网对应。以下是创建相关的 SpiderIPPool 示例：
 
@@ -100,7 +88,7 @@ Ovs-cni 不会配置网桥，由用户创建它们，并将它们连接到 L2、
     EOF
     ```
 
-3. 验证安装：
+4. 验证安装：
 
     ```bash
     ~# kubectl get po -n kube-system |grep spiderpool
@@ -115,7 +103,7 @@ Ovs-cni 不会配置网桥，由用户创建它们，并将它们连接到 L2、
     ~# 
     ```
 
-4. Spiderpool 为简化书写 JSON 格式的 Multus CNI 配置，它提供了 SpiderMultusConfig CR 来自动管理 Multus NetworkAttachmentDefinition CR。如下是创建 Ovs SpiderMultusConfig 配置的示例：
+5. Spiderpool 为简化书写 JSON 格式的 Multus CNI 配置，它提供了 SpiderMultusConfig CR 来自动管理 Multus NetworkAttachmentDefinition CR。如下是创建 Ovs SpiderMultusConfig 配置的示例：
 
     * 确认 ovs-cni 所需的网桥名称，本例子以 br1 为例:
 
diff --git a/docs/usage/install/underlay/get-started-ovs.md b/docs/usage/install/underlay/get-started-ovs.md
index 2a7dd5d64..3eafe10ec 100644
--- a/docs/usage/install/underlay/get-started-ovs.md
+++ b/docs/usage/install/underlay/get-started-ovs.md
@@ -4,6 +4,8 @@
 
 Spiderpool can be used as a solution to provide fixed IPs in an Underlay network scenario, and this article will use [Multus](https://github.com/k8snetworkplumbingwg/multus-cni), [Ovs-cni](https://github.com/k8snetworkplumbingwg/ovs-cni), and [Spiderpool](https://github.com/spidernet-io/spiderpool) as examples to build a complete Underlay network solution that exposes the available bridges as node resources for use by the cluster.
 
+[`ovs-cni`](https://github.com/k8snetworkplumbingwg/ovs-cni) is a Kubernetes CNI plugin that utilizes Open vSwitch (OVS) to enable network virtualization within a Kubernetes cluster.
+
 ## Prerequisites
 
 1. Make sure a multi-node Kubernetes cluster is ready.
@@ -19,36 +21,37 @@ Spiderpool can be used as a solution to provide fixed IPs in an Underlay network
     ~# sudo systemctl start openvswitch-switch
     ```
 
-## Install Ovs-cni
-
-[`ovs-cni`](https://github.com/k8snetworkplumbingwg/ovs-cni) is a Kubernetes CNI plugin based on Open vSwitch (OVS) that provides a way to use OVS for network virtualization in a Kubernetes cluster in a Kubernetes cluster.
-
-Verify that the binary /opt/cni/bin/ovs exists on the node. if the binary is missing, you can install it on all nodes by using the following command when you installing spiderpool:
-
-```bash
-helm install spiderpool spiderpool/spiderpool --namespace kube-system --set plugins.installOvsCNI=true
-```
-
-Note: Ovs-cni does not configure bridges, it is up to the user to create them and connect them to L2, L3, The following is an example of creating a bridge, to be executed on each node:
+## Install Spiderpool
 
-1. Create an Open vSwitch bridge.
+1. Install Spiderpool.
 
     ```bash
-    ~# ovs-vsctl add-br br1
+    helm repo add spiderpool https://spidernet-io.github.io/spiderpool
+    helm repo update spiderpool
+    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.multusCNI.defaultCniCRName="ovs-conf" --set plugins.installOvsCNI=true
     ```
 
-2. Network interface connected to the bridge：
+    > If ovs-cni is not installed, you can install it by specifying the Helm parameter `--set plugins.installOvsCNI=true`.
+    >
+    > If you are mainland user who is not available to access ghcr.io，You can specify the parameter `-set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pulling failures for Spiderpool.
+    >
+    > Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
+
+2. To configure Open vSwitch bridges on each node:
 
-    This procedure depends on your platform, the following commands are only example instructions and it may break your system. First use `ip link show` to query the host for available interfaces, the example uses the interface on the host: `eth0` as an example.
+    Create a bridge and configure it using `eth0`` as an example.
 
     ```bash
+    ~# ovs-vsctl add-br br1
     ~# ovs-vsctl add-port br1 eth0
-    ~# ip addr add <IP地址>/<子网掩码> dev br1
+    ~# ip addr add <IP address>/<subnet mask> dev br1
     ~# ip link set br1 up
-    ~# ip route add default via <默认网关IP> dev br1
+    ~# ip route add default via <default gateway IP> dev br1
     ```
 
-3. Once created, the following bridge information can be viewed on each node:
+    Pleade include these commands in your system startup script to ensure they take effect after host restarts.
+
+    After creating the bridge, you will be able to view its information on each node:
 
     ```bash
     ~# ovs-vsctl show
@@ -64,25 +67,9 @@ Note: Ovs-cni does not configure bridges, it is up to the user to create them an
         ovs_version: "2.17.3"
     ```
 
-## Install Spiderpool
-
-1. Install Spiderpool
-
-    ```bash
-    helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-    helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.multusCNI.defaultCniCRName="ovs-conf" --set plugins.installOvsCNI=true
-    ```
-    
-    > If Ovs-cni is not installed in your cluster, you can specify the Helm parameter `--set plugins.installOvsCNI=true` to install Macvlan in your cluster.
-    >
-    > If you are mainland user who is not available to access ghcr.io，You can specify the parameter `-set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pulling failures for Spiderpool.
-    >
-    > Specify the Multus clusterNetwork of the cluster through `multus.multusCNI.defaultCniCRName`, clusterNetwork is a specific field of the Multus plugin, which is used to specify the default network interface of the Pod.
-
-2. Create a SpiderIPPool instance.
+3. Create a SpiderIPPool instance.
 
-    The Pod will obtain an IP address from the IPPool for underlying network communication, so the subnet of the IPPool needs to correspond to the underlying subnet being accessed.
+    The Pod will obtain an IP address from the IP pool for underlying network communication, so the subnet of the IP pool needs to correspond to the underlying subnet being accessed.
 
     Here is an example of creating a SpiderSubnet instance:
 
@@ -103,7 +90,7 @@ Note: Ovs-cni does not configure bridges, it is up to the user to create them an
     EOF
     ```
 
-3. Verify the installation：
+4. Verify the installation：
 
     ```bash
     ~# kubectl get po -n kube-system |grep spiderpool
@@ -118,9 +105,9 @@ Note: Ovs-cni does not configure bridges, it is up to the user to create them an
     ~# 
     ```
 
-4. To simplify writing Multus CNI configuration in JSON format, Spiderpool provides SpiderMultusConfig CR to automatically manage Multus NetworkAttachmentDefinition CR. Here is an example of creating an ovs-cni SpiderMultusConfig configuration:
+5. To simplify writing Multus CNI configuration in JSON format, Spiderpool provides SpiderMultusConfig CR to automatically manage Multus NetworkAttachmentDefinition CR. Here is an example of creating an ovs-cni SpiderMultusConfig configuration:
 
-    * Confirm the required host bridge for ovs-cni, for example based on the command `ovs-vsctl show`, this example takes the host bridge: `br1` as an example.
+    * Confirm the bridge name for ovs-cni. Take the host bridge: `br1` as an example:
 
     ```shell
     BRIDGE_NAME="br1"
@@ -137,7 +124,7 @@ Note: Ovs-cni does not configure bridges, it is up to the user to create them an
     EOF
     ```
 
-## Create applications
+## Create Applications
 
 In the following example Yaml, 2 copies of the Deployment are created, of which:
 
diff --git a/docs/usage/install/underlay/get-started-sriov-zh_CN.md b/docs/usage/install/underlay/get-started-sriov-zh_CN.md
index 9ddfccbbd..e5fbc1f4a 100644
--- a/docs/usage/install/underlay/get-started-sriov-zh_CN.md
+++ b/docs/usage/install/underlay/get-started-sriov-zh_CN.md
@@ -37,11 +37,14 @@ Spiderpool 可用作 underlay 网络场景下提供固定 IP 的一种解决方
     ```shell
     helm repo add spiderpool https://spidernet-io.github.io/spiderpool
     helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set sriov.install=true 
+    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set sriov.install=true --set multus.multusCNI.defaultCniCRName="sriov-test"
     ```
 
     > 带上 helm 选项 ` --set sriov.install=true `， 会安装 [sriov-network-operator](https://github.com/k8snetworkplumbingwg/sriov-network-operator)，resourcePrefix 默认为 "spidernet.io"，可通过 helm 选项 ` --set sriov.resourcePrefix ` 修改
+    >
     > 如果您是国内用户，可以指定参数 ` --set global.imageRegistryOverride=ghcr.m.daocloud.io ` 避免 Spiderpool 的镜像拉取失败。
+    >
+    > 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
 2. 给希望运行 SR-IOV CNI 的节点，按照如下命令打上 label，这样，sriov-network-operator 才会在指定的节点上安装组件
 
diff --git a/docs/usage/install/underlay/get-started-sriov.md b/docs/usage/install/underlay/get-started-sriov.md
index 8a3f5757b..510ab9e0e 100644
--- a/docs/usage/install/underlay/get-started-sriov.md
+++ b/docs/usage/install/underlay/get-started-sriov.md
@@ -37,11 +37,14 @@ Spiderpool provides a solution for assigning static IP addresses in underlay net
     ```shell
     helm repo add spiderpool https://spidernet-io.github.io/spiderpool
     helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set sriov.install=true 
+    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set sriov.install=true --set multus.multusCNI.defaultCniCRName="sriov-test"
     ```
 
     > When using the helm option `--set sriov.install=true`, it will install the [sriov-network-operator](https://github.com/k8snetworkplumbingwg/sriov-network-operator). The default value for resourcePrefix is "spidernet.io" which can be modified via the helm option `--set sriov.resourcePrefix`.
+    >
     > For users in the Chinese mainland, it is recommended to specify the spec `--set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pull failures from Spiderpool.
+    >
+    > Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
 2. To enable the SR-IOV CNI on specific nodes, you need to apply the following command to label those nodes. This will allow the sriov-network-operator to install the components on the designated nodes.
 
diff --git a/docs/usage/install/underlay/get-started-weave-zh_CN.md b/docs/usage/install/underlay/get-started-weave-zh_CN.md
index 6268d8fe9..69e9c1fde 100644
--- a/docs/usage/install/underlay/get-started-weave-zh_CN.md
+++ b/docs/usage/install/underlay/get-started-weave-zh_CN.md
@@ -34,6 +34,8 @@
     ```
 
     > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
+    >
+    > 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
     等待 Pod Running， 创建 Pod 所使用的 IP 池:
 
diff --git a/docs/usage/install/underlay/get-started-weave.md b/docs/usage/install/underlay/get-started-weave.md
index 569fb5a25..8b29c82c0 100644
--- a/docs/usage/install/underlay/get-started-weave.md
+++ b/docs/usage/install/underlay/get-started-weave.md
@@ -34,6 +34,8 @@
     ```
 
     > If you are mainland user who is not available to access ghcr.io，You can specify the parameter `-set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pulling failures for Spiderpool.
+    >
+    > Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
     Wait for Pod Running and create the IPPool used by Pod:
 
diff --git a/docs/usage/kubevirt-zh_CN.md b/docs/usage/kubevirt-zh_CN.md
index 0c719baa9..fd63699ab 100644
--- a/docs/usage/kubevirt-zh_CN.md
+++ b/docs/usage/kubevirt-zh_CN.md
@@ -46,7 +46,8 @@ Kubevirt VM 会在以下一些场景中会出现固定地址的使用：
 
 ### 安装 Spiderpool
 
-请参考 [Macvlan Quick Start](./install/underlay/get-started-macvlan-zh_CN.md)
+请参考 [Macvlan Quick Start](./install/underlay/get-started-macvlan-zh_CN.md) 安装 Spiderpool. 其中，可确保 helm 安装选项 `ipam.enableKubevirtStaticIP=true`
+
 
 ### 创建 Kubevirt VM 应用
 
diff --git a/docs/usage/network-topology-zh_CN.md b/docs/usage/network-topology-zh_CN.md
index 83f84181c..c9d0ce4fe 100644
--- a/docs/usage/network-topology-zh_CN.md
+++ b/docs/usage/network-topology-zh_CN.md
@@ -53,9 +53,11 @@ helm repo update spiderpool
 helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.multusCNI.defaultCniCRName="macvlan-conf"
 ```
 
-> 如果您使用的是中国大陆的云厂商服务器，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` ，以帮助您更快的拉取镜像。
+> - 如果您使用的是中国大陆的云厂商服务器，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` ，以帮助您更快的拉取镜像。
 >
-> 通过 `multus.multusCNI.defaultCniCRName` 指定集群的 Multus clusterNetwork，clusterNetwork 是 Multus 插件的一个特定字段，用于指定 Pod 的默认网络接口。
+> - 如果您的集群未安装 Macvlan CNI, 可指定 Helm 参数 `--set plugins.installCNI=true` 安装 Macvlan 到每个节点。
+>
+> - 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
 - 检查安装完成
 
diff --git a/docs/usage/network-topology.md b/docs/usage/network-topology.md
index a2d62844c..540d0fed4 100644
--- a/docs/usage/network-topology.md
+++ b/docs/usage/network-topology.md
@@ -58,9 +58,11 @@ helm repo update spiderpool
 helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.multusCNI.defaultCniCRName="macvlan-conf"
 ```
 
-> If you are mainland user who is not available to access ghcr.io，You can specify the parameter `-set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pulling failures for Spiderpool.
+> If you are using a cloud server from a Chinese mainland cloud provider, you can enhance image pulling speed by specifying the parameter `--set global.imageRegistryOverride=ghcr.m.daocloud.io`.
 >
-> Specify the Multus clusterNetwork of the cluster through `multus.multusCNI.defaultCniCRName`, clusterNetwork is a specific field of the Multus plugin, which is used to specify the default network interface of the Pod.
+> If Macvlan CNI is not installed in your cluster, you can install it on each node by using the Helm parameter `--set plugins.installCNI=true`.
+>
+> Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
 Verify the installation：
 
diff --git a/docs/usage/rdma-zh_CN.md b/docs/usage/rdma-zh_CN.md
index 885076e52..890fc3abb 100644
--- a/docs/usage/rdma-zh_CN.md
+++ b/docs/usage/rdma-zh_CN.md
@@ -43,24 +43,24 @@ RDMA 网卡，也可以基于 SR-IOV CNI 来使用 exclusive 模式的网卡。
         af:00.0 Ethernet controller [0200]: Mellanox Technologies MT27800 Family [ConnectX-5] [15b3:1017]
         af:00.1 Ethernet controller [0200]: Mellanox Technologies MT27800 Family [ConnectX-5] [15b3:1017]
 
-3. 可参考 [安装](./install/underlay/get-started-macvlan-zh_CN.md) 安装 Spiderpool 并配置 sriov-network-operator。其中，安装命令务必加上如下 helm 选项以安装 [RDMA shared device plugin](https://github.com/Mellanox/k8s-rdma-shared-dev-plugin)：
+3. 安装 Spiderpool 并配置 sriov-network-operator：
 
         helm install spiderpool spiderpool/spiderpool -n kube-system \
-           --set multus.multusCNI.defaultCniCRName="macvlan-conf" \
+           --set multus.multusCNI.defaultCniCRName="macvlan-ens6f0np0" \
            --set rdma.rdmaSharedDevicePlugin.install=true \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.resourcePrefix="spidernet.io" \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.resourceName="hca_shared_devices" \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.rdmaHcaMax=500 \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.vendors="15b3" \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.deviceIDs="1017"
-       
-    > 如果您的集群未安装 Macvlan CNI, 可指定 Helm 参数 `--set plugins.installCNI=true` 安装 Macvlan 到每个节点。
-    > 
-    > 如果您的集群未安装 Rdma CNI, 可指定 Helm 参数 `--set plugins.installRdmaCNI=true` 安装 rdma 到每个节点。
-    > 
-    > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
+
+    > - 如果您的集群未安装 Macvlan CNI, 可指定 Helm 参数 `--set plugins.installCNI=true` 安装 Macvlan 到每个节点。
+    >
+    > - 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
+    >
+    > - 完成 Spiderpool 安装后，可以手动编辑 configmap spiderpool-rdma-shared-device-plugin 来重新配置 RDMA shared device plugin。
     >
-    > 完成 Spiderpool 安装后，可以手动编辑 configmap spiderpool-rdma-shared-device-plugin 来重新配置 RDMA shared device plugin。
+    > - 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
     完成后，安装的组件如下
 
@@ -90,11 +90,11 @@ RDMA 网卡，也可以基于 SR-IOV CNI 来使用 exclusive 模式的网卡。
           ]     
 
     > 如果上报的资源数为 0，可能的原因：
-    > 
+    >
     > (1) 请确认 configmap spiderpool-rdma-shared-device-plugin 中的 vendors 和 deviceID 与实际相符
-    > 
+    >
     > (2) 查看 rdma-shared-device-plugin 的日志，对于支持 RDMA 网卡报错如下日志，可尝试在主机上安装 apt-get install rdma-core 或 dnf install rdma-core
-    > 
+    >
     >   `error creating new device: "missing RDMA device spec for device 0000:04:00.0, RDMA device \"issm\" not found"`
 
 5. 基于 RDMA 网卡作为 master 节点，创建 macvlan 相关的 multus 配置，并创建配套的 ippool 资源
@@ -220,11 +220,11 @@ RDMA 网卡，也可以基于 SR-IOV CNI 来使用 exclusive 模式的网卡。
     本示例环境中，宿主机上具备 RoCE 功能的 mellanox ConnectX 5 网卡，可按照 [NVIDIA 官方指导](https://developer.nvidia.com/networking/ethernet-software) 安装最新的 OFED 驱动。
 
     > 要隔离使用 RDMA 网卡，务必满足如下其中一个条件：
-    > 
+    >
     > (1) 内核版本要求 5.3.0 或更高版本，并在系统中加载 RDMA 模块。rdma-core 软件包提供了在系统启动时自动加载相关模块的功能。
-    > 
+    >
     > (2) Mellanox OFED 要求 4.7 或更高版本。此时不需要使用 5.3.0 或更新版本的内核。
-    
+
     使用如下命令，可查询到 RDMA 设备：
 
         ~# rdma link show
@@ -242,7 +242,7 @@ RDMA 网卡，也可以基于 SR-IOV CNI 来使用 exclusive 模式的网卡。
         netns exclusive copy-on-fork on
 
     确认网卡具备 SR-IOV 功能，查看支持的最大 VF 数量：
-   
+
         ~# cat /sys/class/net/ens6f0np0/device/sriov_totalvfs
         127
 
@@ -256,15 +256,18 @@ RDMA 网卡，也可以基于 SR-IOV CNI 来使用 exclusive 模式的网卡。
         af:00.0 Ethernet controller [0200]: Mellanox Technologies MT27800 Family [ConnectX-5] [15b3:1017]
         af:00.1 Ethernet controller [0200]: Mellanox Technologies MT27800 Family [ConnectX-5] [15b3:1017]
 
-3. 可参考 [安装](./install/underlay/get-started-sriov-zh_CN.md) 安装 Spiderpool，其中，务必加上如下 helm 选项来安装 [RDMA CNI](https://github.com/k8snetworkplumbingwg/rdma-cni)
+3. 安装 Spiderpool
 
         helm install spiderpool spiderpool/spiderpool -n kube-system \
            --set sriov.install=true  \
-           --set rdma.rdmaCni.install=true
+           --set plugins.installRdmaCNI=true=true \
+           --set multus.multusCNI.defaultCniCRName="sriov-rdma"
 
-    > 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
+    > - 如果您是国内用户，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` 避免 Spiderpool 的镜像拉取失败。
+    >
+    > - 完成 Spiderpool 安装后，可以手动编辑 configmap spiderpool-rdma-shared-device-plugin 来重新配置 RDMA shared device plugin
     >
-    > 完成 Spiderpool 安装后，可以手动编辑 configmap spiderpool-rdma-shared-device-plugin 来重新配置 RDMA shared device plugin
+    > - 通过 `multus.multusCNI.defaultCniCRName` 指定 multus 默认使用的 CNI 的 NetworkAttachmentDefinition 实例名。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，则安装后会自动生成一个数据为空的 NetworkAttachmentDefinition 对应实例。如果 `multus.multusCNI.defaultCniCRName` 选项不为空，会尝试通过 /etc/cni/net.d 目录下的第一个 CNI 配置来创建对应的 NetworkAttachmentDefinition 实例，否则会自动生成一个名为 `default` 的 NetworkAttachmentDefinition 实例，以完成 multus 的安装。
 
     完成后，安装的组件如下
 
diff --git a/docs/usage/rdma.md b/docs/usage/rdma.md
index 2072b1037..6a40db199 100644
--- a/docs/usage/rdma.md
+++ b/docs/usage/rdma.md
@@ -42,24 +42,24 @@ The following steps demonstrate how to enable shared usage of RDMA devices by Po
         af:00.0 Ethernet controller [0200]: Mellanox Technologies MT27800 Family [ConnectX-5] [15b3:1017]
         af:00.1 Ethernet controller [0200]: Mellanox Technologies MT27800 Family [ConnectX-5] [15b3:1017]
 
-3. Refer to [the installation guide](./install/underlay/get-started-macvlan.md) to install Spiderpool and configure sriov-network-operator. Make sure to include the following Helm options in the commands for installing the RDMA shared device plugin:
+3. Install Spiderpool and configure sriov-network-operator:
 
         helm install spiderpool spiderpool/spiderpool -n kube-system \
-           --set multus.multusCNI.defaultCniCRName="macvlan-conf" \
+           --set multus.multusCNI.defaultCniCRName="macvlan-ens6f0np0" \
            --set rdma.rdmaSharedDevicePlugin.install=true \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.resourcePrefix="spidernet.io" \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.resourceName="hca_shared_devices" \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.rdmaHcaMax=500 \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.vendors="15b3" \
            --set rdma.rdmaSharedDevicePlugin.deviceConfig.deviceIDs="1017"
-       
-    > If Macvlan is not installed in your cluster, you can specify the Helm parameter `--set plugins.installCNI=true` to install Macvlan in your cluster.
+
+    > - If Macvlan is not installed in your cluster, you can specify the Helm parameter `--set plugins.installCNI=true` to install Macvlan in your cluster.
     >
-    > If Rdma CNI is not installed in your cluster, you can specify the Helm parameter `--set plugins.installRdmaCNI=true` to install Rdma-cni in your cluster.
+    > - If you are a user from China, you can specify the parameter `--set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pull failures from Spiderpool.
     >
-    > If you are a user from China, you can specify the parameter `--set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pull failures from Spiderpool.
+    > - After completing the installation of Spiderpool, you can manually edit the spiderpool-rdma-shared-device-plugin configmap to reconfigure the RDMA shared device plugin.
     >
-    > After completing the installation of Spiderpool, you can manually edit the spiderpool-rdma-shared-device-plugin configmap to reconfigure the RDMA shared device plugin.
+    > - Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
     Once the installation is complete, the following components will be installed:
 
@@ -89,11 +89,11 @@ The following steps demonstrate how to enable shared usage of RDMA devices by Po
           ]     
 
     > If the reported resource count is 0, it may be due to the following reasons:
-    > 
+    >
     > (1) Verify that the vendors and deviceID in the spiderpool-rdma-shared-device-plugin configmap match the actual values.
-    > 
+    >
     > (2) Check the logs of the rdma-shared-device-plugin. If you encounter errors related to RDMA NIC support, try installing apt-get install rdma-core or dnf install rdma-core on the host machine.
-    > 
+    >
     >   `error creating new device: "missing RDMA device spec for device 0000:04:00.0, RDMA device \"issm\" not found"`
 
 5. Create macvlan-related multus configurations using an RDMA card as the master node and set up the corresponding ippool resources:
@@ -219,11 +219,11 @@ The following steps demonstrate how to enable isolated usage of RDMA devices by
     In our demo environment, the host machine is equipped with a Mellanox ConnectX-5 NIC with RoCE capabilities. Follow [the official NVIDIA guide](https://developer.nvidia.com/networking/ethernet-software) to install the latest OFED driver.
 
     > To isolate the usage of an RDMA network card, ensure that at least one of the following conditions is met:
-    > 
+    >
     > (1) Kernel based on 5.3.0 or newer, RDMA modules loaded in the system. rdma-core package provides means to automatically load relevant modules on system start
-    > 
+    >
     > (2) Mellanox OFED version 4.7 or newer is required. In this case it is not required to use a Kernel based on 5.3.0 or newer.
-    
+
     To confirm the presence of RDMA devices, use the following command:
 
         ~# rdma link show
@@ -241,7 +241,7 @@ The following steps demonstrate how to enable isolated usage of RDMA devices by
         netns exclusive copy-on-fork on
 
     To verify if the network card has SR-IOV functionality, check the maximum number of supported VFs:
-   
+
         ~# cat /sys/class/net/ens6f0np0/device/sriov_totalvfs
         127
 
@@ -255,15 +255,17 @@ The following steps demonstrate how to enable isolated usage of RDMA devices by
         af:00.0 Ethernet controller [0200]: Mellanox Technologies MT27800 Family [ConnectX-5] [15b3:1017]
         af:00.1 Ethernet controller [0200]: Mellanox Technologies MT27800 Family [ConnectX-5] [15b3:1017]
 
-3. Refer to [the installation guide](./install/underlay/get-started-sriov.md) to install Spiderpool. Make sure to include the following Helm options in the commands for installing [RDMA CNI](https://github.com/k8snetworkplumbingwg/rdma-cni):
+3. Install Spiderpool
 
         helm install spiderpool spiderpool/spiderpool -n kube-system \
            --set sriov.install=true  \
-           --set rdma.rdmaCni.install=true
+           --set plugins.installRdmaCNI=true
 
-    > If you are a user from China, you can specify the parameter `--set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pull failures from Spiderpool.
+    > - If you are a user from China, you can specify the parameter `--set global.imageRegistryOverride=ghcr.m.daocloud.io` to avoid image pull failures from Spiderpool.
+    >
+    > - After completing the installation of Spiderpool, you can manually edit the spiderpool-rdma-shared-device-plugin configmap to reconfigure the RDMA shared device plugin.
     >
-    > After completing the installation of Spiderpool, you can manually edit the spiderpool-rdma-shared-device-plugin configmap to reconfigure the RDMA shared device plugin.
+    > - Specify the name of the NetworkAttachmentDefinition instance for the default CNI used by Multus via `multus.multusCNI.defaultCniCRName`. If the `multus.multusCNI.defaultCniCRName` option is provided, an empty NetworkAttachmentDefinition instance will be automatically generated upon installation. Otherwise, Multus will attempt to create a NetworkAttachmentDefinition instance based on the first CNI configuration found in the /etc/cni/net.d directory. If no suitable configuration is found, a NetworkAttachmentDefinition instance named `default` will be created to complete the installation of Multus.
 
     Once the installation is complete, the following components will be installed:
         ~# kubectl get pod -n kube-system
diff --git a/docs/usage/reserved-ip-zh_CN.md b/docs/usage/reserved-ip-zh_CN.md
index 93d0e6174..fba0742dd 100644
--- a/docs/usage/reserved-ip-zh_CN.md
+++ b/docs/usage/reserved-ip-zh_CN.md
@@ -26,28 +26,7 @@ ReservedIP 中的 IP 地址可以是：
 
 ### 安装 Spiderpool
 
-1. 通过 helm 安装 Spiderpool。
-
-    ```bash
-    helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-    helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system  --set multus.multusCNI.defaultCniCRName="macvlan-ens192" 
-    ```
-
-    > 如果您所在地区是中国大陆，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` ，以帮助您更快的拉取镜像。
-    >
-    > 通过 `multus.multusCNI.defaultCniCRName` 指定集群的 Multus clusterNetwork，clusterNetwork 是 Multus 插件的一个特定字段，用于指定 Pod 的默认网络接口。
-
-2. 检查安装完成
-
-    ```bash
-    ~# kubectl get po -n kube-system | grep spiderpool
-    NAME                                     READY   STATUS      RESTARTS   AGE                                
-    spiderpool-agent-7hhkz                   1/1     Running     0          13m
-    spiderpool-agent-kxf27                   1/1     Running     0          13m
-    spiderpool-controller-76798dbb68-xnktr   1/1     Running     0          13m
-    spiderpool-init                          0/1     Completed   0          13m
-    ```
+可参考 [安装](./readme-zh_CN.md) 安装 Spiderpool.
 
 ### 安装 CNI 配置
 
diff --git a/docs/usage/reserved-ip.md b/docs/usage/reserved-ip.md
index d9e0df285..efc5f9ed2 100644
--- a/docs/usage/reserved-ip.md
+++ b/docs/usage/reserved-ip.md
@@ -26,28 +26,7 @@ The IP addresses specified in the ReservedIP CR serve two purposes:
 
 ### Install Spiderpool
 
-1. Install Spiderpool through Helm:
-
-    ```bash
-    helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-    helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system  --set multus.multusCNI.defaultCniCRName="macvlan-ens192" 
-    ```
-
-    > For users in the Chinese mainland, it is recommended to specify the spec `--set global.imageRegistryOverride=ghcr.m.daocloud.io` to accelerate image pulling.
-    >
-    > You can specify the Multus clusterNetwork for your cluster using `multus.multusCNI.defaultCniCRName`. The clusterNetwork is a specific field of the Multus plugin that defines the default network interface for Pods.
-
-2. Check if the installation is successful.
-
-    ```bash
-    ~# kubectl get po -n kube-system | grep spiderpool
-    NAME                                     READY   STATUS      RESTARTS   AGE                                
-    spiderpool-agent-7hhkz                   1/1     Running     0          13m
-    spiderpool-agent-kxf27                   1/1     Running     0          13m
-    spiderpool-controller-76798dbb68-xnktr   1/1     Running     0          13m
-    spiderpool-init                          0/1     Completed   0          13m
-    ```
+Refer to [Installation](./readme.md) to install Spiderpool.
 
 ### Install CNI
 
diff --git a/docs/usage/route-zh_CN.md b/docs/usage/route-zh_CN.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/usage/route.md b/docs/usage/route.md
index 8aad8228d..12525f6e4 100644
--- a/docs/usage/route.md
+++ b/docs/usage/route.md
@@ -1,5 +1,7 @@
 # Route support
 
+**English** ｜ [**简体中文**](./route-zh_CN.md)
+
 ## Description
 
 Spiderpool supports the configuration of routing information.
diff --git a/docs/usage/service-zh_CN.md b/docs/usage/service-zh_CN.md
index e69de29bb..335b3e141 100644
--- a/docs/usage/service-zh_CN.md
+++ b/docs/usage/service-zh_CN.md
@@ -0,0 +1,3 @@
+# Service
+
+**简体中文** | [**English**](./service.md)
diff --git a/docs/usage/service.md b/docs/usage/service.md
new file mode 100644
index 000000000..0a7a0b039
--- /dev/null
+++ b/docs/usage/service.md
@@ -0,0 +1,3 @@
+# Service
+
+**English** ｜ [**简体中文**](./service-zh_CN.md)
diff --git a/docs/usage/spider-multus-config-zh_CN.md b/docs/usage/spider-multus-config-zh_CN.md
index 999999134..e4fd4a073 100644
--- a/docs/usage/spider-multus-config-zh_CN.md
+++ b/docs/usage/spider-multus-config-zh_CN.md
@@ -40,26 +40,7 @@ Spidermultusconfig CR 基于 `spec` 中的定义自动生成 Multus CR，改进
 
 ### 安装 Spiderpool
 
-- 通过 helm 安装 Spiderpool.
-
-```bash
-helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-helm repo update spiderpool
-helm install spiderpool spiderpool/spiderpool --namespace kube-system
-```
-
-> 如果您所在地区是中国大陆，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` ，以帮助您更快的拉取镜像。
-
-- 检查安装完成
-
-    ```bash
-    ~# kubectl get po -n kube-system | grep spiderpool
-    NAME                                     READY   STATUS      RESTARTS   AGE                                
-    spiderpool-agent-7hhkz                   1/1     Running     0          13m
-    spiderpool-agent-kxf27                   1/1     Running     0          13m
-    spiderpool-controller-76798dbb68-xnktr   1/1     Running     0          13m
-    spiderpool-init                          0/1     Completed   0          13m
-    ```
+可参考 [安装](./readme-zh_CN.md) 安装 Spiderpool.
 
 ### 创建 CNI 配置
 
diff --git a/docs/usage/spider-multus-config.md b/docs/usage/spider-multus-config.md
index 234ef88e0..ab0d8c81f 100644
--- a/docs/usage/spider-multus-config.md
+++ b/docs/usage/spider-multus-config.md
@@ -40,26 +40,7 @@ To address these issues, SpiderMultusConfig automatically generates the Multus C
 
 ### Install Spiderpool
 
-- Install Spiderpool via Helm.
-
-```bash
-helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-helm repo update spiderpool
-helm install spiderpool spiderpool/spiderpool --namespace kube-system
-```
-
-> For users in the Chinese mainland, it is recommended to specify the spec `--set global.imageRegistryOverride=ghcr.m.daocloud.io` to accelerate image pulling.
-
-- Check if the installation is completed
-
-    ```bash
-    ~# kubectl get po -n kube-system | grep spiderpool
-    NAME                                     READY   STATUS      RESTARTS   AGE                                
-    spiderpool-agent-7hhkz                   1/1     Running     0          13m
-    spiderpool-agent-kxf27                   1/1     Running     0          13m
-    spiderpool-controller-76798dbb68-xnktr   1/1     Running     0          13m
-    spiderpool-init                          0/1     Completed   0          13m
-    ```
+Refer to [Installation](./readme.md) to install Spiderpool.
 
 ### Create CNI Configurations
 
diff --git a/docs/usage/spider-subnet-zh_CN.md b/docs/usage/spider-subnet-zh_CN.md
index e199accf3..4a4501acd 100644
--- a/docs/usage/spider-subnet-zh_CN.md
+++ b/docs/usage/spider-subnet-zh_CN.md
@@ -28,28 +28,7 @@ SpiderSubnet 功能还支持众多的控制器，如：ReplicaSet、Deployment
 
 ### 安装 Spiderpool
 
-- 通过 helm 安装 Spiderpool。
-
-```bash
-helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-helm repo update spiderpool
-helm install spiderpool spiderpool/spiderpool --namespace kube-system --set ipam.enableSpiderSubnet=true --set multus.multusCNI.defaultCniCRName="macvlan-ens192" 
-```
-
-> 如果您所在地区是中国大陆，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` ，以帮助您更快的拉取镜像。
->
-> 通过 `multus.multusCNI.defaultCniCRName` 指定集群的 Multus clusterNetwork，clusterNetwork 是 Multus 插件的一个特定字段，用于指定 Pod 的默认网络接口。
-
-- 检查安装完成
-
-```bash
-~# kubectl get po -n kube-system | grep spiderpool
-NAME                                     READY   STATUS      RESTARTS   AGE                                
-spiderpool-agent-7hhkz                   1/1     Running     0          13m
-spiderpool-agent-kxf27                   1/1     Running     0          13m
-spiderpool-controller-76798dbb68-xnktr   1/1     Running     0          13m
-spiderpool-init                          0/1     Completed   0          13m
-```
+可参考 [安装](./readme-zh_CN.md) 安装 Spiderpool. 其中，务必确保 helm 安装选项 `ipam.enableSpiderSubnet=true`
 
 ### 安装 CNI 配置
 
diff --git a/docs/usage/spider-subnet.md b/docs/usage/spider-subnet.md
index 84ac162f5..2025adf0e 100644
--- a/docs/usage/spider-subnet.md
+++ b/docs/usage/spider-subnet.md
@@ -29,28 +29,7 @@ SpiderSubnet also supports several controllers, including ReplicaSet, Deployment
 
 ### Install Spiderpool
 
-1. Install Spiderpool through Helm:
-
-    ```bash
-    helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-    helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set ipam.enableSpiderSubnet=true --set multus.multusCNI.defaultCniCRName="macvlan-ens192" 
-    ```
-
-    > For users in the Chinese mainland, it is recommended to specify the spec `--set global.imageRegistryOverride=ghcr.m.daocloud.io` to accelerate image pulling.
-    >
-    > You can specify the Multus clusterNetwork for your cluster using `multus.multusCNI.defaultCniCRName`. The clusterNetwork is a specific field of the Multus plugin that defines the default network interface for Pods.
-
-2. Check if the installation is successful.
-
-    ```bash
-    ~# kubectl get po -n kube-system | grep spiderpool
-    NAME                                     READY   STATUS      RESTARTS   AGE                                
-    spiderpool-agent-7hhkz                   1/1     Running     0          13m
-    spiderpool-agent-kxf27                   1/1     Running     0          13m
-    spiderpool-controller-76798dbb68-xnktr   1/1     Running     0          13m
-    spiderpool-init                          0/1     Completed   0          13m
-    ```
+Refer to [Installation](./readme.md) to install Spiderpool. And make sure that the helm installs the option `ipam.enableSpiderSubnet=true`.
 
 ### Install CNI
 
diff --git a/docs/usage/statefulset-zh_CN.md b/docs/usage/statefulset-zh_CN.md
index e968503c1..978561d66 100644
--- a/docs/usage/statefulset-zh_CN.md
+++ b/docs/usage/statefulset-zh_CN.md
@@ -32,28 +32,7 @@ Deployment 和 StatefulSet 控制器，对于 IP 地址固定的需求是不一
 
 ### 安装 Spiderpool
 
-1. 通过 Helm 安装 Spiderpool。
-
-    ```bash
-    helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-    helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.multusCNI.defaultCniCRName="macvlan-ens192" 
-    ```
-
-    > 如果您所在地区是中国大陆，可以指定参数 `--set global.imageRegistryOverride=ghcr.m.daocloud.io` ，以帮助您更快的拉取镜像。
-    >
-    > 通过 `multus.multusCNI.defaultCniCRName` 指定集群的 Multus clusterNetwork，clusterNetwork 是 Multus 插件的一个特定字段，用于指定 Pod 的默认网络接口。
-
-2. 检查安装完成
-
-    ```bash
-    ~# kubectl get po -n kube-system | grep spiderpool
-    NAME                                     READY   STATUS      RESTARTS   AGE                                
-    spiderpool-agent-7hhkz                   1/1     Running     0          13m
-    spiderpool-agent-kxf27                   1/1     Running     0          13m
-    spiderpool-controller-76798dbb68-xnktr   1/1     Running     0          13m
-    spiderpool-init                          0/1     Completed   0          13m
-    ```
+可参考 [安装](./readme-zh_CN.md) 安装 Spiderpool. 其中，务必确保 helm 安装选项 `ipam.enableStatefulSet=true`
 
 ### 安装 CNI 配置
 
diff --git a/docs/usage/statefulset.md b/docs/usage/statefulset.md
index a23c7ba6e..a1855df34 100644
--- a/docs/usage/statefulset.md
+++ b/docs/usage/statefulset.md
@@ -32,28 +32,7 @@ Many open-source CNI solutions provide limited support for fixing IP addresses f
 
 ### Install Spiderpool
 
-1. Install Spiderpool through Helm:
-
-    ```bash
-    helm repo add spiderpool https://spidernet-io.github.io/spiderpool
-    helm repo update spiderpool
-    helm install spiderpool spiderpool/spiderpool --namespace kube-system --set multus.multusCNI.defaultCniCRName="macvlan-ens192" 
-    ```
-
-    > For users in the Chinese mainland, it is recommended to specify the spec `--set global.imageRegistryOverride=ghcr.m.daocloud.io` to accelerate image pulling.
-    >
-    > You can specify the Multus clusterNetwork for your cluster using `multus.multusCNI.defaultCniCRName`. The clusterNetwork is a specific field of the Multus plugin that defines the default network interface for Pods.
-
-2. Check if the installation is successful.
-
-    ```bash
-    ~# kubectl get po -n kube-system | grep spiderpool
-    NAME                                     READY   STATUS      RESTARTS   AGE                                
-    spiderpool-agent-7hhkz                   1/1     Running     0          13m
-    spiderpool-agent-kxf27                   1/1     Running     0          13m
-    spiderpool-controller-76798dbb68-xnktr   1/1     Running     0          13m
-    spiderpool-init                          0/1     Completed   0          13m
-    ```
+Refer to [Installation](./readme.md) to install Spiderpool. And make sure that the helm installs the option `ipam.enableStatefulSet=true`.
 
 ### Install CNI
 
diff --git a/docs/usage/third-party-controller-zh_CN.md b/docs/usage/third-party-controller-zh_CN.md
new file mode 100644
index 000000000..2f591a9ec
--- /dev/null
+++ b/docs/usage/third-party-controller-zh_CN.md
@@ -0,0 +1,3 @@
+# IPAM for third-party controllers
+
+**English** ｜ [**简体中文**](./third-party-controller.md)
diff --git a/docs/usage/third-party-controller.md b/docs/usage/third-party-controller.md
index 6364c0ba1..61602c3d4 100644
--- a/docs/usage/third-party-controller.md
+++ b/docs/usage/third-party-controller.md
@@ -1,5 +1,7 @@
 # IPAM for third-party controllers
 
+**简体中文** | [**English**](./third-party-controller-zh_CN.md)
+
 ## Description
 
 Operator is popularly used to implement customized controller. Spiderpool supports to assign IP to Pods created not by kubernetes-native controller. There are two ways to do this:
diff --git a/go.mod b/go.mod
index 872ae6213..659d6ffd8 100644
--- a/go.mod
+++ b/go.mod
@@ -66,6 +66,11 @@ require (
 	sigs.k8s.io/yaml v1.3.0
 )
 
+require (
+	github.com/go-logr/logr v1.2.4
+	k8s.io/klog/v2 v2.100.1 // indirect
+)
+
 require (
 	github.com/Masterminds/goutils v1.1.1 // indirect
 	github.com/Masterminds/semver/v3 v3.1.1 // indirect
@@ -84,7 +89,6 @@ require (
 	github.com/fatih/color v1.13.0 // indirect
 	github.com/felixge/httpsnoop v1.0.3 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
-	github.com/go-logr/logr v1.2.4 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-ole/go-ole v1.2.6 // indirect
 	github.com/go-openapi/analysis v0.21.4 // indirect
@@ -173,7 +177,6 @@ require (
 	gopkg.in/ini.v1 v1.67.0 // indirect
 	k8s.io/component-base v0.28.1 // indirect
 	k8s.io/gengo v0.0.0-20230306165830-ab3349d207d4 // indirect
-	k8s.io/klog/v2 v2.100.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect
 	k8s.io/kubectl v0.26.3 // indirect
 	kubevirt.io/containerized-data-importer-api v1.57.0-alpha1 // indirect
diff --git a/pkg/ippoolmanager/ippool_manager.go b/pkg/ippoolmanager/ippool_manager.go
index 0c3bd7dd0..b8e23b2b9 100644
--- a/pkg/ippoolmanager/ippool_manager.go
+++ b/pkg/ippoolmanager/ippool_manager.go
@@ -140,6 +140,20 @@ func (im *ipPoolManager) AllocateIP(ctx context.Context, poolName, nic string, p
 }
 
 func (im *ipPoolManager) genRandomIP(ctx context.Context, nic string, ipPool *spiderpoolv2beta1.SpiderIPPool, pod *corev1.Pod, podController types.PodTopController) (net.IP, error) {
+	logger := logutils.FromContext(ctx)
+
+	var tmpPod *corev1.Pod
+	if im.config.EnableKubevirtStaticIP && podController.APIVersion == kubevirtv1.SchemeGroupVersion.String() && podController.Kind == constant.KindKubevirtVMI {
+		tmpPod = pod.DeepCopy()
+		tmpPod.SetName(podController.Name)
+	} else {
+		tmpPod = pod
+	}
+	key, err := cache.MetaNamespaceKeyFunc(tmpPod)
+	if err != nil {
+		return nil, err
+	}
+
 	reservedIPs, err := im.rIPManager.AssembleReservedIPs(ctx, *ipPool.Spec.IPVersion)
 	if err != nil {
 		return nil, err
@@ -166,22 +180,20 @@ func (im *ipPoolManager) genRandomIP(ctx context.Context, nic string, ipPool *sp
 
 	availableIPs := spiderpoolip.IPsDiffSet(totalIPs, append(reservedIPs, usedIPs...), false)
 	if len(availableIPs) == 0 {
-		return nil, constant.ErrIPUsedOut
-	}
-	resIP := availableIPs[0]
-
-	var tmpPod *corev1.Pod
-	if im.config.EnableKubevirtStaticIP && podController.APIVersion == kubevirtv1.SchemeGroupVersion.String() && podController.Kind == constant.KindKubevirtVMI {
-		tmpPod = pod.DeepCopy()
-		tmpPod.SetName(podController.Name)
-	} else {
-		tmpPod = pod
-	}
+		// traverse the usedIPs to find the previous allocated IPs if there be
+		// reference issue: https://github.com/spidernet-io/spiderpool/issues/2517
+		allocatedIPFromRecords, hasFound := findAllocatedIPFromRecords(allocatedRecords, nic, key, string(pod.UID))
+		if !hasFound {
+			return nil, constant.ErrIPUsedOut
+		}
 
-	key, err := cache.MetaNamespaceKeyFunc(tmpPod)
-	if err != nil {
-		return nil, err
+		availableIPs, err = spiderpoolip.ParseIPRange(*ipPool.Spec.IPVersion, allocatedIPFromRecords)
+		if nil != err {
+			return nil, err
+		}
+		logger.Sugar().Warnf("find previous IP '%s' from IPPool '%s' recorded IP allocations", allocatedIPFromRecords, ipPool.Name)
 	}
+	resIP := availableIPs[0]
 
 	if allocatedRecords == nil {
 		allocatedRecords = spiderpoolv2beta1.PoolIPAllocations{}
diff --git a/pkg/ippoolmanager/utils.go b/pkg/ippoolmanager/utils.go
index 47d9235d2..8ae9ffcd9 100644
--- a/pkg/ippoolmanager/utils.go
+++ b/pkg/ippoolmanager/utils.go
@@ -123,3 +123,17 @@ func (b ByPoolPriority) Less(i, j int) bool {
 
 	return false
 }
+
+// findAllocatedIPFromRecords try to find pod NIC previous allocated IP from the IPPool.Status.AllocatedIPs
+// this function serves for the issue: https://github.com/spidernet-io/spiderpool/issues/2517
+func findAllocatedIPFromRecords(allocatedRecords spiderpoolv2beta1.PoolIPAllocations, nic, namespacedName, podUID string) (previousIP string, hasFound bool) {
+	for tmpIP, poolIPAllocation := range allocatedRecords {
+		if poolIPAllocation.NIC == nic &&
+			poolIPAllocation.NamespacedName == namespacedName &&
+			poolIPAllocation.PodUID == podUID {
+			return tmpIP, true
+		}
+	}
+
+	return "", false
+}
diff --git a/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/spiderippool_types.go b/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/spiderippool_types.go
index fed7d83a5..3951798f0 100644
--- a/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/spiderippool_types.go
+++ b/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/spiderippool_types.go
@@ -25,6 +25,7 @@ type IPPoolSpec struct {
 	// +kubebuilder:validation:Optional
 	Gateway *string `json:"gateway,omitempty"`
 
+	// DEPRECATED: Vlan is deprecated.
 	// +kubebuilder:default=0
 	// +kubebuilder:validation:Maximum=4094
 	// +kubebuilder:validation:Minimum=0
diff --git a/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/spidersubnet_types.go b/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/spidersubnet_types.go
index e07df2172..a9459b6da 100644
--- a/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/spidersubnet_types.go
+++ b/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/spidersubnet_types.go
@@ -25,6 +25,7 @@ type SubnetSpec struct {
 	// +kubebuilder:validation:Optional
 	Gateway *string `json:"gateway,omitempty"`
 
+	// DEPRECATED: Vlan is deprecated.
 	// +kubebuilder:default=0
 	// +kubebuilder:validation:Maximum=4094
 	// +kubebuilder:validation:Minimum=0
diff --git a/pkg/networking/networking/route.go b/pkg/networking/networking/route.go
index 6211a42d3..123b1be28 100644
--- a/pkg/networking/networking/route.go
+++ b/pkg/networking/networking/route.go
@@ -103,7 +103,7 @@ func DelFromRuleTable(src *net.IPNet, ruleTable int) error {
 }
 
 // AddRoute add static route to specify rule table
-func AddRoute(logger *zap.Logger, ruleTable, ipFamily int, scope netlink.Scope, iface string, dst *net.IPNet, v4Gw, v6Gw net.IP) error {
+func AddRoute(logger *zap.Logger, ruleTable, ipFamily int, scope netlink.Scope, iface string, src, dst *net.IPNet, v4Gw, v6Gw net.IP) error {
 	link, err := netlink.LinkByName(iface)
 	if err != nil {
 		logger.Error(err.Error())
@@ -117,6 +117,10 @@ func AddRoute(logger *zap.Logger, ruleTable, ipFamily int, scope netlink.Scope,
 		Table:     ruleTable,
 	}
 
+	if src != nil {
+		route.Src = src.IP
+	}
+
 	switch ipFamily {
 	case netlink.FAMILY_V4:
 		if v4Gw != nil {


Test patch:
diff --git a/pkg/ippoolmanager/ippool_manager_test.go b/pkg/ippoolmanager/ippool_manager_test.go
index 2415de070..28ef29840 100644
--- a/pkg/ippoolmanager/ippool_manager_test.go
+++ b/pkg/ippoolmanager/ippool_manager_test.go
@@ -5,6 +5,7 @@ package ippoolmanager_test
 
 import (
 	"context"
+	"encoding/json"
 	"fmt"
 	"net"
 	"sync/atomic"
@@ -19,6 +20,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/util/uuid"
+	"k8s.io/client-go/tools/cache"
 	"k8s.io/utils/pointer"
 	kubevirtv1 "kubevirt.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
@@ -410,6 +412,60 @@ var _ = Describe("IPPoolManager", Label("ippool_manager_test"), func() {
 				Expect(res.Gateway).To(Equal(gateway))
 				Expect(res.Vlan).To(Equal(vlan))
 			})
+
+			It("allocate IP address from the previous records", func() {
+				mockRIPManager.EXPECT().
+					AssembleReservedIPs(gomock.Eq(ctx), gomock.Eq(constant.IPv4)).
+					Return(nil, nil).
+					Times(1)
+
+				ipVersion := constant.IPv4
+				allocatedIP := "172.18.40.40/24"
+				gateway := "172.18.40.1"
+				vlan := int64(0)
+
+				ip, ipNet, err := net.ParseCIDR(allocatedIP)
+				Expect(err).NotTo(HaveOccurred())
+
+				ipPoolT.Spec.IPVersion = pointer.Int64(ipVersion)
+				ipPoolT.Spec.Subnet = ipNet.String()
+				ipPoolT.Spec.IPs = append(ipPoolT.Spec.IPs, ip.String())
+				ipPoolT.Spec.Gateway = pointer.String(gateway)
+				ipPoolT.Spec.Vlan = pointer.Int64(vlan)
+
+				key, err := cache.MetaNamespaceKeyFunc(podT)
+				Expect(err).NotTo(HaveOccurred())
+
+				records := spiderpoolv2beta1.PoolIPAllocations{
+					ip.String(): spiderpoolv2beta1.PoolIPAllocation{
+						NIC:            nic,
+						NamespacedName: key,
+						PodUID:         string(podT.UID),
+					},
+				}
+				allocatedIPs, err := json.Marshal(records)
+				Expect(err).NotTo(HaveOccurred())
+
+				ipPoolT.Status = spiderpoolv2beta1.IPPoolStatus{
+					AllocatedIPs:     pointer.String(string(allocatedIPs)),
+					TotalIPCount:     pointer.Int64(1),
+					AllocatedIPCount: pointer.Int64(1),
+				}
+
+				err = fakeClient.Create(ctx, ipPoolT)
+				Expect(err).NotTo(HaveOccurred())
+				err = tracker.Add(ipPoolT)
+				Expect(err).NotTo(HaveOccurred())
+
+				res, err := ipPoolManager.AllocateIP(ctx, ipPoolName, nic, podT, spiderpooltypes.PodTopController{})
+				Expect(err).NotTo(HaveOccurred())
+				Expect(*res.Nic).To(Equal(nic))
+				Expect(*res.Version).To(Equal(ipVersion))
+				Expect(*res.Address).To(Equal(allocatedIP))
+				Expect(res.IPPool).To(Equal(ipPoolT.Name))
+				Expect(res.Gateway).To(Equal(gateway))
+				Expect(res.Vlan).To(Equal(vlan))
+			})
 		})
 
 		Describe("ReleaseIP", func() {
diff --git a/pkg/ippoolmanager/utils_test.go b/pkg/ippoolmanager/utils_test.go
index 4249a65dd..8e517f624 100644
--- a/pkg/ippoolmanager/utils_test.go
+++ b/pkg/ippoolmanager/utils_test.go
@@ -11,6 +11,7 @@ import (
 	appsv1 "k8s.io/api/apps/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	types2 "k8s.io/apimachinery/pkg/types"
+	"k8s.io/apimachinery/pkg/util/uuid"
 
 	"github.com/spidernet-io/spiderpool/pkg/constant"
 	spiderpoolv2beta1 "github.com/spidernet-io/spiderpool/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1"
@@ -290,4 +291,48 @@ var _ = Describe("IPPoolManager-utils", Label("ippool_manager_utils"), func() {
 			Expect(byPoolPriority).Should(Equal(ByPoolPriority{pool2, pool1}))
 		})
 	})
+
+	Context("Test findAllocatedIPFromRecords", func() {
+		var allocatedRecords spiderpoolv2beta1.PoolIPAllocations
+		var ip, nic, namespacedName, podUID string
+
+		BeforeEach(func() {
+			ip = "172.18.40.40"
+			nic = "eth0"
+			namespacedName = "default/testPod"
+			podUID = string(uuid.NewUUID())
+			allocatedRecords = spiderpoolv2beta1.PoolIPAllocations{
+				ip: spiderpoolv2beta1.PoolIPAllocation{
+					NIC:            nic,
+					NamespacedName: namespacedName,
+					PodUID:         podUID,
+				},
+			}
+		})
+
+		It("find previous allocated IP in the records", func() {
+			_, hasFound := findAllocatedIPFromRecords(allocatedRecords, nic, namespacedName, podUID)
+			Expect(hasFound).To(BeTrue())
+		})
+
+		It("no previous allocated IP in the records", func() {
+			_, hasFound := findAllocatedIPFromRecords(allocatedRecords, "eth1", "kube-system/testPod1", string(uuid.NewUUID()))
+			Expect(hasFound).To(BeFalse())
+		})
+
+		It("no previous allocated IP in records due to different nic", func() {
+			_, hasFound := findAllocatedIPFromRecords(allocatedRecords, "eth1", namespacedName, podUID)
+			Expect(hasFound).To(BeFalse())
+		})
+
+		It("no previous allocated IP in records due to different NamespacedName", func() {
+			_, hasFound := findAllocatedIPFromRecords(allocatedRecords, nic, "kube-system/testPod1", podUID)
+			Expect(hasFound).To(BeFalse())
+		})
+
+		It("no previous allocated IP in records due to different podUID", func() {
+			_, hasFound := findAllocatedIPFromRecords(allocatedRecords, nic, namespacedName, string(uuid.NewUUID()))
+			Expect(hasFound).To(BeFalse())
+		})
+	})
 })
diff --git a/test/Makefile b/test/Makefile
index b80eddff6..525b34324 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -291,8 +291,7 @@ setup_spiderpool:
 		--set spiderpoolInit.image.registry="" \
 		--set spiderpoolInit.image.repository=$(SPIDERPOOL_CONTROLLER_IMAGE_NAME) \
 		--set spiderpoolInit.image.tag=$(E2E_SPIDERPOOL_TAG) \
-		--set rdma.rdmaCni.image.registry=$(E2E_RDMA_IMAGE_REPO) \
-		--set rdma.rdmaSharedDevicePlugin.image.registry=$(E2E_RDMA_IMAGE_REPO) \
+		--set rdma.rdmaSharedDevicePlugin.image.registry=$(E2E_RDMA_DP_IMAGE_REPO) \
 		--set sriov.image.registry=$(E2E_SRIOV_IMAGE_REPO)   " \
 		ALL_IMAGES=`helm template $(RELEASE_NAME) $(ROOT_DIR)/charts/spiderpool $${HELM_OPTION} | grep ' image: ' | tr -d '"' | awk -F 'image: ' '{print $$2}' | sort | uniq | tr '\n' ' '` ; \
 		echo "ALL_IMAGES: $${ALL_IMAGES} " ; \
diff --git a/test/Makefile.defs b/test/Makefile.defs
index 3e3b5483e..27c7c09b3 100644
--- a/test/Makefile.defs
+++ b/test/Makefile.defs
@@ -186,12 +186,12 @@ else
     E2E_OPENKRUISE_IMAGE ?= docker.io/openkruise/kruise-manager
 endif
 
-#========= rdma =========
+#========= rdma shared dp =========
 
 ifeq ($(E2E_CHINA_IMAGE_REGISTRY),true)
-    E2E_RDMA_IMAGE_REPO ?= ghcr.m.daocloud.io
+    E2E_RDMA_DP_IMAGE_REPO ?= ghcr.m.daocloud.io
 else
-    E2E_RDMA_IMAGE_REPO ?= ghcr.io
+    E2E_RDMA_DP_IMAGE_REPO ?= ghcr.io
 endif
 
 #========= sriov =========
diff --git a/test/doc/coordinator.md b/test/doc/coordinator.md
index 51efe383f..fb194f812 100644
--- a/test/doc/coordinator.md
+++ b/test/doc/coordinator.md
@@ -13,3 +13,4 @@
 | C00009  | gateway connection detection                  | p2     |    |  done  |       |
 | C00010  | auto clean up the dirty rules(routing\neighborhood) while pod starting | p2 | | |
 | C00011  | In the default scenario (Do not specify the NIC where the default route is located in any way) , use 'ip r get 8.8.8.8' to see if default route NIC is `net1` | p2 | | |
+| C00012  | In multi-nic case , use 'ip r get <service_subnet> and <hostIP>' to see if src is from pod's eth0, note: only for ipv4. | p2 | | |
diff --git a/test/e2e/common/constant.go b/test/e2e/common/constant.go
index d45137270..03ee4e692 100644
--- a/test/e2e/common/constant.go
+++ b/test/e2e/common/constant.go
@@ -24,7 +24,7 @@ const (
 	PodStartTimeout            = time.Minute * 5
 	PodReStartTimeout          = time.Minute * 5
 	IPReclaimTimeout           = time.Minute * 5
-	ExecCommandTimeout         = time.Minute
+	ExecCommandTimeout         = time.Minute * 5
 	EventOccurTimeout          = time.Second * 30
 	ServiceAccountReadyTimeout = time.Second * 20
 	NodeReadyTimeout           = time.Minute
diff --git a/test/e2e/coordinator/macvlan-overlay-one/macvlan_overlay_one_test.go b/test/e2e/coordinator/macvlan-overlay-one/macvlan_overlay_one_test.go
index 6330599f7..094b7b7ac 100644
--- a/test/e2e/coordinator/macvlan-overlay-one/macvlan_overlay_one_test.go
+++ b/test/e2e/coordinator/macvlan-overlay-one/macvlan_overlay_one_test.go
@@ -272,10 +272,11 @@ var _ = Describe("MacvlanOverlayOne", Label("overlay", "one-nic", "coordinator")
 
 			ctx, cancel := context.WithTimeout(context.Background(), common.PodStartTimeout)
 			defer cancel()
+
 			depObject, err := frame.WaitDeploymentReady(depName, namespace, ctx)
-			Expect(err).NotTo(HaveOccurred(), "waiting for deploy ready failed, error is: %v ", err)
+			Expect(err).NotTo(HaveOccurred(), "waiting for deploy ready failed:  %v ", err)
 			podList, err := frame.GetPodListByLabel(depObject.Spec.Template.Labels)
-			Expect(err).NotTo(HaveOccurred(), "failed to get podList, error is: %v ", err)
+			Expect(err).NotTo(HaveOccurred(), "failed to get podList: %v ", err)
 
 			// Check pod's mac address prefix
 			commandString := fmt.Sprintf("ip link show dev %s | awk '/ether/ {print substr($2,0,5)}'", common.NIC2)
diff --git a/test/e2e/ifacer/ifacer_test.go b/test/e2e/ifacer/ifacer_test.go
index 8b001bb3b..2e85957c8 100644
--- a/test/e2e/ifacer/ifacer_test.go
+++ b/test/e2e/ifacer/ifacer_test.go
@@ -5,7 +5,6 @@ package ifacer_test
 import (
 	"context"
 	"fmt"
-	"math/rand"
 	"time"
 
 	. "github.com/onsi/ginkgo/v2"
@@ -30,8 +29,7 @@ var _ = Describe("test ifacer", Label("ifacer"), func() {
 		namespace = "ns" + tools.RandomName()
 		spiderMultusNadName = "test-multus-" + common.GenerateString(10, true)
 
-		r := rand.New(rand.NewSource(time.Now().UnixNano()))
-		vlanInterface = r.Intn(100)
+		vlanInterface = 50
 		GinkgoWriter.Println("Generate vlan ID of sub-interface:", vlanInterface)
 
 		err := frame.CreateNamespaceUntilDefaultServiceAccountReady(namespace, common.ServiceAccountReadyTimeout)
@@ -108,23 +106,39 @@ var _ = Describe("test ifacer", Label("ifacer"), func() {
 		GinkgoWriter.Printf("Try to create Deployment: %v/%v \n", namespace, dsName)
 		Expect(frame.CreateDaemonSet(dsObject)).NotTo(HaveOccurred())
 
-		GinkgoWriter.Println("Check that each node where the Pod is located should have a vlan sub-interface.")
 		ctx, cancel := context.WithTimeout(context.Background(), common.ExecCommandTimeout)
 		defer cancel()
-		checkMasterUPString := fmt.Sprintf("ip link show %s | grep 'state UP mode' ", common.NIC1)
-		checkIPLinkString := fmt.Sprintf("ip link show | grep %s.%d | grep 'state UP mode' ", common.NIC1, vlanInterface)
+
+		err := frame.WaitPodListRunning(dsObject.Spec.Template.Labels, 2, ctx)
+		Expect(err).NotTo(HaveOccurred())
+
+		GinkgoWriter.Println("Check that each node where the Pod is located should have a vlan sub-interface.")
+		checkMasterUPString := fmt.Sprintf("ip link show up %s ", common.NIC1)
+		checkIPLinkString := fmt.Sprintf("ip link show up %s.%d ", common.NIC1, vlanInterface)
 		Eventually(func() bool {
 			for _, node := range frame.Info.KindNodeList {
 				showMasterResult, err := frame.DockerExecCommand(ctx, node, checkMasterUPString)
 				if err != nil {
-					GinkgoWriter.Printf("Failed to execute command on the node, error is %v \n", string(showMasterResult))
+					GinkgoWriter.Printf("Failed to execute command %s on the node %s : %v \n", checkMasterUPString, node, showMasterResult)
 					return false
 				}
+
+				if string(showMasterResult) == "" {
+					GinkgoWriter.Printf("master interface %s is down, waiting \n", common.NIC1)
+					return false
+				}
+
 				showResult, err := frame.DockerExecCommand(ctx, node, checkIPLinkString)
 				if err != nil {
-					GinkgoWriter.Printf("Failed to execute command on the node, error is %v \n", string(showResult))
+					GinkgoWriter.Printf("Failed to execute %s on the node %s: %v \n", checkIPLinkString, node, showResult)
 					return false
 				}
+
+				if string(showResult) == "" {
+					GinkgoWriter.Printf("vlan interface %s is down, waiting... \n", vlanInterface)
+					return false
+				}
+
 			}
 			return true
 		}, common.ResourceDeleteTimeout, common.ForcedWaitingTime).Should(BeTrue())
@@ -132,61 +146,87 @@ var _ = Describe("test ifacer", Label("ifacer"), func() {
 		GinkgoWriter.Println("Create a vlan sub-interface with the same name, its network card status is down, and it is automatically set to up")
 		ctx, cancel = context.WithTimeout(context.Background(), common.ExecCommandTimeout)
 		defer cancel()
+
 		setDownString := fmt.Sprintf("ip link set %s.%d down", common.NIC1, vlanInterface)
 		for _, node := range frame.Info.KindNodeList {
-			showResult, err := frame.DockerExecCommand(ctx, node, setDownString)
-			Expect(err).NotTo(HaveOccurred(), "Failed to execute down nic command on the node, error is %v", string(showResult))
+			_, err := frame.DockerExecCommand(ctx, node, setDownString)
+			Expect(err).NotTo(HaveOccurred(), "Failed to execute  %s on the node %s:  %v", setDownString, node, err)
 		}
 		GinkgoWriter.Println("Restart all pods")
 		podList, err := frame.GetPodListByLabel(dsObject.Spec.Template.Labels)
 		Expect(err).NotTo(HaveOccurred(), "failed to get Pod list, Pod list is %v", len(podList.Items))
 		Expect(frame.DeletePodList(podList)).NotTo(HaveOccurred())
 
-		GinkgoWriter.Println("Check the nic status should be up")
-		ctx, cancel = context.WithTimeout(context.Background(), common.PodReStartTimeout)
-		defer cancel()
-		checkIPLinkUpString := fmt.Sprintf("ip link show %s.%d | grep 'state UP mode'", common.NIC1, vlanInterface)
-		Eventually(func() bool {
-			for _, node := range frame.Info.KindNodeList {
-				showResult, err := frame.DockerExecCommand(ctx, node, checkIPLinkUpString)
-				if err != nil {
-					GinkgoWriter.Printf("Failed to execute command on the node, error is %v \n", string(showResult))
-					return false
-				}
-			}
-			return true
-		}, common.ResourceDeleteTimeout, common.ForcedWaitingTime).Should(BeTrue())
+		time.Sleep(time.Second * 5)
 
-		GinkgoWriter.Println("After the host is restarted, the sub-interface is lost. Restarting the Pod will refresh the sub-interface.")
-		ctx, cancel = context.WithTimeout(context.Background(), common.ExecCommandTimeout)
+		ctx, cancel = context.WithTimeout(context.Background(), common.PodReStartTimeout)
 		defer cancel()
-		deleteIPLinkString := fmt.Sprintf("ip link delete dev %s.%d", common.NIC1, vlanInterface)
-		Eventually(func() bool {
-			for _, node := range frame.Info.KindNodeList {
-				showResult, err := frame.DockerExecCommand(ctx, node, deleteIPLinkString)
-				Expect(err).NotTo(HaveOccurred(), "Failed to execute the delete sub-interface command on the node, error is %v", string(showResult))
-			}
-			return true
-		}, common.ResourceDeleteTimeout, common.ForcedWaitingTime).Should(BeTrue())
 
-		GinkgoWriter.Println("After deleting the sub-interface, restart all Pods")
-		podList, err = frame.GetPodListByLabel(dsObject.Spec.Template.Labels)
-		Expect(err).NotTo(HaveOccurred(), "failed to get Pod list, Pod list is %v", len(podList.Items))
-		Expect(frame.DeletePodList(podList)).NotTo(HaveOccurred())
+		err = frame.WaitPodListRunning(dsObject.Spec.Template.Labels, 2, ctx)
+		Expect(err).NotTo(HaveOccurred())
 
-		GinkgoWriter.Println("The sub-interfaces of all nodes are automatically rebuilt, and the status is UP")
-		ctx, cancel = context.WithTimeout(context.Background(), common.ExecCommandTimeout)
-		defer cancel()
-		checkIPLinkString = fmt.Sprintf("ip link show %s.%d | grep 'state UP mode'", common.NIC1, vlanInterface)
+		GinkgoWriter.Println("Check the nic status should be up")
+		checkIPLinkUpString := fmt.Sprintf("ip link show up %s.%d", common.NIC1, vlanInterface)
 		Eventually(func() bool {
 			for _, node := range frame.Info.KindNodeList {
 				showResult, err := frame.DockerExecCommand(ctx, node, checkIPLinkUpString)
 				if err != nil {
-					GinkgoWriter.Printf("Checking subinterfaces failed on node, error is %v \n", string(showResult))
+					GinkgoWriter.Printf("Failed to execute \"%s\" on the node %s: %v \n", checkIPLinkUpString, node, err)
 					return false
 				}
+
+				if string(showResult) == "" {
+					GinkgoWriter.Printf("vlan interface %s is down, waiting... \n", vlanInterface)
+				}
 			}
 			return true
 		}, common.ResourceDeleteTimeout, common.ForcedWaitingTime).Should(BeTrue())
+
+		// macvlan issue: https://github.com/containernetworking/plugins/pull/954
+		// When the master interface on the node has been deleted, and loadConf tries
+		// to get the MTU, This causes cmdDel to return a linkNotFound error to the
+		// runtime.
+		// TODO(cyclinder): undo the following comment if cni-plugins has new release
+		//	GinkgoWriter.Println("After the host is restarted, the sub-interface is lost. Restarting the Pod will refresh the sub-interface.")
+		//	ctx, cancel = context.WithTimeout(context.Background(), common.ExecCommandTimeout)
+		//	defer cancel()
+		//
+		//	deleteIPLinkString := fmt.Sprintf("ip link delete dev %s.%d", common.NIC1, vlanInterface)
+		//	Eventually(func() bool {
+		//		for _, node := range frame.Info.KindNodeList {
+		//			_, err := frame.DockerExecCommand(ctx, node, deleteIPLinkString)
+		//			Expect(err).NotTo(HaveOccurred(), "Failed to execute the delete sub-interface command on the node %s %v", node, err)
+		//		}
+		//		return true
+		//	}, common.ResourceDeleteTimeout, common.ForcedWaitingTime).Should(BeTrue())
+		//
+		//	GinkgoWriter.Println("After deleting the sub-interface, restart all Pods")
+		//	podList, err = frame.GetPodListByLabel(dsObject.Spec.Template.Labels)
+		//	Expect(err).NotTo(HaveOccurred(), "failed to get Pod list, Pod list is %v", len(podList.Items))
+		//	Expect(frame.DeletePodList(podList)).NotTo(HaveOccurred())
+		//
+		//	GinkgoWriter.Println("The sub-interfaces of all nodes are automatically rebuilt, and the status is UP")
+		//	ctx, cancel = context.WithTimeout(context.Background(), common.ExecCommandTimeout)
+		//	defer cancel()
+		//
+		//	err = frame.WaitPodListRunning(dsObject.Spec.Template.Labels, 2, ctx)
+		//	Expect(err).NotTo(HaveOccurred())
+		//
+		//	checkIPLinkString = fmt.Sprintf("ip link show up %s.%d", common.NIC1, vlanInterface)
+		//	Eventually(func() bool {
+		//		for _, node := range frame.Info.KindNodeList {
+		//			showResult, err := frame.DockerExecCommand(ctx, node, checkIPLinkUpString)
+		//			if err != nil {
+		//				GinkgoWriter.Printf("failed to check if subinterfaces is up on node %s: %v \n", node, err)
+		//				return false
+		//			}
+		//
+		//			if len(showResult) == 0 {
+		//				GinkgoWriter.Printf("sub-vlan interfaces is down, waiting...")
+		//				return false
+		//			}
+		//		}
+		//		return true
+		//	}, common.ResourceDeleteTimeout, common.ForcedWaitingTime).Should(BeTrue())
 	})
 })
diff --git a/test/e2e/performance/performance_test.go b/test/e2e/performance/performance_test.go
index 58f142345..6bcb7967d 100644
--- a/test/e2e/performance/performance_test.go
+++ b/test/e2e/performance/performance_test.go
@@ -145,15 +145,14 @@ var _ = Describe("performance test case", Serial, Label("performance"), func() {
 				defer cancel()
 				var curlCheckString string
 				if frame.Info.IpV6Enabled && !frame.Info.IpV4Enabled {
-					curlCheckString = fmt.Sprintf("curl -I -m 1 -g http://[%s]:80 --insecure", pod.Status.PodIP)
+					curlCheckString = fmt.Sprintf("curl --retry 10 -m 1 -g http://[%s]:80 --insecure", pod.Status.PodIP)
 				} else {
-					curlCheckString = fmt.Sprintf("curl -I -m 1 http://%s:80 --insecure", pod.Status.PodIP)
+					curlCheckString = fmt.Sprintf("curl --retry 10 -m 1 http://%s:80 --insecure", pod.Status.PodIP)
 				}
 
 				for _, node := range frame.Info.KindNodeList {
 					curlReturnResult, errCurl := frame.DockerExecCommand(ctx, node, curlCheckString)
-					Expect(errCurl).NotTo(HaveOccurred())
-					GinkgoWriter.Printf("Failed to execute the curl command on the node, error is %v", string(curlReturnResult))
+					Expect(errCurl).NotTo(HaveOccurred(), "Failed to execute the command %s on the node:  %v", curlCheckString, string(curlReturnResult))
 				}
 			}
 
diff --git a/test/scripts/debugEnv.sh b/test/scripts/debugEnv.sh
index c82ed2f36..f49cf5c89 100755
--- a/test/scripts/debugEnv.sh
+++ b/test/scripts/debugEnv.sh
@@ -118,9 +118,9 @@ elif [ "$TYPE"x == "detail"x ] ; then
     for POD in $AGENT_POD_LIST ; do
       echo ""
       echo "--------- kubectl logs ${POD} -n ${NAMESPACE} "
-      kubectl logs ${POD} -n ${NAMESPACE} --kubeconfig ${E2E_KUBECONFIG}
+      kubectl logs ${POD} -c spiderpool-agent -n ${NAMESPACE} --kubeconfig ${E2E_KUBECONFIG}
       echo "--------- kubectl logs ${POD} -n ${NAMESPACE} --previous"
-      kubectl logs ${POD} -n ${NAMESPACE} --kubeconfig ${E2E_KUBECONFIG} --previous
+      kubectl logs ${POD} -c spiderpool-agent -n ${NAMESPACE} --kubeconfig ${E2E_KUBECONFIG} --previous
     done
 
     echo ""
@@ -227,15 +227,19 @@ elif [ "$TYPE"x == "detail"x ] ; then
 
 elif [ "$TYPE"x == "error"x ] ; then
     CHECK_ERROR(){
-        LOG_MARK="$1"
-        POD="$2"
-        NAMESPACE="$3"
+        LLOG_MARK="$1"
+        LPOD="$2"
+        LNAMESPACE="$3"
+
+        if [[ "${LPOD}" == *spiderpool-agent* ]] ; then
+            LPOD="${LPOD} -c spiderpool-agent "
+        fi
 
         echo ""
-        echo "---------${POD}--------"
-        MESSAGE=` kubectl logs ${POD} -n ${NAMESPACE} --kubeconfig ${E2E_KUBECONFIG} |& grep -E -i "${LOG_MARK}" `
+        echo "---------${LPOD}--------"
+        MESSAGE=` kubectl logs ${LPOD} -n ${LNAMESPACE} --kubeconfig ${E2E_KUBECONFIG} |& grep -E -i "${LLOG_MARK}" `
         if  [ -n "$MESSAGE" ] ; then
-            echo "error, in ${POD}, found error, ${LOG_MARK} !!!!!!!"
+            echo "error, in ${LPOD}, found error, ${LLOG_MARK} !!!!!!!"
             echo "${MESSAGE}"
             RESUTL_CODE=1
         else
diff --git a/test/scripts/install-multus.sh b/test/scripts/install-multus.sh
index 7544a9a74..5e96033db 100755
--- a/test/scripts/install-multus.sh
+++ b/test/scripts/install-multus.sh
@@ -357,7 +357,9 @@ EOF
   esac
 }
 
-kubectl wait --for=condition=ready -l app.kubernetes.io/name=spiderpool --timeout=100s pod -n kube-system --kubeconfig ${E2E_KUBECONFIG}
+kubectl wait --for=condition=ready -l app.kubernetes.io/component=spiderpool-agent --timeout=100s pod -n kube-system --kubeconfig ${E2E_KUBECONFIG} || \
+( kubectl get pod -n kube-system  --kubeconfig ${E2E_KUBECONFIG} ; \
+ kubectl logs -n kube-system spiderpool-init --kubeconfig ${E2E_KUBECONFIG} ; exit 1 )
 
 Install::MultusCR
 Install::SpiderpoolCR