Skip to content

Commit 831386b

Browse files
committed
feat(k8s-discovery): support mTLS
1 parent d852953 commit 831386b

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

apisix/discovery/kubernetes/informer_factory.lua

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ local type = type
2323
local core = require("apisix.core")
2424
local http = require("resty.http")
2525

26+
if not http.tls_handshake then
27+
error("Bad http library. Should use api7-lua-resty-http instead")
28+
end
29+
2630
local function list_query(informer)
2731
local arguments = {
2832
limit = informer.limit,
@@ -269,12 +273,18 @@ local function list_watch(informer, apiserver)
269273
informer.fetch_state = "connecting"
270274
core.log.info("begin to connect ", apiserver.host, ":", apiserver.port)
271275

272-
ok, message = httpc:connect({
276+
local opt = {
273277
scheme = apiserver.schema,
274278
host = apiserver.host,
275279
port = apiserver.port,
276-
ssl_verify = false
277-
})
280+
ssl_verify = apiserver.ssl_verify,
281+
}
282+
if apiserver.schema == "https" and apiserver.certificate ~= "" and apiserver.key ~= "" then
283+
opt.ssl_cert_path = apiserver.certificate
284+
opt.ssl_key_path = apiserver.key
285+
opt.ssl_server_name = apiserver.host
286+
end
287+
ok, message = httpc:connect(opt)
278288

279289
if not ok then
280290
informer.fetch_state = "connect failed"

apisix/discovery/kubernetes/init.lua

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,15 +270,42 @@ local function get_apiserver(conf)
270270
if err then
271271
return nil, err
272272
end
273+
elseif conf.client.certificate and conf.client.key then
274+
apiserver.certificate, err = read_env(conf.client.certificate)
275+
if err then
276+
return nil, err
277+
end
278+
apiserver.key, err = read_env(conf.client.key)
279+
if err then
280+
return nil, err
281+
end
273282
else
274-
return nil, "one of [client.token,client.token_file] should be set but none"
283+
return nil, "one of [client.token,client.token_file, (client.certificate, client.key)] should be set but none"
284+
end
285+
286+
apiserver.ssl_verify = false
287+
if conf.client.ssl_verify then
288+
apiserver.ssl_verify, err = read_env(conf.client.ssl_verify)
289+
if err then
290+
return nil, err
291+
end
292+
if apiserver.ssl_verify ~= "true" and apiserver.ssl_verify ~= "false" then
293+
return nil, "client.ssl_verify should be set to one of [true,false] but " .. apiserver.ssl_verify
294+
end
295+
if apiserver.ssl_verify == "true" then
296+
apiserver.ssl_verify = true
297+
end
275298
end
276299

277300
-- remove possible extra whitespace
278301
apiserver.token = apiserver.token:gsub("%s+", "")
302+
apiserver.certificate = apiserver.certificate:gsub("%s+", "")
303+
apiserver.key = apiserver.key:gsub("%s+", "")
279304

280-
if apiserver.schema == "https" and apiserver.token == "" then
281-
return nil, "apiserver.token should set to non-empty string when service.schema is https"
305+
if apiserver.schema == "https" then
306+
if (apiserver.token == "" or apiserver.certificate == "" or apiserver.key == "") then
307+
return nil, "apiserver.token or (apiserver.certificate and apiserver.key) should set to non-empty string when service.schema is https"
308+
end
282309
end
283310

284311
return apiserver

0 commit comments

Comments
 (0)