consul-k8s injected meta can't be used in Service Resolver filters
- Dominant language
- Go
- Stars
- 30.1k
- Forks
- 4.6k
- Avg merge
- 2d 6h
- Merged PRs (30d)
- 43
Description
#### Overview of the Issue
The meta key/value pairs injected by consul-k8s (e.g. `k8s-namespace`, `pod-name`) are unusable in service resolver filters. Creating a resolver object with these in the filter will fail with:
```
[ERROR] agent.http: Request error: method=PUT url=/v1/config?dc=dc1 from=10.244.0.180:39224 error="Filter for subset \"default\" is not a valid expression: 1:17 (16): no match found, expected: \"!=\", \".\", \"==\", \"[\", [ \t\r\n] or [a-zA-Z0-9_]"
```
I believe this is due to the `-` in the key names (similar to #9941). It seems natural to support service resolver entries based on pod metadata, but this is not currently possible without additional admission controllers.
#### Reproduction Steps
Apply the following to a kubernetes cluster and consul-k8s:
```
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceResolver
metadata:
name: example
spec:
defaultSubset: default
subsets:
default:
filter: 'Service.Meta.k8s-namespace == default'
new:
filter: 'Service.Meta.k8s-namespace == new'
```
Read the entry from Consul. The resolver will be missing entirely:
```
$ consul config read -kind service-resolver -name example
Error reading config entry service-resolver/example: Unexpected response code: 404 (Config entry not found for "service-resolver" / "example")
```
Adjusting the key to have an underscore will work:
```
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceResolver
metadata:
name: example
spec:
defaultSubset: default
subsets:
default:
filter: 'Service.Meta.k8s-namespace == default'
new:
filter: 'Service.Meta.k8s-namespace == new'
```
```
$ consul config read -kind service-resolver -name example
{
"Kind": "service-resolver",
"Name": "example",
"DefaultSubset": "default",
"Subsets": {
"default": {
"Filter": "Service.Meta.k8s_namespace == default"
},
"new": {
"Filter": "Service.Meta.k8s_namespace == new"
}
},
"Meta": {
"consul.hashicorp.com/source-datacenter": "dc1",
"external-source": "kubernetes"
},
"CreateIndex": 958,
"ModifyIndex": 958
}
```
### Consul info for both Client and Server
Consul config is based on the `local` tutorial here: https://developer.hashicorp.com/consul/tutorials/get-started-kubernetes/kubernetes-gs-deploy
Server info
Output from server 'consul info' command here
```
agent:
check_monitors = 0
check_ttls = 0
checks = 0
services = 0
build:
prerelease =
revision = c3f767b1
version = 1.15.4
version_metadata =
consul:
acl = enabled
bootstrap = true
known_datacenters = 1
leader = true
leader_addr = 10.244.0.11:8300
server = true
raft:
applied_index = 966
commit_index = 966
fsm_pending = 0
last_contact = 0
last_log_index = 966
last_log_term = 2
last_snapshot_index = 0
last_snapshot_term = 0
latest_configuration = [{Suffrage:Voter ID:f9b74c7a-deb6-4d25-b7ba-fda2d6774a0e Address:10.244.0.11: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 = arm64
cpu_count = 2
goroutines = 258
max_procs = 2
os = linux
version = go1.20.4
serf_lan:
coordinate_resets = 0
encrypted = false
event_queue = 1
event_time = 2
failed = 0
health_score = 0
intent_queue = 1
left = 0
member_time = 2
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
```
Contributor guide
Assessment
This issue has not been assessed yet.