升级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,头盔和分,的初学者,对我的无知深表歉意。 感激
答案 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。