【问题标题】:Exposed Service and Replica Set Relation in KubernetesKubernetes 中暴露的服务和副本集关系
【发布时间】:2019-10-02 07:05:09
【问题描述】:

我有一个问题,当 pod 有多个副本时,kubernetes 如何决定服务 pod。

例如,假设我有一个 Web 应用程序在 k8s 集群上作为多个 pod 副本运行,并且它们由服务公开。

当客户端发送请求时,它会转到服务和 kube-proxy。但是 Kubernetes 何时何地决定哪个 pod 应该为请求提供服务?

我想知道 Kubernetes 的内部结构。我们能控制这个吗?我们能否根据客户端请求和自定义条件决定应该服务哪个 pod?

【问题讨论】:

    标签: kubernetes kubectl minikube kubernetes-ingress kubernetes-pod


    【解决方案1】:

    我们能否根据客户端请求和自定义条件来决定应该服务哪个 pod?

    由于 kube-proxy 在 L4 负载平衡方面工作,因此您可以根据 Client IP 控制会话。它不读取客户端请求的标头。

    您可以在服务对象中使用以下字段service.spec.sessionAffinityConfig控制会话

    以下命令提供解释 kubectl explain service.spec.sessionAffinityConfig

    以下段落和链接提供详细答案。

    可以通过将 service.spec.sessionAffinity 设置为“ClientIP”(默认为“None”)来选择基于 Client-IP 的会话亲和性,您可以通过设置字段 service.spec.sessionAffinityConfig 来设置最大会话粘性时间.clientIP.timeoutSeconds 如果您已经将 service.spec.sessionAffinity 设置为“ClientIP”(默认为“10800”)-service-proxies

    服务对象应该是这样的

    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
      - name: http
        protocol: TCP
        port: 80
        targetPort: 80
      sessionAffinity: ClientIP
      sessionAffinityConfig:
        clientIP:
          timeoutSeconds: 10000
    
    

    【讨论】:

    • 谢谢苏雷什!此外,当没有服务运行时,我创建了两个运行相同应用程序的独立 Pod。那里有类似 AffinityConfig 的东西吗?
    • Service 对象为 pod 提供稳定性,因为 podIP 可以在其生命周期中更改为不可变对象。两个独立的 pod 不是彼此的副本。
    • 另外,您需要有一个服务对象才能在内部或外部公开它
    • 是的,当然服务更灵活方便。但是我们可以在 Pod 级别进行上述设置吗?
    • 我在podspec中没有找到任何与session affinity相关的东西,你也可以用下面的命令kubectl explain pod.spec --recursive | grep -i affinity进行验证
    【解决方案2】:

    Kubernetes 服务会创建一个负载均衡器(及其端点),默认情况下会使用轮询在 Pod 之间分发请求。

    您可以更改此行为。 正如 Suresh 所说,您还可以使用 sessionAffinity 来确保对特定会话值的请求始终发送到同一个 pod。

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 2020-12-17
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 2023-01-25
      • 2018-11-21
      • 1970-01-01
      • 2018-07-20
      相关资源
      最近更新 更多