apisix 2.2, 在etcd使用了自签名证书的情况下, 启动时会报错:
got malformed version message: "" from etcd
尽管apisix的配置项 etcd.ssl.verify
已经为 false
了.
找到apisix对应部分的代码后发现, 在初始化etcd连接的时候, 使用的是curl命令来连接etcd. 而curl命令没有加上-k
参数来忽略ssl证书校验.
解决方法
修改对应部分代码
出现问题的代码在 apisix/cli/etcd.lua
这个文件中.
共有三个位置:
即: 第136行, 第173行, 第201行.
需要手动在这三个位置的curl命令中加入 -k
参数来忽略证书校验.
https://github.com/apache/apisix/blob/2.2/apisix/cli/etcd.lua#L136 修改前:
local cmd = str_format("curl -s -m %d %s", timeout * 2, uri)
修改后:
local cmd = str_format("curl -k -s -m %d %s", timeout * 2, uri)
https://github.com/apache/apisix/blob/2.2/apisix/cli/etcd.lua#L173 修改前:
local cmd_auth = "curl -s " .. uri_auth .. " -X POST -d '" ..
修改后:
local cmd_auth = "curl -k -s " .. uri_auth .. " -X POST -d '" ..
https://github.com/apache/apisix/blob/2.2/apisix/cli/etcd.lua#L201 修改前:
local cmd = "curl " .. uri .. token_head .. " -X POST -d '" .. post_json
修改后:
local cmd = "curl -k " .. uri .. token_head .. " -X POST -d '" .. post_json
如果使用的是docker, 可将etcd.lua
这个文件copy出来一份, 修改后再用volumes映射到容器里面:
volumes:
- ./etcd.lua:/usr/local/apisix/apisix/cli/etcd.lua
然后重启apisix即可.
使用master分支或等待下次版本更新
最新的master分支中 不再使用curl来连接etcd 该问题已经解决了. https://github.com/apache/apisix/blob/master/apisix/cli/etcd.lua 但不推荐使用master分支, 因为可能存在未知的bug. 最好是等待下个版本更新.