【问题标题】:Helm upgrade failed with error "no matches for kind "StatefulSet" in version "apps/v1beta2"" when using helm & tiller使用 helm 和 tiller 时,Helm 升级失败并出现错误“版本“apps/v1beta2”中的种类“StatefulSet”不匹配”
【发布时间】:2021-01-12 13:54:13
【问题描述】:

升级 Kubernetes 版本后,我收到错误: Error: failed decoding rader into objects: unable to recognize "": no matches for kind "StatefulSet" in version "apps/v1beta2" 在我对 StackOverflow 和网上更多类似问题进行了一些研究后,我发现了两种克服方法: 降级 Kubernetes 版本——这个解决方案目前是不可能的。 将以下行添加到 --runtime-config=apps/v1beta1=true,apps/v1beta2=true,extensions/v1beta1/daemonsets=true,extensions/v1beta1/deployments=true,extensions/v1beta1/replicasets=true,extensions/v1beta1/networkpolicies=true,extensions/v1beta1/podsecuritypolicies=true /etc/kubernetes/manifest/kube-apiserver.yaml 文件中。

我知道这个文件位于 api-server 本身的 docker 镜像中,所以我寻找这个特定的镜像,但我找到了 3 个名为 kube-apiserver-ip-xx.xx.xx.xxx.eu-west-1.compute.internal 和文件 kube-apiserver.yaml 全部丢失。

所以我继续研究,发现文件实际上位于 master 内部而不是 pod 中。

除了上述之外,构建过程还使用了分蘖,我不知道它是否与这个问题有关,甚至可能需要对分蘖配置进行一些额外的调整。 我在一些帖子中读到我需要更改主节点,但我不明白如何使用 kubectl 找到这个特定节点。 总而言之,我有两个问题:

1.分蘖是否会影响我想要的解决方案的过程?

2.我在哪里可以找到 api-server 的主节点以及如何访问它(即哪些 kubectl 命令等)。

我仍然是 Kubernetes、helm 和 tiller 的初学者,因此为我的无知道歉。 感谢

【问题讨论】:

    标签: kubernetes kubernetes-helm kubectl


    【解决方案1】:

    如您所知,API 版本可能会根据 k8s 集群版本而有所不同或更新。到目前为止,我已经了解,您有一个较早部署的掌舵图,并且在升级 k8s 集群之后,您在重新部署它时遇到了这个 API 版本不匹配的问题。 你没有提到升级后你现在运行的k8s版本。 所以要解决这个问题,你必须找出statefulset的确切api版本。这可以通过使用下面的命令来完成。

    kubectl api-resources |grep statefulsets
    

    您将获得包含列的输出,其中之一是 APIGROUP,它将是 apps

    现在尝试从以下命令获取 api-versions。

    kubectl api-versions |grep apps
    

    您将获得可以使用以下命令进一步验证的确切版本。

    kubectl explain statefulsets
    

    输出将包含 VERSION 字段,这是 statefulsets 支持的 api 版本。

    现在编辑 helm chart 的 deployment.yml 文件并使用从命令中获得的新 api 版本更改 apiVersion 并重新部署。

    【讨论】:

    • 10x 为您提供帮助!我所有的 deployment.yaml 文件都已经更新为当前版本,即“apps/v1”。我验证了几次。但是,错误仍然是相同的:Error: failed decoding reader into objects: unable to recognize "": no matches for kind "StatefulSet" in version "apps/v1beta2" 这太奇怪了,直到我所有具有“apiVersion”属性的 yaml 文件都等于 v1 或 apps/v1。有什么想法吗?另外 - 我想提一下,这个特定的错误发生在 bitbucket 管道期间......
    • 为了在更改文件的apiVersion 时尽量减少出错的可能性,您可以使用kubectl convert 命令。
    【解决方案2】:

    Kubernetes 1.16 removed the "beta" versions of several resources in favor of stable versions。仅 Kubernetes supports the three most recent releases,在我写这篇文章时,1.19 是当前版本,因此当前支持的 Kubernetes 版本(1.17、1.18 或 1.19)根本不支持 apiVersion: apps/v1beta2

    您需要在 Helm 图表中找到特定的 StatefulSet 声明,并将其版本更改为 apiVersion: apps/v1。这可能无需进一步更改即可工作;如果没有,当您尝试安装该版本时,您可能会收到验证错误。您可能会在部署中遇到类似问题。

    这与 (Helm v2) Tiller 进程无关,您不应尝试通过更改集群配置来解决此问题。我发现 Helm v2 对某些更改有点挑剔,在尝试重新部署之前,您可能需要 helm del --purge 现有安装。

    【讨论】:

      【解决方案3】:

      David 和 Taybur 是对的,但我想分享一些关于这个主题的有用提示。正如我之前在 cmets 中提到的,为了在更改文件的 apiVersion 时将错误概率降至最低,您可以使用 kubectl convert command

      在不同 API 版本之间转换配置文件。 YAML 和 接受 JSON 格式。

      该命令将文件名、目录或 URL 作为输入,并将其转换 转换为 --output-version 标志指定的版本格式。如果目标 未指定或不支持版本,请转换为最新版本。

      此外,以下命令将列出所有资源类型及其最新支持的 API 版本:

      for kind in `kubectl api-resources | tail +2 | awk '{ print $1 }'`; do kubectl explain $kind; done | grep -e "KIND:" -e "VERSION:"
      

      如果需要,您可以随时查看API reference

      【讨论】:

        猜你喜欢
        • 2020-03-05
        • 2021-04-02
        • 2020-04-08
        • 2021-02-25
        • 2022-11-11
        • 2021-01-29
        • 2019-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多