Kubernetes中服务的全限定域名(FQDN)无法正常工作? DNS-1035

时间:2019-02-21 07:40:31

标签: kubernetes

我正在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的服务名称:

  • 以字母数字字符开头
  • 以字母数字字符结尾
  • 仅包含字母数字或-

不知道我在这里做错了什么... 除非必须为每个命名空间创建一个新的入口

1 个答案:

答案 0 :(得分:1)

这是为了避免跨命名空间暴露而设计的,在此thread中解释了为何有意对入口规范进行此限制。

这意味着,入口只能公开同一名称空间内的服务

提供的值应该是服务名称,而不是FQDN。

如果您确实需要以这种方式设计,则其他替代方法是:

  • 将Traefik公开为LB服务,然后创建数据服务以向traefik提供路由规则。
  • 使用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