出现我不理解的k8s错误

时间:2019-11-26 01:07:34

标签: kubernetes

我的Yaml文件。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    -http:
      paths:
        - path: /?(.*)
          backend:
            serviceName: nginx-service
            servicePort: 80

kubectl apply -f file.yaml

错误:错误验证“ ingress.yaml”:错误验证数据:ValidationError(Ingress.spec.rules):io.k8s.api.networking.v1beta1.IngressSpec.rules的类型无效:获取了“地图”,预期为“阵列”;如果您选择忽略这些错误,请使用--validate = false

关闭验证

2 个答案:

答案 0 :(得分:1)

这仅是Yaml模板错误,请使用

kubectl explain ingress.spec.rules

了解想法。

入口规则中也缺少主机名,应该是

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    -host:{replace-me-with-hostname}
     http:
       paths:
        - path: /?(.*)
          backend:
            serviceName: nginx-service
            servicePort: 80 

答案 1 :(得分:0)

问题是“ -http”中的错字(连字符和“ h”字母之间没有空格字符)。

spec:
  rules:
    -http:   <--- this doesn't create an array, and array is expected instead of map
      paths:

如何解决此类问题(以及Kubernetes在“ under_the_hood”中所做的事情):

  • yamllint。可以将yaml代码放入任何在线YAML syntax validator中。让我们检查line_11。有?符号,表示yamllint必须猜测该行出了什么问题。请注意,yamllint仍将该YAML视为有效。

enter image description here

  • 将Yaml转换为JSON。这就是kubectl在将数据发送到kube-apiserver之前所做的。例如,可以使用json2yaml工具来做到这一点。您会立即看到该工具将其解析为映射而不是数组。

Tha是如何使用不正确的YAML转换为JSON的。 incorrect YAML

并使用更正后的YAML将其解析为array correct YAML . <code>rules</code> contain an array

应该如何工作。 与所有其他Kubernetes资源一样,Ingress需要apiVersion,种类和元数据字段。此外,Ingress经常根据Ingress控制器使用注释来配置一些选项,其中一个示例是重写目标注释。 不同的Ingress控制器支持不同的注释。

如果有人需要有关重写目标的全面信息,则可以here

IngressRule表示将指定主机下的路径映射到相关后端服务的规则。首先对传入的请求进行主机匹配评估,然后将其路由到与匹配的IngressRuleValue关联的后端。

host必须是string类型,并且必须包含网络主机的完全限定域名(FQDN)。 当前限制(客户端GitVersion:“ v1.16.3”,服务器GitVersion:“ v1.14.8-gke.12”):

  • 不允许使用IP。 IngressRuleValue只能应用于父级Ingress规范中的IP。
  • 不遵守:分隔符,因为不允许使用端口。截至目前,Ingress的端口对于HTTP隐式为:80,对于https隐式为:443。

这两种情况将来都有可能改变。

传入请求在IngressRuleValue之前与主机匹配。如果未指定主机,则Ingress会根据指定的IngressRuleValue路由所有流量。

因此,结构应如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dual-ingress
  annotations:
    <your-annotations-go-here>
spec:
  rules:
  - host: <your-hostname-1-goes-here>
    http:
      paths:
      - path: <host-1-path-1>
        backend:
          serviceName: <service1>
          servicePort: <service1-port>
      - path: <host-1-path-2>
        backend:
          serviceName: <service2>
          servicePort: <service2-port>
  - host: <your-hostname-2-goes-here>
    http:
      paths:
      - path: <host-2-path-1>
        backend:
          serviceName: <service3>
          servicePort: <service3-port>
      - path: <host-2-path-2>
        backend:
          serviceName: <service4>
          servicePort: <service4-port>

上面的YAML创建了以下Ingress:

kubectl get ingress 

NAME           HOSTS                                     ADDRESS   PORTS   AGE
dual-ingress   your-hostname-1,your-hostname-2,bar.com             80      14s

如果您未在YAML中指定主机,则将根据IngressRuleValue路由所有流量。 YAML示例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mono-ingress
  annotations:
    <your-annotations-go-here>
spec:
  rules:
     - http:
        paths:
          - path: <path-1>
            backend:
              serviceName: <service1>
              servicePort: <service1-port>
          - path: <path-2>
            backend:
              serviceName: <service2>
              servicePort: <service2-port>

上面的YAML创建了以下Ingress:

kubectl get ingress -o wide 
NAME           HOSTS                ADDRESS   PORTS   AGE
mono-ingress   *                              80      10s

因此,总而言之,rules:字段应包含一个array(而且主题起始者在“-”和“ http”之间缺少单个空格字符,因此未将其解析为{{ 1}},但array

希望有帮助。