使用 traefik 作为 DaemonSet 还是部署?

nad*_*bmz 6 kubernetes google-kubernetes-engine traefik traefik-ingress

我应该将 traefik 1.7.x 部署为 DaemonSet 还是 GKE (Google K8S) 中的部署?

环境描述

Google 云中具有节点自动缩放器的 Kubernetes 集群,托管多个生产集群。集群最多可以扩展 90 个节点(最少 6 个节点),目前我们traefik在每个集群中部署了 10 个副本的 pod(我们使用 kustomize 在所有集群中部署相同的清单)。

europe-west1我们注意到,与具有 6 个节点的区域集群相比,具有 18 个节点(区域)的集群的响应时间较慢australia-southeast1。两个集群都有 10 个 traefik 副本。

部署规格

traefik.toml:

    [kubernetes]
    # all namespaces!
    namespaces = []
Run Code Online (Sandbox Code Playgroud)

服务.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: traefik
  name: traefik-ingress
  namespace: ingress-traefik
spec:
  externalTrafficPolicy: Local
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  selector:
    app: traefik
  sessionAffinity: None
  type: LoadBalancer
  loadBalancerIP: {{LOAD_BALANCER_IP}}
Run Code Online (Sandbox Code Playgroud)

部署.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: traefik
  name: traefik
  namespace: ingress-traefik
spec:
  replicas: 10
  selector:
    matchLabels:
      app: traefik

  template:
    metadata:
      labels:
        app: traefik
    spec:
      containers:
      - args:
        - --configfile=/config/traefik.toml
        image: traefik:1.7.9-alpine
Run Code Online (Sandbox Code Playgroud)

问题

  1. 在这种情况下(使用 GKE 节点自动缩放器)我们的集群的最佳配置是什么?使用 Deployment 或 DaemonSet 进行 traefik?
  2. 根据集群大小(节点数),traefik pod 的数量是否会影响响应时间?
  3. 当使用 DaemonSet(每个节点的 pod)或为整个集群使用多个副本的部署时,集群内部的路由(pod、服务和节点网络之间的跳跃)对于 traefik 来说是否更容易?(我们为每个 https 服务使用 K8S 命名空间,并且 traefik 有自己的命名空间)。

cod*_*diz 1

使用 Deployment 或 DaemonSet 部署 Traefik?

可以将 Traefik 与DeploymentDaemonSet对象一起使用,但这两个选项都有自己的优缺点:

  • 使用 Deployment 时,可扩展性会更好,因为使用 DaemonSet 时,您将拥有单 Pod-per-Node 模型,而使用 Deployment 时,根据您的环境,您可能需要更少的副本。

  • 当节点加入集群时,DaemonSet 会自动扩展到新节点,而 Deployment Pod 仅在需要时才调度到新节点上。

  • DaemonSets 确保任何单个节点上仅运行一个 pod 副本。如果您想确保两个 Pod 不会位于同一节点上,则部署需要关联性设置。

  • DaemonSets 可以使用 NET_BIND_SERVICE 功能运行,这将允许它绑定到每个主机上的端口 80/443/etc。这将允许绕过 kube-proxy,并减少流量跃点。请注意,这违反了 Kubernetes 最佳实践指南,并可能引发调度/扩展问题。尽管存在潜在问题,这仍然是大多数入口控制器的选择。

使用 Deployment 和 DaemonSet 之间存在一些显着差异:

  • 部署具有更轻松的向上和向下扩展的可能性。它可以实现完整的Pod生命周期,并支持从Kubernetes 1.2开始的滚动更新。至少需要一个 Pod 来运行 Deployment。

  • DaemonSet 自动扩展到满足特定选择器的所有节点,并保证一次填充一个节点。Kubernetes 1.7 也完全支持 DaemonSet 的滚动更新。

您可能想查看其他traefik 文档