在Kubernetes中并置豆荚

  • 我有一个Kubernetes集群,它分布在2个区域(zone1和zone2)中。

  • 我有2个应用程序-一个Web应用程序和一个数据库。 Web应用程序的配置存储在数据库中。该应用程序以及数据库都被部署为有状态应用程序。

  • 这个想法是为Web应用程序(application-0和application-1)部署2个副本集,为数据库(database-0和database-1)部署2个副本集。 application-0指向数据库-0,application-1指向数据库1。

  • pod防关联功能已启用。因此,应用程序0和应用程序1最好不在同一区域。另外,database-0和database-1将不在同一区域。

  • 我想确保application-0和database-0在同一区域中。而application-1和database-1在另一个区域中。这样就不会影响Web应用程序的性能。有可能吗?

h286700143game 回答:在Kubernetes中并置豆荚

如果您希望将两个区域上的工作负载严格分开-我建议在节点的区域上使用nodeSelector

使用Pod关联性可能会得到类似的结果,但结果更为复杂,而且要获得您所描述的明确划分。您需要使用requiredDuringScheduling /执行规则,除非您确实需要,否则通常最好避免使用它们。

,

就像您使用反亲和性规则来避免在同一区域中设置两个应用程序一样,您可以使用亲和性仅在db-0存在的区域中设置app-0,从技术上讲,这意味着您可以删除反亲和性完全从应用程序访问,就像您告诉它只计划在db区域中进行调度一样,并且db被定义为以反亲和性传播区域,您将从数据库部分继承分发。

,

PodAntiAffinity传播到区域

针对您的数据库

metadata:
  labels:
    app: db
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - db
        topologyKey: "kubernetes.io/hostname"

对于您的网络应用

metadata:
  labels:
    app: web-app
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - web-app
        topologyKey: "kubernetes.io/hostname"

PodAffinity将Pod放置在节点上

此外,您将podAffinity添加到Web应用程序(而不是数据库)中,以使其与数据库一起位于节点上。

为您的网络应用添加了podAffinity

metadata:
  labels:
    app: web-app
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - web-app
        topologyKey: "kubernetes.io/hostname"
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - db
        topologyKey: "kubernetes.io/hostname"

结果

同时使用PodAntiAffinityPodAffinity,您将获得与db-X并置的web-app-X。

web-app-1     web-app-2
db-1          db-2

请参阅Kubernetes文档,其中有一个co-locate cache with app on nodes关于PodAffinity和´PodAntiAffinity`的示例。

StatefulSet的稳定网络身份

要寻址StatefulSet的one specific instance,请为每个数据库副本创建一个ClusterIP: None的{​​{3}}。这样,您的网络应用就可以连接到特定实例。

访问最近的数据库实例

现在,您的Web应用程序可以通过无头服务连接到db-0和db-1。首先让您的网络应用程序同时连接到这两个应用程序,然后使用响应时间最短的应用程序-该应用程序很可能是同一节点上的应用程序。

本文链接:https://www.f2er.com/3046055.html

大家都在问