Kubernetes创建部署时出现意外的SchemaError。

73

我正在按照这个教程操作 (https://www.baeldung.com/spring-boot-minikube), 我想在yaml文件(simple-crud-dpl.yaml)中创建Kubernetes部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-crud
spec:
  selector:
      matchLabels:
        app: simple-crud
  replicas: 3
  template:
    metadata:
      labels:
        app: simple-crud
    spec:
      containers:
        - name: simple-crud
          image: simple-crud:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 8080

但是当我运行 kubectl create -f simple-crud-dpl.yaml 时,我遇到了以下错误:

错误:SchemaError(io.k8s.api.autoscaling.v2beta2.MetricTarget):无效对象没有其他属性

我正在使用最新版本的 kubectl:

kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.11", GitCommit:"637c7e288581ee40ab4ca210618a89a555b6e7e9", GitTreeState:"clean", BuildDate:"2018-11-26T14:38:32Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:45:25Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

我也在本地使用minikube,就像教程中所描述的那样。一切都正常,直到部署和服务的时候。我无法完成它。


我通常会期望看到一行 apiVersion: v1;加上这个有帮助吗? - David Maze
其他apiVersion的结果仍然是相同的。 - Arkadiusz Migała
你尝试过对YAML进行代码检查吗?有时这可以帮助解决一些微妙的格式错误。 - Frank Yucheng Gu
1
我刚在Mac上安装了minikube,并在另一个使用远程文件的教程中遇到了类似的问题。我的错误略有不同: kubectl create -f https://raw.githubusercontent.com/kelseyhightower/kubernetes-initializer-tutorial/master/deployments/helloworld.yaml error: SchemaError(io.k8s.api.core.v1.DaemonEndpoint): invalid object doesn't have additional properties我猜我们的kubectl设置出了一些问题。 - rennekon
18个回答

153

使用brew安装kubectl之后,您应该运行:

  1. rm /usr/local/bin/kubectl

  2. brew link --overwrite kubernetes-cli

还可以选择运行以下命令:

brew link --overwrite --dry-run kubernetes-cli


17
请问你能解释一下这个在做什么吗? - user5791460
这对我也起作用了。你知道背后的原因吗? - Jogendra Kumar
重新链接的原因是什么? - Oyeme

33

我支持@rennekon的回答。我发现我的机器上正在运行docker,它也安装了kubectl。这个kubectl的安装导致了这个问题的出现。

我采取了以下步骤:

  • 使用brew uninstall kubectl卸载它
  • 使用brew install kubectl重新安装它
  • (由于符号链接创建失败) 我强制brew使用brew link --overwrite kubernetes-cli创建符号链接

然后我就能够成功地运行kubectl apply命令了。


相同的问题,不过是由于gcloud工具安装的kubectl版本与我要操作的集群版本不一致。 - Tom McKenzie

31

我也遇到了同样的问题。在我的Mac系统上,kubectl是从Docker中运行的,这是在我安装Docker时预先安装的。你可以使用以下命令来检查:

kubectl version

请注意,如果您使用的是不同的操作系统或方法来安装和管理kubernetes,则可能需要不同的步骤。

ls -l $(which kubectl) 

现在我们需要使用brew安装的kubectl覆盖符号链接

rm /usr/local/bin/kubectl

brew link --overwrite kubernetes-cli

(optinal)

brew unlink kubernetes-cli && brew link kubernetes-cli

验证

ls -l $(which kubectl)

26

在安装 Docker 后,我在 minikube/Windows 10 上遇到了同样的问题。这是由于 kubectl 版本不匹配所致,该问题在此线程中已经提到了几次。Docker 安装了版本 1.10 的 kubectl。

有几种选择:

1)确保 k8s bin 路径位于 docker 路径之上;
2)用正确的版本替换 'c:\Program Files\Docker\Docker\resources\bin' 中的 kubectl。


问题已经解决了,我只是在命令行中运行了 where kubectl 来验证默认使用的版本,然后使用 curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/windows/amd64/kubectl.exe 获取最新版本。 - James Eby

12

你的客户端版本过旧。在我的环境中,这个版本与Docker一起发布。我必须从https://storage.googleapis.com/kubernetes-release/release/v1.14.0/bin/windows/amd64/kubectl.exe下载新的客户端,现在可以正常工作:

kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:53:57Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:45:25Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

对我来说也是一样,只需替换exe文件,现在一切都好了。 - PmanAce
似乎比被接受的答案更相关。它回答了“什么”和“为什么”的问题。 - Vlad Nikiforov

7
您可以在命令中使用"--validate=false"。例如:
kubectl create -f simple-crud-dpl.yaml --validate=false

谢谢,这对我有用!!!还可以使用: kubectl apply -f filename.yaml --validate=false - Nguyen Thanh

5
您正在使用错误的 kubectl 版本。
Kubectl 兼容上下 1 个版本,如官方文档 所述
错误信息令人困惑,但实际上是因为您的 1.10 版本未将所有必需参数发送到 1.14 API。

2
我正在使用安装了Docker客户端和Minikube的Windows 10。我遇到了以下错误:
error: SchemaError(io.k8s.api.core.v1.Node): invalid object doesn't have additional properties
我通过更新 kubectl.exe 的版本,使其与 minikube 使用的版本相同来解决这个问题。以下是步骤:
注意:Minikube 倾向于使用最新版本的 Kubernetes,因此建议获取最新的 kubectl。
  1. 下载匹配的 kubectl.exe 版本

  2. 导航到 Docker 路径,找到 kubectl 所在位置,例如 C:\Program Files\Docker\Docker\resources\bin

  3. 将已下载的 kubectl.exe 放置在该位置。如果它要求您替换它,请执行。

  4. 现在在 Powershell 中键入 refreshenv

  5. 检查新版本是否为您放置的版本:kubectl version

现在可以重试您之前的任务了。

2

Mac用户!!!这是给那些先安装了Docker桌面版的人。当您使用apply命令时,会出现错误。正如一些人在此处所说,该错误是由于版本不匹配导致的。我没有使用homebrew安装kubectl。相反,在安装Mac版Docker桌面版时,kubectl会自动安装。

为了解决这个问题,我所做的是:

删除kubectl可执行文件

Original Answer翻译成"最初的回答"

rm /usr/local/bin/kubectl

下载kubectl: curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl

更改权限:

Original Answer翻译成"最初的回答"

chmod +x ./kubectl

将可执行文件移动:

最初的回答

sudo mv ./kubectl /usr/local/bin/kubectl

就是这样!为了展示它的工作,这里是输出结果:

kubectl apply -f ./deployment.yaml
deployment.apps/tomcat-deployment created

请确保yml文件正确。我从这里下载了一个有效的文件进行测试:https://github.com/LevelUpEducation/kubernetes-demo/tree/master/Introduction%20to%20Kubernetes/Your%20First%20k8s%20App。最初的回答提供了可靠的yml文件,您可以使用它来测试您的应用程序。请务必检查您的文件是否与提供的文件格式相同,并且没有任何拼写错误或其他语法错误。

2

在Windows 10上运行kubectl explain pod时,我遇到了以下错误:

"最初的回答"

error: SchemaError(io.k8s.api.core.v1.NodeCondition): invalid object doesn't have additional properties

我曾经同时安装了Minikube和Docker Desktop。正如之前的回答所提到的,出现这个错误的原因是服务器版本(主要版本1次要版本15)与客户端版本(主要版本1次要版本10)不匹配。客户端版本来自Docker Desktop。 为了解决问题,我升级了kubectl客户端版本到v1.15.1,具体步骤在这里


curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.1/bin/windows/amd64/kubectl.exe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接