我的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
关闭验证答案 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必须猜测该行出了什么问题。请注意,yamllint仍将该YAML视为有效。kubectl
在将数据发送到kube-apiserver
之前所做的。例如,可以使用json2yaml工具来做到这一点。您会立即看到该工具将其解析为映射而不是数组。应该如何工作。 与所有其他Kubernetes资源一样,Ingress需要apiVersion,种类和元数据字段。此外,Ingress经常根据Ingress控制器使用注释来配置一些选项,其中一个示例是重写目标注释。 不同的Ingress控制器支持不同的注释。
如果有人需要有关重写目标的全面信息,则可以here
IngressRule表示将指定主机下的路径映射到相关后端服务的规则。首先对传入的请求进行主机匹配评估,然后将其路由到与匹配的IngressRuleValue关联的后端。
host
必须是string
类型,并且必须包含网络主机的完全限定域名(FQDN)。
当前限制(客户端GitVersion:“ v1.16.3”,服务器GitVersion:“ v1.14.8-gke.12”):
:
分隔符,因为不允许使用端口。截至目前,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
)
希望有帮助。