consul
consul copied to clipboard
Failed to deregister the service when the service ID contains a URL string
Overview of the Issue
I registered service to consul. When the service ID contains a URL string, I found it can't be deregistered.
Reproduction Steps
Steps to reproduce this issue:
- Create a consul service json file,eg:
{
"id": "xxxx_xxx_https://xxx.xxx.com",
"name": "xxx-xxx-xxx",
"address": "xxx.xxx.xxx.xxx",
"port": 123,
"meta": {
"area": "xxx",
"datacenter": "xxx",
"department": "xxx",
"department_id": "xxx-xxx-xxx-xxx",
"project": "xxx_xxx_xxx_xxx",
"url_name": "xxx-xxx-xxx"
},
"tags": [
"xxx1",
"xxx2"
],
"check": {
},
"weights": {
"passing": 10,
"warning": 1
}
}
- Run
curl -X PUT --data @xxx.json http://xxx.xxx.xxx.xxx:8500/v1/agent/service/registerregister the service. - The UI interface can immediately see the registered service.
- Run
curl -X PUT http://xxx.xxx.xxx.xxx:8500/v1/agent/service/deregister/xxxx_xxx_https://xxx.xxx.comderegister the service failed. - Run
curl -X PUT http://xxx.xxx.xxx.xxx:8500/v1/agent/service/deregister/xxxx_xxx_https%3A%2F%2Fxxx.xxx.comderegister the service failed. - Run
curl -X PUT --data @xxx.json http://xxx.xxx.xxx.xxx:8500/v1/agent/service/deregisterderegister the service failed. - Run
consul services deregister -http-addr=http://xxx.xxx.xxx.xxx:8500 -id=xxxx_xxx_https://xxx.xxx.comderegister the service failed. Error:Error registering service "": Unexpected response code: 405 (method GET not allowed). I don't know why, but the official example isconsul services deregister-id =web,consul services deregister web.jsonis also useless. - You can still see the registered service on the UI interface, and the information about this service through
/v1/agent/services.
Consul info for both Client and Server
Client info
agent:
check_monitors = 0
check_ttls = 0
checks = 0
services = 1
build:
prerelease =
revision = 349cec17
version = 1.18.0
version_metadata =
consul:
acl = disabled
bootstrap = true
known_datacenters = 1
leader = true
leader_addr = xxx.xxx.xxx.xxx:8300
server = true
raft:
applied_index = 172
commit_index = 172
fsm_pending = 0
last_contact = 0
last_log_index = 172
last_log_term = 2
last_snapshot_index = 0
last_snapshot_term = 0
latest_configuration = [{Suffrage:Voter ID:2f5546fe-21c5-0a38-d3b9-ffa5ee4fc412 Address:xxx.xxx.xxx.xxx:8300}]
latest_configuration_index = 0
num_peers = 0
protocol_version = 3
protocol_version_max = 3
protocol_version_min = 0
snapshot_version_max = 1
snapshot_version_min = 0
state = Leader
term = 2
runtime:
arch = amd64
cpu_count = 4
goroutines = 227
max_procs = 4
os = linux
version = go1.21.7
serf_lan:
coordinate_resets = 0
encrypted = false
event_queue = 1
event_time = 2
failed = 0
health_score = 0
intent_queue = 0
left = 0
member_time = 1
members = 1
query_queue = 0
query_time = 1
serf_wan:
coordinate_resets = 0
encrypted = false
event_queue = 0
event_time = 1
failed = 0
health_score = 0
intent_queue = 0
left = 0
member_time = 1
members = 1
query_queue = 0
query_time = 1
Consul Version
Prod Environment: v1.11.1 (k8s) Test Environment: v1.15.4 (container), v1.18.0 (host)
Whether deployed in k8s mode, or container or host mode, the above three versions have no way to deregister the service through the service ID contains a URL string.
https://github.com/hashicorp/consul/issues/13913 https://github.com/hashicorp/consul/pull/14031
There are many similar issues, and fixes, but it has not been resolved in the latest version.
Operating system and Environment details
OS: CentOS Linux release 7.9.2009 (Core)
Kernel: Linux 3.10.0-1160.45.1.el7.x86_64
Log Fragments
None.