如何在Kubernetes中找到正确的api版本?

如何在Kubernetes中找到正确的api版本?,kubernetes,traefik,Kubernetes,Traefik,我有一个关于Kuberntes中apiVersion用法的问题 例如,我正在尝试将traefik 2.2.1部署到我的kubernetes集群中。我有这样一个traefik中间件部署定义: --- apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: https-redirect spec: redirectScheme: scheme: https permanent: tru

我有一个关于Kuberntes中apiVersion用法的问题

例如,我正在尝试将traefik 2.2.1部署到我的kubernetes集群中。我有这样一个traefik中间件部署定义:

---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: https-redirect
spec:
  redirectScheme:
    scheme: https
    permanent: true
    port: 443
当我尝试使用部署对象时

$ kubectl apply -f middleware.yaml
我收到以下错误消息:

unable to recognize "middleware.yaml": no matches for kind "Middleware" in version "traefik.containo.us/v1alpha1"
同一对象在Traefik 2.2.0版上运行良好,但在2.2.1版上运行不好

在traefik文档中,除了使用版本“traefik.containo.us/v1alpha1”的示例之外,没有其他示例

我不认为我的部署问题是针对traefik的。版本冲突是一个普遍的问题。我有没有办法知道我的集群环境支持哪些API版本


有太多过时的例子使用不推荐的apiVersion发布,我想知道是否有一些正式的apiVersion目录用于kubernetes?或者可能有一些kubectl命令,我可以要求提供apiversions?

很可能没有安装traefik v2的CRD。您可以使用下面的命令列出Kubernetes集群上可用的API版本

kubectl api-versions | grep traefik
traefik.containo.us/v1alpha1
kubectl get crds
NAME                                   CREATED AT
ingressroutes.traefik.containo.us      2020-05-09T13:58:09Z
ingressroutetcps.traefik.containo.us   2020-05-09T13:58:09Z
ingressrouteudps.traefik.containo.us   2020-05-09T13:58:09Z
middlewares.traefik.containo.us        2020-05-09T13:58:09Z
tlsoptions.traefik.containo.us         2020-05-09T13:58:09Z
tlsstores.traefik.containo.us          2020-05-09T13:58:09Z
traefikservices.traefik.containo.us    2020-05-09T13:58:09Z
使用以下命令检查Kubernetes群集上安装的CRD

kubectl api-versions | grep traefik
traefik.containo.us/v1alpha1
kubectl get crds
NAME                                   CREATED AT
ingressroutes.traefik.containo.us      2020-05-09T13:58:09Z
ingressroutetcps.traefik.containo.us   2020-05-09T13:58:09Z
ingressrouteudps.traefik.containo.us   2020-05-09T13:58:09Z
middlewares.traefik.containo.us        2020-05-09T13:58:09Z
tlsoptions.traefik.containo.us         2020-05-09T13:58:09Z
tlsstores.traefik.containo.us          2020-05-09T13:58:09Z
traefikservices.traefik.containo.us    2020-05-09T13:58:09Z

检查traefik v1与v2,很可能未安装traefik v2的CRD。您可以使用下面的命令列出Kubernetes集群上可用的API版本

kubectl api-versions | grep traefik
traefik.containo.us/v1alpha1
kubectl get crds
NAME                                   CREATED AT
ingressroutes.traefik.containo.us      2020-05-09T13:58:09Z
ingressroutetcps.traefik.containo.us   2020-05-09T13:58:09Z
ingressrouteudps.traefik.containo.us   2020-05-09T13:58:09Z
middlewares.traefik.containo.us        2020-05-09T13:58:09Z
tlsoptions.traefik.containo.us         2020-05-09T13:58:09Z
tlsstores.traefik.containo.us          2020-05-09T13:58:09Z
traefikservices.traefik.containo.us    2020-05-09T13:58:09Z
使用以下命令检查Kubernetes群集上安装的CRD

kubectl api-versions | grep traefik
traefik.containo.us/v1alpha1
kubectl get crds
NAME                                   CREATED AT
ingressroutes.traefik.containo.us      2020-05-09T13:58:09Z
ingressroutetcps.traefik.containo.us   2020-05-09T13:58:09Z
ingressrouteudps.traefik.containo.us   2020-05-09T13:58:09Z
middlewares.traefik.containo.us        2020-05-09T13:58:09Z
tlsoptions.traefik.containo.us         2020-05-09T13:58:09Z
tlsstores.traefik.containo.us          2020-05-09T13:58:09Z
traefikservices.traefik.containo.us    2020-05-09T13:58:09Z

检查traefik v1 vs v2我发现如果我在几分钟后再次运行kubectl应用程序,它就会工作。

我发现如果我在几分钟后再次运行kubectl应用程序,它就会工作。

你安装了CRD吗?是的,我想是的,traefik是一个CRD。“traefik是一个CRD”-嗯,我不确定这句话是否有意义。CRD是一种特殊类型的kubernetes资源,必须由您或其他人安装。是的,但如果您在kubernetes中安装traefik,您通常会这样安装CRD:-那么是的,我认为我安装了CRD,您安装了CRD吗?是的,我认为是的,traefik是CRD。“traefik是CRD”--嗯,我不确定这句话是否有意义。CRD是一种特殊类型的kubernetes资源,必须由您或其他人安装。是的,但如果您在kubernetes中安装traefik,您通常会这样安装CRD:-所以是的,我认为我已经安装了CRDs是的,这是我在kubernetes群集中看到的。我的问题中的中间件对象定义来自正式的traefik文档。为什么kubernetes抱怨apiVersion?也许我的错误是我用一个“kubectl apply-f…”命令应用了所有CRD和部署对象。如果我为mideleware(在CRD中定义)调用apply命令几秒钟后,该消息将不会出现。是的,这可能会发生。.您应用于kubectl的所有操作都是异步进行的,因此可能需要一些时间才能提交到etcd中,直到那时它才可用。这是我在kubernetes集群中看到的。我的问题中的中间件对象定义来自正式的traefik文档。为什么kubernetes抱怨apiVersion?也许我的错误是我用一个“kubectl apply-f…”命令应用了所有CRD和部署对象。如果我为MIDELEware(在CRDs中定义)调用apply命令,几秒钟后将不会出现消息。是的,可能会发生。使用kubectl应用的所有内容都是异步发生的,因此可能需要一些时间才能提交到etcd中,直到那时它才可用。这是真的。某些对象(例如中间件)需要一些时间才能可用,有时最好通过不同的yaml文件分别创建/应用这些对象。是的,这是正确的。某些对象(例如中间件)需要一些时间才能可用,有时最好通过不同的yaml文件分别创建/应用这些对象。