This is an automated email from the ASF dual-hosted git repository.
baoyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git
The following commit(s) were added to refs/heads/master by this push:
new 9e5163c60 fix: kubernetes service discovery signle mode data dump
(#12284)
9e5163c60 is described below
commit 9e5163c60b74589672b10201355b855098166f4a
Author: Baoyuan <[email protected]>
AuthorDate: Fri Jun 20 14:11:55 2025 +0800
fix: kubernetes service discovery signle mode data dump (#12284)
---
apisix/discovery/kubernetes/init.lua | 71 ++++++++++++++++++++++--------------
t/kubernetes/discovery/kubernetes3.t | 26 +++++++++++++
2 files changed, 70 insertions(+), 27 deletions(-)
diff --git a/apisix/discovery/kubernetes/init.lua
b/apisix/discovery/kubernetes/init.lua
index 941f828ba..d4f718de5 100644
--- a/apisix/discovery/kubernetes/init.lua
+++ b/apisix/discovery/kubernetes/init.lua
@@ -633,44 +633,61 @@ function _M.init_worker()
end
-function _M.dump_data()
+local function dump_endpoints_from_dict(endpoint_dict)
+ local keys, err = endpoint_dict:get_keys()
+ if err then
+ core.log.error("get keys from discovery dict failed: ", err)
+ return
+ end
- local eps = {}
- for _, conf in ipairs(local_conf.discovery.kubernetes) do
+ if not keys or #keys == 0 then
+ return
+ end
- local id = conf.id
- local endpoint_dict = get_endpoint_dict(id)
- local keys, err = endpoint_dict:get_keys()
- if err then
- error(err)
- break
+ local endpoints = {}
+ for i = 1, #keys do
+ local key = keys[i]
+ -- skip key with suffix #version
+ if key:sub(-#"#version") ~= "#version" then
+ local value = endpoint_dict:get(key)
+ core.table.insert(endpoints, {
+ name = key,
+ value = value
+ })
end
+ end
- if keys then
- local k8s = {}
- for i = 1, #keys do
-
- local key = keys[i]
- --skip key with suffix #version
- if key:sub(-#"#version") ~= "#version" then
- local value = endpoint_dict:get(key)
+ return endpoints
+end
- core.table.insert(k8s, {
- name = key,
- value = value
- })
- end
- end
+function _M.dump_data()
+ local discovery_conf = local_conf.discovery.kubernetes
+ local eps = {}
+ if #discovery_conf == 0 then
+ -- Single mode: discovery_conf is a single configuration object
+ local endpoint_dict = get_endpoint_dict()
+ local endpoints = dump_endpoints_from_dict(endpoint_dict)
+ if endpoints then
core.table.insert(eps, {
- id = conf.id,
- endpoints = k8s
+ endpoints = endpoints
})
-
+ end
+ else
+ -- Multiple mode: discovery_conf is an array of configuration objects
+ for _, conf in ipairs(discovery_conf) do
+ local endpoint_dict = get_endpoint_dict(conf.id)
+ local endpoints = dump_endpoints_from_dict(endpoint_dict)
+ if endpoints then
+ core.table.insert(eps, {
+ id = conf.id,
+ endpoints = endpoints
+ })
+ end
end
end
- return {config = local_conf.discovery.kubernetes, endpoints = eps}
+ return {config = discovery_conf, endpoints = eps}
end
diff --git a/t/kubernetes/discovery/kubernetes3.t
b/t/kubernetes/discovery/kubernetes3.t
index e2242e9a8..37a06b00f 100644
--- a/t/kubernetes/discovery/kubernetes3.t
+++ b/t/kubernetes/discovery/kubernetes3.t
@@ -44,6 +44,23 @@ discovery:
token_file: "/tmp/var/run/secrets/kubernetes.io/serviceaccount/token"
watch_endpoint_slices: true
+_EOC_
+
+ our $single_yaml_config = <<_EOC_;
+apisix:
+ node_listen: 1984
+deployment:
+ role: data_plane
+ role_data_plane:
+ config_provider: yaml
+discovery:
+ kubernetes:
+ service:
+ host: "127.0.0.1"
+ port: "6443"
+ client:
+ token_file: "/tmp/var/run/secrets/kubernetes.io/serviceaccount/token"
+ watch_endpoint_slices: true
_EOC_
our $scale_ns_c = <<_EOC_;
@@ -427,3 +444,12 @@ qr{ 0 0 2 2 0 0 0 0 2 2 0 0 }
GET /dump
--- response_body_like
.*"name":"default/kubernetes".*
+
+
+
+=== TEST 5: test single mode dump
+--- yaml_config eval: $::single_yaml_config
+--- request
+GET /dump
+--- response_body_like
+.*"name":"default/kubernetes".*