使用头盔和分er器时,头盔升级失败,并显示错误“版本“ apps / v1beta2”中的种类“ StatefulSet”不匹配”错误

时间:2020-09-26 12:07:59

标签: kubernetes kubernetes-helm kubectl

升级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服务器本身的docker映像中,因此我查找了此特定映像,但发现了3个名为 kube-apiserver-ip-xx.xx.xx.xxx.eu-west-1.compute.internal和文件kube-apiserver.yaml都缺少这三个。

因此,我继续进行研究,发现文件实际上位于主机中而不是容器中。

除上述内容外,构建过程还使用分till,我不知道它是否与此问题有关,甚至可能需要对分er配置进行一些其他调整。 我读过一些文章,我需要更改主节点,但我不明白如何使用kubectl找到该特定节点。 因此,总而言之,我有两个问题:

1。分er是否会影响我所需解决方案的过程?

2。在哪里可以找到api服务器的主节点,以及如何获得对它的访问权限(即哪些kubectl命令等)。

我仍然是Kubernetes,头盔和分,的初学者,对我的无知深表歉意。 感激

3 个答案:

答案 0 :(得分:1)

您知道,API版本可能会有所不同,或者会根据k8s集群版本进行更新。到目前为止,我了解到,您已经有一个舵图,该舵图已被较早部署,并且在升级k8s集群后,在重新部署它时会遇到此API版本不匹配的情况。 您没有提到升级后正在运行的k8s版本。 因此,要解决此问题,您必须找出statefulset的确切api版本。可以使用以下命令完成此操作。

kubectl api-resources |grep statefulsets

您将获得带有列的输出,其中之一是APIGROUP,它将为apps

现在尝试从以下命令获取api版本。

kubectl api-versions |grep apps

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

kubectl explain statefulsets

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

现在编辑头盔图表的deployment.yml文件,并使用从命令中获得的新API版本更改apiVersion 并重新部署。

答案 1 :(得分:1)

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现有安装,然后才能尝试重新部署。

答案 2 :(得分:0)

David和Taybur是正确的,但我想分享一些有关此主题的有用提示。如前所述,为了在更改文件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