我试图特意创建弃用的 K8S 资源apiVersion
以用于测试目的,但最终还是将资源转换为非弃用的apiVersion
。我不明白为什么会发生这种情况,也找不到任何关于如何强制 K8S API 尊重我的资源清单的讨论/主题。
有人知道怎么做吗?或者甚至为什么它就是那样表现的?
这是我正在尝试创建的资源:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: deprecated-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
serviceName: test
servicePort: 80
我尝试在具有以下版本的多个集群上创建此资源:
- 1.16
- 1.21
- 1.23
对于每个集群,我都使用相应的kubectl
版本。这表明“转换”未在客户端发生。
这是在集群上创建的资源,你可以看到,它apiVersion
是不一样的……
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.k8s.io/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"deprecated-ingress","namespace":"test1"},"spec":{"rules":[{"host":"example.com","http":{"paths":[{"backen
d":{"serviceName":"test","servicePort":80},"path":"/*","pathType":"ImplementationSpecific"}]}}]}}
creationTimestamp: "2022-06-02T12:06:04Z"
finalizers:
- networking.gke.io/ingress-finalizer-V2
generation: 1
managedFields:
- apiVersion: networking.k8s.io/v1beta1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:finalizers:
.: {}
v:"networking.gke.io/ingress-finalizer-V2": {}
manager: glbc
operation: Update
time: "2022-06-02T12:06:04Z"
- apiVersion: networking.k8s.io/v1beta1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.: {}
f:kubectl.kubernetes.io/last-applied-configuration: {}
f:spec:
f:rules: {}
manager: kubectl
operation: Update
time: "2022-06-02T12:06:04Z"
name: deprecated-ingress
namespace: test1
resourceVersion: "489457660"
selfLink: /apis/networking.k8s.io/v1/namespaces/test1/ingresses/deprecated-ingress
uid: c8c80e6f-3e72-45b7-aca7-d17ab4a49f19
spec:
rules:
- host: example.com
http:
paths:
- backend:
service:
name: test
port:
number: 80
path: /*
pathType: ImplementationSpecific
status:
loadBalancer: {}
我也尝试了 CronJob 和版本batch/v1beta1
,最终选择了该batch/v1
版本。
答案1
当您使用 Kubernetes API 将对象提交到 API 服务器时,您可以使用以下方式访问该资源任何您的集群知道如何提供服务的相同 API 的版本。
以下是Kubernetes API 版本控制有效。如果您向提交 Ingress,https://cluster.example/apis/networking.k8s.io/v1beta1/namespaces/example/ingresses
那么您的请求将被视为使用 v1beta1 Ingress API,然后您可以使用 GET 读取该对象https://cluster.example/apis/networking.k8s.io/v1/namespaces/example/ingresses/deprecated-ingress
这客户选择要使用的 API。尝试运行kubectl get ingresses.v1beta1.networking.k8s.io deprecated-ingress
,您可以通过 v1beta1 API 读取该对象。如果您使用的客户端不是kubectl
,请检查您的客户端提供什么机制来选择要请求的 API 版本。
还有一个实现细节,涵盖了如何将该对象序列化到 etcd 中。除非您知道这对您很重要,否则请忽略序列化数据的样子,并依靠 Kubernetes 自动将对象转换为任何稳定 API 版本的能力,无论它们如何存储。
顺便说一句:如果你创建了 CustomResourceDefinitions,那么转换就是不是自动。您需要实现自己的转换代码并配置 CustomResourceDefinition 以根据需要将其调用为 HTTP 请求/响应 RPC。