禁用已弃用的资源自动转换

禁用已弃用的资源自动转换

我试图特意创建弃用的 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。

相关内容