发生了什么?naming
控制器无法在修复SingularConflict
问题后更新NamesAccepted
条件。
这段代码在这里 -
kubernetes/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go
第249行到第251行的56d7898
| ifequality.Semantic.DeepEqual(inCustomResourceDefinition.Spec.Names, inCustomResourceDefinition.Status.AcceptedNames) { |
| returnnil |
| } |
当Spec.Names
等于Status.AcceptedNames
时返回nil。理想情况下,它还应该检查NamesAccepted
条件是否不为真,然后触发协调。如果this修复没问题,我可以打开PR。
你期望发生什么?
一旦从卡片名称中删除重复名称,naming
控制器应将NamesAccepted
条件更新为True
。
我们如何尽可能精确地重现它?
- 创建一个具有不同
plural
和singular
名称的CRD。
cat <<EOF | kubectl create -f -
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: bugs.crds-k8s.io
spec:
conversion:
strategy: None
group: crds-k8s.io
names:
kind: Bug
listKind: BugList
plural: bugs
singular: bug
scope: Namespaced
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
type: object
x-kubernetes-preserve-unknown-fields: true
served: true
storage: true
subresources:
status: {}
EOF
- 确保CRD条件健康,且
status.acceptedNames
与spec.names
相同。
kubectl get crds bugs.crds-k8s.io -o jsonpath='{.status.conditions[?(@.type=="NamesAccepted")]}' | jq
{
"lastTransitionTime": "2023-11-16T06:38:12Z",
"message": "no conflicts found",
"reason": "NoConflicts",
"status": "True",
"type": "NamesAccepted"
}
- 通过使单数名称等于复数来更新CRD规范。
cat <<EOF | kubectl replace -f -
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: bugs.crds-k8s.io
spec:
conversion:
strategy: None
group: crds-k8s.io
names:
kind: Bug
listKind: BugList
plural: bugs
singular: bugs
scope: Namespaced
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
type: object
x-kubernetes-preserve-unknown-fields: true
served: true
storage: true
subresources:
status: {}
EOF
- 检查CRD条件
NamesAccepted
现在失败,但status.acceptedNames
不等于spec.names
,这是预期的。
kubectl get crds bugs.crds-k8s.io -o jsonpath='{.status.conditions[?(@.type=="NamesAccepted")]}' | jq
{
"lastTransitionTime": "2023-11-16T06:51:29Z",
"message": "\"bugs\" is already in use",
"reason": "SingularConflict",
"status": "False",
"type": "NamesAccepted"
}
- 通过使单数名称不等于复数名称来修复CRD。
cat <<EOF | kubectl replace -f -
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: bugs.crds-k8s.io
spec:
conversion:
strategy: None
group: crds-k8s.io
names:
kind: Bug
listKind: BugList
plural: bugs
singular: bug
scope: Namespaced
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
type: object
x-kubernetes-preserve-unknown-fields: true
served: true
storage: true
subresources:
status: {}
EOF
- 检查即使问题已修复,CRD条件
NamesAccepted
仍然失败。
kubectl get crds bugs.crds-k8s.io -o jsonpath='{.status.conditions[?(@.type=="NamesAccepted")]}' | jq
{
"lastTransitionTime": "2023-11-16T06:51:29Z",
"message": "\"bugs\" is already in use",
"reason": "SingularConflict",
"status": "False",
"type": "NamesAccepted"
}
我们需要知道其他什么吗?
- 无响应*
Kubernetes版本
根据代码,似乎受到影响的是master
分支
云提供商
操作系统版本
# On Linux:
$ cat /etc/os-release
# paste output here
$ uname -a
# paste output here
# On Windows:
C:\> wmic os get Caption, Version, BuildNumber, OSArchitecture
# paste output here
安装工具
容器运行时(CRI)和版本(如适用)
相关插件(CNI,CSI等)和版本(如适用)
2条答案
按热度按时间lh80um4z1#
/sig api-machinery
wrrgggsh2#
有趣的边缘情况:)
/triage accepted
/assign @alexzielenski
Alex,你能看一下这个提议的补丁吗?