apiserver
apiserver copied to clipboard
apiserver returns incorrectly results when "Limit" and "LabelSelector" parameters are both set in certain case
Kubernetes Version:
$ kubectl version -o yaml
clientVersion:
buildDate: "2022-06-15T14:22:29Z"
compiler: gc
gitCommit: f66044f4361b9f1f96f0053dd46cb7dce5e990a8
gitTreeState: clean
gitVersion: v1.24.2
goVersion: go1.18.3
major: "1"
minor: "24"
platform: linux/amd64
kustomizeVersion: v4.5.4
serverVersion:
buildDate: "2022-06-24T09:25:13Z"
compiler: gc
gitCommit: efbcd8d250c89b4290356c0fc27843d583c80a35
gitTreeState: clean
gitVersion: v1.23.8-gke.400
goVersion: go1.17.10b7
major: "1"
minor: "23"
platform: linux/amd64
Deployment Setup I had 35 StatefulSets deployed in one namespace as below:
$ kubectl get sts -n yonis-1
NAME READY AGE
elasticsearch-master 1/1 5d21h
sealed-secrets-1-redis-master 1/1 20h
sealed-secrets-10-redis-master 1/1 20h
sealed-secrets-11-redis-master 1/1 20h
sealed-secrets-12-redis-master 1/1 20h
sealed-secrets-13-redis-master 1/1 20h
sealed-secrets-14-redis-master 1/1 20h
sealed-secrets-15-redis-master 1/1 20h
sealed-secrets-16-redis-master 1/1 20h
sealed-secrets-17-redis-master 1/1 20h
sealed-secrets-18-redis-master 1/1 20h
sealed-secrets-19-redis-master 1/1 20h
sealed-secrets-2-redis-master 1/1 20h
sealed-secrets-20-redis-master 1/1 20h
sealed-secrets-21-redis-master 1/1 20h
sealed-secrets-22-redis-master 1/1 20h
sealed-secrets-23-redis-master 1/1 20h
sealed-secrets-24-redis-master 1/1 20h
sealed-secrets-25-redis-master 1/1 20h
sealed-secrets-26-redis-master 1/1 20h
sealed-secrets-27-redis-master 1/1 20h
sealed-secrets-28-redis-master 1/1 20h
sealed-secrets-29-redis-master 1/1 20h
sealed-secrets-3-redis-master 1/1 20h
sealed-secrets-30-redis-master 1/1 20h
sealed-secrets-31-redis-master 1/1 20h
sealed-secrets-32-redis-master 1/1 20h
sealed-secrets-33-redis-master 1/1 20h
sealed-secrets-34-redis-master 1/1 20h
sealed-secrets-4-redis-master 1/1 20h
sealed-secrets-5-redis-master 1/1 20h
sealed-secrets-6-redis-master 1/1 20h
sealed-secrets-7-redis-master 1/1 20h
sealed-secrets-8-redis-master 1/1 20h
sealed-secrets-9-redis-master 1/1 20h
Among all of them, only elasticsearch-master has labels below:
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: elasticsearch-master
chart: elasticsearch
data: elasticsearch
...
Other sealed-secrets-{#}-redis-master does not have such labels.
Issue: When I used kubectl with only label selector, everything worked fine:
$ kubectl get sts -n yonis-1 -l app=elasticsearch-master,guardicore.app=infra,data=elasticsearch
NAME READY AGE
elasticsearch-master 1/1 5d21h
It worked perfectly as well when I used --raw below:
$ kubectl get --raw "/apis/apps/v1/namespaces/yonis-1/statefulsets?labelSelector=app%3Delasticsearch-master%2Cdata%3Delasticsearch%2Cguardicore.app%3Dinfra"
However, I got empty result when I added additional parameter limit as 15:
$ kubectl get --raw "/apis/apps/v1/namespaces/yonis-1/statefulsets?labelSelector=app%3Delasticsearch-master%2Cdata%3Delasticsearch%2Cguardicore.app%3Dinfra&limit=15"
"kind": "StatefulSetList",
"apiVersion": "apps/v1",
"metadata": {
"resourceVersion": "3484478"
},
"items": []
It does not give the continuous token either. I did more tests, and it turned out that if the condition total resource count > limit * 2 is met, then no result was returned.
For example, I had total 35 StatefulSets, If I gave limit greater than 18, then it returned the correct result. Otherwise, it returned nothing:
- Limit is 18, it returned the StatefulSet correctly:
kubectl get --raw "/apis/apps/v1/namespaces/yonis-1/statefulsets?labelSelector=app%3Delasticsearch-master%2Cdata%3Delasticsearch%2Cguardicore.app%3Dinfra&limit=18" - Limit is 17, nothing was returned:
kubectl get --raw "/apis/apps/v1/namespaces/yonis-1/statefulsets?labelSelector=app%3Delasticsearch-master%2Cdata%3Delasticsearch%2Cguardicore.app%3Dinfra&limit=17"
I also used client-go library to tested it, the code look like below:
cs, _ := clientset.NewForConfig(cfg)
selector := labels.SelectorFromSet(labels.Set{
"app": "elasticsearch-master",
"guardicore.app": "infra",
"data": "elasticsearch",
})
stss, _ := cs.AppsV1().StatefulSets("yonis-1").List(ctx, metav1.ListOptions{
LabelSelector: selector.String(),
Limit: 15,
})
The issue persists, so I believe it is likely an issue on apiserver when both 'limit' and 'labelSelector' parameters present.