【问题标题】:Kubernetes Ingress does not work with traefiskKubernetes Ingress 不适用于 traefisk
【发布时间】:2019-11-13 16:01:23
【问题描述】:

我在 Google Cloud Platform 中创建了一个 kubernetes 集群,之后,我在集群上安装了 Helm/tiller,之后,我按照官方文档所说的那样安装了带有 helm 的 traefik。

现在我正在尝试为服务创建 Ingress,但如果我添加注释 kubernetes.io/ingress.class: traefik,则不会创建 Ingress 的负载均衡器。 但如果没有注释,它可以与默认 Ingress 一起使用。 (服务类型为nodeport)

编辑:我还在一个干净的谷歌云 kubernetes 集群中尝试了这个示例:https://supergiant.io/blog/using-traefik-as-ingress-controller-for-your-kubernetes-cluster/ 但它相同,当我选择 kubernetes.io/ingress.class: traefik 时,不会为入口创建负载均衡器。

我的文件是: animals-svc.yaml:

---
apiVersion: v1
kind: Service
metadata:
  name: bear
spec:
  type: NodePort
  ports:
  - name: http
    targetPort: 80
    port: 80
  selector:
    app: animals
    task: bear
---
apiVersion: v1
kind: Service
metadata:
  name: moose
spec:
  type: NodePort
  ports:
  - name: http
    targetPort: 80
    port: 80
  selector:
    app: animals
    task: moose
---
apiVersion: v1
kind: Service
metadata:
  name: hare
  annotations:
    traefik.backend.circuitbreaker: "NetworkErrorRatio() > 0.5"
spec:
  type: NodePort
  ports:
  - name: http
    targetPort: 80
    port: 80
  selector:
    app: animals
    task: hare

animals-ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: animals
  annotations:
    kubernetes.io/ingress.class: traefik
    # kubernetes.io/ingress.global-static-ip-name: "my-reserved-global-ip"
    # traefik.ingress.kubernetes.io/frontend-entry-points: http
    # traefik.ingress.kubernetes.io/redirect-entry-point: http
    # traefik.ingress.kubernetes.io/redirect-permanent: "true"
spec:
  rules:
  - host: hare.minikube
    http:
      paths:
      - path: /
        backend:
          serviceName: hare
          servicePort: http
  - host: bear.minikube
    http:
      paths:
      - path: /
        backend:
          serviceName: bear
          servicePort: http
  - host: moose.minikube
    http:
      paths:
      - path: /
        backend:
          serviceName: moose
          servicePort: http

animals-deployment.yaml:

---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: bear
  labels:
    app: animals
    animal: bear
spec:
  replicas: 2
  selector:
    matchLabels:
      app: animals
      task: bear
  template:
    metadata:
      labels:
        app: animals
        task: bear
        version: v0.0.1
    spec:
      containers:
      - name: bear
        image: supergiantkir/animals:bear
        ports:
        - containerPort: 80
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: moose
  labels:
    app: animals
    animal: moose
spec:
  replicas: 2
  selector:
    matchLabels:
      app: animals
      task: moose
  template:
    metadata:
      labels:
        app: animals
        task: moose
        version: v0.0.1
    spec:
      containers:
      - name: moose
        image: supergiantkir/animals:moose
        ports:
        - containerPort: 80
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: hare
  labels:
    app: animals
    animal: hare
spec:
  replicas: 2
  selector:
    matchLabels:
      app: animals
      task: hare
  template:
    metadata:
      labels:
        app: animals
        task: hare
        version: v0.0.1
    spec:
      containers:
      - name: hare
        image: supergiantkir/animals:hare
        ports:
        - containerPort: 80

服务已创建,但入口负载均衡器未创建:

但是,如果我删除 kubernetes.io/ingress.class: traefik 行,它将与 Kubernetes 的默认入口一起使用

【问题讨论】:

  • 为什么你认为 kubernetes.io/ingress.class: traefik 应该为你创建负载均衡器?这是 kubernetes.io/ingress.class: gce 为你创建了 loadballancer,但不是 traefik
  • 哇!真的吗?我读到“当您创建一个 Ingress 对象时,GKE 入口控制器会创建一个 Google Cloud Platform HTTP(S) 负载平衡器,并根据 Ingress 及其相关服务中的信息对其进行配置。”这里:cloud.google.com/kubernetes-engine/docs/concepts/ingress 然后我虽然使用 traefik 我还需要编写 Ingress,并且会自动创建负载均衡器......然后,使用 traefik,我应该将服务从 NodePort 更改为 LoadBalancer 吗?还是应该在创建负载均衡器之后使用 NodePort 创建服务?

标签: kubernetes kubernetes-ingress


【解决方案1】:

您可以尝试添加更多注释,如下所示

traefik.ingress.kubernetes.io/frontend-entry-points: http,https
traefik.ingress.kubernetes.io/redirect-entry-point: https
traefik.ingress.kubernetes.io/redirect-permanent: "true"

这样,

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-dashboard-ingress
  namespace: traefik
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/frontend-entry-points: http,https
    traefik.ingress.kubernetes.io/redirect-entry-point: https
    traefik.ingress.kubernetes.io/redirect-permanent: "true"
spec:
  rules:
  - host: traefik-ui.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-dashboard
          servicePort: 8080

【讨论】:

  • 这对我不起作用。你能在你的谷歌云 kubernetes 中运行这个例子吗? supergiant.io/blog/…我正在尝试但没有成功。从未创建入口的负载均衡器
  • 服务文件中的“NodePort”在哪里输入?
  • 哦,我看到创建了两个服务“NodePort”。如果您想使用 LoadBalancer,您可以更改类型:LoadBalancer 而不是 NodePort。
  • 参考这个网址了解LoadBalancer codeburst.io/…,而这个了解NodePort + Ingress:codeburst.io/…
  • 是的,我解决了,使用 traefik 您不会为每个入口创建负载均衡器,但是使用默认的 gce 入口控制器,每个入口都有不同的负载均衡器,我不太了解其中的区别吃了开头。现在我只有一个用于 traefik“代理”的 LoadBalancer,所有其他服务都通过那里。
【解决方案2】:

Traefik 默认不会为您创建负载均衡器。

正如HTTP(s) load balancing with Ingress 文档中提到的那样:

当您创建 Ingress 对象时,GKE 入口控制器会创建 一个 Google Cloud Platform HTTP(S) 负载平衡器并对其进行配置 根据 Ingress 中的信息及其相关 服务。

这一切都适用于 GKE 入口控制器 (gce) - 您可以在此处找到有关 gce 的更多信息:https://github.com/kubernetes/ingress-gce

如果您想使用 Traefik 作为入口 - 您必须使用 type: LoadBalancer 公开 Traefik 服务

例子:

apiVersion: v1
kind: Service
metadata:
  name: traefik
spec:
  type: LoadBalancer
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - port: 80
    targetPort: 80

您可以在Exposing Kubernetes Services to the internet using Traefik Ingress Controller 文章中找到包含大量解释图和实际工作示例的更多信息。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-02
    • 2021-08-07
    • 2020-02-25
    • 1970-01-01
    • 2019-01-16
    • 2020-06-11
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多