【问题标题】:traefik setup on gke not workinggke上的traefik设置不起作用
【发布时间】:2018-12-23 11:27:43
【问题描述】:

我正在尝试按照用户指南 (https://docs.traefik.io/user-guide/kubernetes/) 在 GKE 中运行 traefik

我没有看到仪表板,而是收到了404。我猜某处的 RBAC 设置存在问题,但我无法弄清楚。

任何帮助将不胜感激。

入口控制器日志显示一个恒定的流量(每秒一个):

E0714 12:19:56.665790 1 反射器.go:205] github.com/containous/traefik/vendor/k8s.io/client-go/informers/factory.go:86: 无法列出 *v1.Service:服务被禁止:用户 “system:serviceaccount:kube-system:traefik-ingress-controller”不能 列出集群范围内的服务:未知用户 "system:serviceaccount:kube-system:traefik-ingress-controller"

而且 traefik pod 本身不断地喷涌而出:

E0714 12:17:45.108356 1 反射器.go:205] github.com/containous/traefik/vendor/k8s.io/client-go/informers/factory.go:86: 无法列出 *v1beta1.Ingress: ingresses.extensions 被禁止: 用户“system:serviceaccount:default:default”无法列出 命名空间“kube-system”中的 ingresses.extensions:未知用户 “系统:服务帐户:默认:默认”

E0714 12:17:45.708160 1 反射器.go:205] github.com/containous/traefik/vendor/k8s.io/client-go/informers/factory.go:86: 无法列出 *v1.Service:服务被禁止:用户 “system:serviceaccount:default:default”无法在 命名空间“默认”:未知用户 “系统:服务帐户:默认:默认”

E0714 12:17:45.714057 1 反射器.go:205] github.com/containous/traefik/vendor/k8s.io/client-go/informers/factory.go:86: 无法列出 *v1.Endpoints:端点被禁止:用户 “system:serviceaccount:default:default”无法在 命名空间“kube-system”:未知用户 “系统:服务帐户:默认:默认”

E0714 12:17:45.714829 1 反射器.go:205] github.com/containous/traefik/vendor/k8s.io/client-go/informers/factory.go:86: 无法列出 *v1beta1.Ingress: ingresses.extensions 被禁止: 用户“system:serviceaccount:default:default”无法列出 命名空间“默认”中的 ingresses.extensions:未知用户 “系统:服务帐户:默认:默认”

E0714 12:17:45.715653 1 反射器.go:205] github.com/containous/traefik/vendor/k8s.io/client-go/informers/factory.go:86: 无法列出 *v1.Endpoints:端点被禁止:用户 “system:serviceaccount:default:default”无法在 命名空间“默认”:未知用户 “系统:服务帐户:默认:默认”

E0714 12:17:45.716659 1 反射器.go:205] github.com/containous/traefik/vendor/k8s.io/client-go/informers/factory.go:86: 无法列出 *v1.Service:服务被禁止:用户 “system:serviceaccount:default:default”无法在 命名空间“kube-system”:未知用户 “系统:服务帐户:默认:默认”

我使用以下方法创建了集群角色:

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups: [""]
    resources: ["servies", "endpoints", "secrets"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["extensions"]
    resources: ["ingresses"]
    verbs: ["get", "list", "watch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
  name: traefik-ingress-controller
  namespace: kube-system

然后将traefik部署为部署:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik
        name: traefik-ingress-lb
        ports:
        - name: http
          containerPort: 80
        - name: admin
          containerPort: 8080
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin
  type: LoadBalancer

使用 helm 安装 traefik 时,我使用了以下值文件:

dashboard:
  enabled: true
  domain: traefik.example.com
kubernetes:
  namespaces:
    - default
    - kube-system

最后,对于 UI,我使用了以下 yaml:

---
apiVersion: v1
kind: Service
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - name: web
    port: 80
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  rules:
  - host: traefik.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-web-ui
          servicePort: web

感谢收看!

(编辑:更正标题中的错字)

【问题讨论】:

    标签: kubernetes traefik kubernetes-ingress google-kubernetes-engine


    【解决方案1】:

    由于命名空间“kube-system”由主节点处理,您将无法在该特定命名空间上部署任何内容。 GKE 中的主节点是托管服务,目前用户无法访问。

    如果您想拥有此功能,那么我目前可以提供的唯一建议是创建您自己的custom cluster from scratch。这将允许您访问主节点,并且您可以选择根据自己的喜好自定义集群。

    编辑:我能够从 github 找到关于如何使用 Traefik 作为 GKE 负载均衡器的说明。我建议先测试一下,然后再在生产集群中运行它。

    【讨论】:

    • 感谢您的反馈!这是否意味着 traefik 根本无法在 gke 中工作?我对构建自己的集群完全没有兴趣,曾经为了教育目的做过一次,但这不是我想作为生产基础设施运行的任何东西。
    • 感谢您找到那个小宝石 - 我会试试看的。
    【解决方案2】:

    我认为您的问题是您正在设置名称为“traefik-ingress-controller”和命名空间“kube-system”的 ClusterRoleBinding,但 Traefik 是在命名空间默认值和 serviceaccount 默认值中运行。

    尝试将 ClusterRoleBinding 更改为:

    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: traefik-ingress-controller
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: traefik-ingress-controller
    subjects:
    - kind: ServiceAccount
      name: default
     namespace: default
    

    或者使用服务帐户“traefik-ingress-controller”和命名空间“kube-system”部署您的系统

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2019-06-09
      • 2015-09-08
      • 2018-08-09
      相关资源
      最近更新 更多