【问题标题】:How to find the correct api version in Kubernetes?如何在 Kubernetes 中找到正确的 api 版本?
【发布时间】:2020-05-09 13:38:22
【问题描述】:

我有一个关于在 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 特有的。这是冲突版本的普遍问题。有什么方法可以确定我的集群环境支持哪些 apiVersions?

关于使用已弃用的 apiVersions 发布了很多过时的示例,我想知道是否有某种官方的 apiVersion 目录用于 kubernetes?或者也许有一些 kubectl 命令我可以要求 apiversions?

【问题讨论】:

  • 你安装了 CRD 吗?
  • 是的,我想是的,traefik 是一个 CRD。
  • "traefik is a CRD" --- 嗯,我不确定这句话是否有意义。 CRD 是一种特殊类型的 kubernetes 资源,它必须由您或其他人安装。
  • 是的,但是如果你在 kubernetes 中安装 traefik,你通常会像这样安装 CRD:docs.traefik.io/user-guides/crd-acme - 所以我认为我已经安装了 CRD

标签: kubernetes traefik


【解决方案1】:

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

kubectl api-versions | grep traefik
traefik.containo.us/v1alpha1

使用以下命令检查 Kubernetes 集群上安装的 crd。

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 here

【讨论】:

  • 是的,这就是我在我的 kubernetes 集群中看到的。我的问题中的中间件对象定义来自官方 traefik 文档。为什么 Kubernetes 抱怨 apiVersion ?
  • 也许我的错是我使用一个“kubectl apply -f...”命令应用了所有 CRD 和部署对象。如果我在几秒钟后为 midelewares(在 CRD 中定义)调用应用命令,则消息不会出现。
  • 是的,这可能会发生..您使用 kubectl 应用的所有内容都是异步发生的,因此可能需要一些时间才能提交到 etcd 中,直到那时它才能使用
【解决方案2】:

我发现,如果我在几分钟后再次运行 kubectl apply,它就会起作用。

【讨论】:

  • 是的,这是真的。某些对象(例如中间件)需要一些时间才能可用,有时最好通过不同的 yaml 文件分别创建/应用对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
相关资源
最近更新 更多