没有匹配的类型“部署”的版本“扩展/v1beta1”

在部署 mojaloop 时,库伯内特斯回应了以下错误:

错误: 验证失败: [无法识别“”: 没有类型匹配 版本“ apps/v1beta2”中的“部署”,无法识别“”: 否 匹配版本“扩展/v1beta1”中的类型“部署”,无法 识别“”: 在版本中没有与类型“状态集”匹配 “ apps/v1beta2”,无法识别“”: 没有同类匹配 在版本「 apps/v1beta1」中的「状态集」]

我的库伯内版本是1.16。
我如何解决 API 版本的问题?
通过调查,我发现 Kubernetes 不支持 apps/v1beta2,apps/v1beta1。
我怎样才能使库伯内特使用一个不推荐的版本或其他一些支持的版本?

我刚到 Kubernetes,任何能够支持我的人我都很高兴

168657 次浏览

在 Kubernetes,1.16版本中的一些字母表已被更改。

您可以使用以下命令检查哪个 api 支持当前 Kubernetes 对象

$ kubectl api-resources | grep deployment
deployments                       deploy       apps                           true         Deployment

这意味着只有具有 apps的 apiVersion 对于部署是正确的(extensions不支持 Deployment)。状态集也是同样的情况。

您需要将 Deployment 和 StatuseSetapiVersion 更改为 apiVersion: apps/v1

如果这没有帮助,请将您的 YAML 添加到问题中。

剪辑 由于 HELM 模板包含了部署中的旧 apiVersions,而1.16版本不支持这个问题,因此有两种可能的解决方案: < br >

1. git clone全部回购,并使用脚本将 apiVersion 替换为所有 template/loyment.yaml 中的 apps/v1
2. 当验证器接受 extensions作为 DeploymentStatefulSetapiVersion时,使用旧版本的 Kubernetes (1.15)。

这是恼人的我,因为我正在测试很多头盔包,所以我写了一个快速的脚本-这可以被修改,以排序您的工作流程也许 见下文

新的工作流程 首先把图表作为 tgz 拿给你的工作目录

helm fetch repo/chart

然后在您的工作直接运行 bash 脚本下面-我命名为 helmk

helmk myreleasename mynamespace chart.tgz [any parameters for kubectl create]

Helmk 的内容-需要编辑 kubeconfig 集群名才能工作

#!/bin/bash
echo usage $0 releasename namespace chart.tgz [createparameter1] [createparameter2] ... [createparameter n]
echo This will use your namespace then shift back to default so be careful!!
kubectl create namespace $2   #this will create harmless error if namespace exists have to ignore
kubectl config set-context MYCLUSTERNAME --namespace $2
helm template -n $1 --namespace $2 $3 | kubectl convert -f /dev/stdin | kubectl create --save-config=true ${@:4}  -f /dev/stdin
#note the --namespace parameter in helm template above seems to be ignored so we have to manually switch context
kubectl config set-context MYCLUSTERNAME --namespace default

这是一个有点危险的黑客行为,因为我手动切换到您所需的新名称空间上下文,然后再次返回,所以只用于单用户开发人员真正或注释了。

您将得到一个关于如何使用 kubectl 转换工具的警告

如果你需要编辑 YAML 来自定义——只需要将/dev/stdin 中的一个替换为中间文件,但是最好像我一样使用“ create”和一个 save-config 来启动它,然后简单地“应用”你的更改,这意味着它们也将被记录在 kubernetes 中。 祝你好运

你可以选择手动更改。获取舵图:

helm fetch --untar stable/metabase

访问图表文件夹:

cd ./metabase

更改 API 版本:

sed -i 's|extensions/v1beta1|apps/v1|g' ./templates/deployment.yaml

加入 spec.selector.matchLabels:

spec:
[...]
selector:
matchLabels:
app: \{\{ template "metabase.name" . }}
[...]

最后安装修改过的图表:

helm install ./ \
-n metabase \
--namespace metabase \
--set ingress.enabled=true \
--set ingress.hosts={metabase.$(minikube ip).nip.io}

好好享受吧!

简而言之,您不必强制当前安装使用过时版本的 API; 您可以在配置文件中修复该版本。 如果要检查当前 kube 支持哪个版本,请运行:

root@ubn64:~# kubectl api-versions | grep -i apps


apps/v1

要将旧版本的 Deployment 转换为 apps/v1,可以运行:

kubectl convert -f ./my-deployment.yaml --output-version apps/v1

我得到了下面的错误-
错误: 无法识别“ loyment.yaml”: 没有与版本“ /v1beta1”中的“ Deployment”相匹配的類型

对我有效的解决方案

修改了从 apiVersion/v1beta1到 apiVersion: apps/v1的代码行

理由- 我们升级了 K8集群,因此发生了这个错误。

我在一个升级到不支持某些 api 版本(v1.17和 apps/v1beta2)的集群上面临同样的问题。

$ helm get manifest some-deployment
...
# Source: some-deployment/templates/deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: some-deployment
labels:
...


查看舵文档,似乎清单存储在集群中以供舵参考,并且它可能包含无效的 API 版本,从而导致错误。

2 建议的方法要么手动编辑清单(一个相当繁琐的多阶段过程) ,要么使用一个名为 mapkubeapis的舵插件自动完成。

$ helm plugin install https://github.com/helm/helm-mapkubeapis

它可以与 --dry-run标志一起运行来模拟效果:

$ helm mapkubeapis --dry-run some-deployment
2021/02/15 09:33:29 NOTE: This is in dry-run mode, the following actions will not be executed.
2021/02/15 09:33:29 Run without --dry-run to take the actions described below:
2021/02/15 09:33:29
2021/02/15 09:33:29 Release 'some-deployment' will be checked for deprecated or removed Kubernetes APIs and will be updated if necessary to supported API versions.
2021/02/15 09:33:29 Get release 'some-deployment' latest version.
2021/02/15 09:33:30 Check release 'some-deployment' for deprecated or removed APIs...
2021/02/15 09:33:30 Found deprecated or removed Kubernetes API:
"apiVersion: apps/v1beta2
kind: Deployment"
Supported API equivalent:
"apiVersion: apps/v1
kind: Deployment"
2021/02/15 09:33:30 Finished checking release 'some-deployment' for deprecated or removed APIs.
2021/02/15 09:33:30 Deprecated or removed APIs exist, updating release: some-deployment.
2021/02/15 09:33:30 Map of release 'some-deployment' deprecated or removed APIs to supported versions, completed successfully.

然后在没有标志的情况下运行以应用更改。

我更喜欢 kubectl explain

# kubectl explain deploy
KIND:     Deployment
VERSION:  apps/v1


DESCRIPTION:
Deployment enables declarative updates for Pods and ReplicaSets.


FIELDS:
apiVersion   <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources


kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds


metadata     <Object>
Standard object metadata.


spec <Object>
Specification of the desired behavior of the Deployment.


status       <Object>
Most recently observed status of the Deployment.

使用 kubectl explain,您还可以看到对象的特定参数:

# kubectl explain Service.spec.externalTrafficPolicy
KIND:     Service
VERSION:  v1


FIELD:    externalTrafficPolicy <string>


DESCRIPTION:
externalTrafficPolicy denotes if this Service desires to route external
traffic to node-local or cluster-wide endpoints. "Local" preserves the
client source IP and avoids a second hop for LoadBalancer and Nodeport type
services, but risks potentially imbalanced traffic spreading. "Cluster"
obscures the client source IP and may cause a second hop to another node,
but should have good overall load-spreading.