我正在kubernetes文档上遵循此concept guide,以使用服务的完全限定域名连接到其他名称空间中的服务。
service.yml
---
# declare front service
kind: Service
apiVersion: v1
metadata:
name: traefik-frontend-service
namespace: traefik
spec:
selector:
k8s-app: traefik-ingress-lb
tier: reverse-proxy
ports:
- port: 80
targetPort: 8080
type: NodePort
ingress.yml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-web-ui-ingress
namespace: traefik
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.passHostHeader: "false"
traefik.frontend.priority: "1"
spec:
rules:
- host: example.com
http:
paths:
- path: /
backend:
serviceName: traefik-frontend-service.traefik.svc.cluster.local
servicePort: 80
但是我一直收到此错误:
入口“ traefik-web-ui-ingress”无效:spec.rules [0] .http.backend.serviceName:无效值:“ traefik-frontend-service.traefik.svc.cluster.local”:a DNS-1035标签必须由小写字母数字字符或“-”组成,以字母字符开头,并以字母数字字符结尾(例如“ my-name”或“ abc-123”,用于验证的正则表达式为“ az” ?')
traefik-frontend-service.traefik.svc.cluster.local
的服务名称:
-
不知道我在这里做错了什么... 除非必须为每个命名空间创建一个新的入口。
答案 0 :(得分:1)
这是为了避免跨命名空间暴露而设计的,在此thread中解释了为何有意对入口规范进行此限制。
这意味着,入口只能公开同一名称空间内的服务。
提供的值应该是服务名称,而不是FQDN。
如果您确实需要以这种方式设计,则其他替代方法是:
使用Contour Ingress (by heptio)将路由委派给其他名称空间。
使用轮廓将是这样的:
# root.ingressroute.yaml
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: namespace-delegation-root
namespace: default
spec:
virtualhost:
fqdn: ns-root.bar.com
routes:
- match: /
services:
- name: s1
port: 80
# delegate the subpath, `/blog` to the IngressRoute object in the marketing namespace with the name `blog`
- match: /blog
delegate:
name: blog
namespace: marketing
------------------------------------------------------------
# blog.ingressroute.yaml
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: blog
namespace: marketing
spec:
routes:
- match: /blog
services:
- name: s2
port: 80