【问题标题】:Kubectl always returns a error: yaml: mapping values are not allowed in this contextKubectl 总是返回错误:yaml: mapping values are not allowed in this context
【发布时间】:2017-03-19 00:36:30
【问题描述】:

Kubectl 命令总是返回这个错误 yaml: line 2: mapping values are not allowed in this context。即使我调用普通版本命令、配置命令等。不确定是什么原因造成的。

tessact@tessact-sys-1:~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"4",
GitVersion:"v1.4.4",
GitCommit:"3b417cc4ccd1b8f38ff9ec96bb50a81ca0ea9d56",
GitTreeState:"clean", BuildDate:"2016-10-21T02:48:38Z",
GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/amd64"}
error: yaml: line 2: mapping values are not allowed in this context


tessact@tessact-sys-1:~/[some path]$ kubectl create -f kubernetes_configs/frontend.yaml
error: yaml: line 2: mapping values are not allowed in this context

我使用的唯一yaml文件是

apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  replicas: 3
  template:
    metadata:
      labels:
        name: frontend
    spec:
      containers:
      - name: trigger
        # Replace  with your project ID or use `make template`
        image: asia.gcr.io/trigger-backend/trigger-backend

        # This setting makes nodes pull the docker image every time before
        # starting the pod. This is useful when debugging, but should be turned
        # off in production.
        imagePullPolicy: Always
        ports:
        - containerPort: 8080


apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    name: frontend

无论我用 kubectl 尝试什么,它都会返回此错误。我该怎么做才能解决这个问题?

> tessact@tessact-sys-1:~/developer/trigger-backend-dev/trigger-backend$
> kubectl get service error: yaml: line 2: mapping values are not
> allowed in this context

输出:

strace kubectl version

here

【问题讨论】:

  • 您应该更正您的 YAML。您可能正在使用制表符,删除它们,然后检查缩进是否正确。请将您帖子中的屏幕截图替换为文本(以便对其进行索引)并包含您的 YAML 文件的相关行(从开头到至少第 3 行)。
  • yaml 文件如何影响“kubectl 版本”命令
  • 你试过那些网址吗?哪个返回的东西看起来像是损坏的 YAML 文件?损坏文件的具体内容是什么?
  • 在我的情况下似乎 yaml 语法错误,使用任何在线 yaml linter 来检查错误。
  • 对我来说,原因是我有 'replicas:1' 而不是 'replicas:1',一个空格导致错误,要非常小心和准确地手动编写 yaml

标签: yaml kubernetes kubectl


【解决方案1】:

版本命令已经抛出错误表明有一些默认的 YAML 文件被加载。

您可以使用strace kubectl version 查看打开的文件,希望在kubectl 引发错误之前完成。我假设它读取了一些全局配置(或者您当前目录中的默认文件)。

在kubernetes中不捕捉这样的错误,并显示文件名,然后重新引发错误,当然是草率的编程。

【讨论】:

  • 我附上了 strace kubectl 版本的输出
  • 一旦我停止了 gitlab 在 8080 端口运行,错误就消失了。我真的不知道这与任何 yaml 文件有什么关系。但既然你告诉我要尝试 strace 的 url,我就能解决它。
  • @StarLord, @Anthon, 同样在这里,我在后台运行了一个容器-strace kubectl version 命令显示的错误实际上是由console.log 打印的语句的第一个字母正在运行的容器。我不明白这两件事是如何相关的 - 但我删除了容器,然后它就没有问题了...... :)
【解决方案2】:

大多数情况下,当您遇到这样的错误时(笼统地说)是因为:-

1)。 yaml 文件中的语法错误(在您的情况下不是)。

2)。或者就像错误所说的“在这种情况下不允许映射值”。这意味着您在 yaml 中使用的键/值可能在语法上是正确的,但在语义上可能不正确。

【讨论】:

  • 在我的情况下,我在 - 数组表示法之后错过了一个空格,这会在其他地方导致完全相同的错误。 kubectl 的错误报告是我见过的最糟糕的报告之一
  • 在我的例子中,我不小心将一个键向左缩进,这使得它下面的所有东西看起来都像它的键。但是键本身也有一个值,因此映射错误。
【解决方案3】:

确保您已完成该步骤:

mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

即使是 root 用户。

我也无法看到来自

的版本
kubectl 版本

【讨论】:

  • 这个。当您没有 $HOME/.kube/config 文件存在时,您会收到此错误。
【解决方案4】:

只是添加... 在对我的 YAML 文件执行复制/粘贴操作后,我今天看到了这个错误。该过程引入了一些kubectl 无法破译的空白字符。

如果您不确定,请先将 YAML 粘贴到文本编辑器中,该编辑器将显示所有不可见字符,并确保它们与 YAML 文件的其余部分一致。

【讨论】:

    【解决方案5】:

    由于即使在运行 kubectl version 时也会出现错误,我想说你的 kubeconfig 文件中存在 yaml 语法错误,默认位于 ~/.kube/config

    您可以使用像 this one 这样的 yaml 验证器来验证其内容。

    【讨论】:

    • 我用 YAMLlint 检查了我的配置文件。这是一个有效的 YAML。感谢您的回答。但问题是我仍然无法理解的其他问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2019-02-24
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多