Kubernetes中的公开服务和副本集关系

Kubernetes中的公开服务和副本集关系,kubernetes,kubectl,minikube,kubernetes-ingress,kubernetes-pod,Kubernetes,Kubectl,Minikube,Kubernetes Ingress,Kubernetes Pod,我有一个问题,当有多个豆荚的复制品时,库伯内特斯如何决定服务豆荚 例如,假设有一个web应用程序作为多个pod副本在k8s集群上运行,它们由服务公开 当客户机发送请求时,它将转到服务和kube代理。但是kubernetes在何时何地决定哪个pod应该为请求服务 我想知道kubernetes在这件事上的内部情况。我们能控制吗?我们是否可以根据客户请求和自定义条件来决定应该提供哪个pod 我们是否可以根据客户请求和自定义条件来决定应该提供哪个pod 由于kube代理在L4负载平衡设备上工作,因此您可

我有一个问题,当有多个豆荚的复制品时,库伯内特斯如何决定服务豆荚

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

当客户机发送请求时,它将转到服务和kube代理。但是kubernetes在何时何地决定哪个pod应该为请求服务

我想知道kubernetes在这件事上的内部情况。我们能控制吗?我们是否可以根据客户请求和自定义条件来决定应该提供哪个pod

我们是否可以根据客户请求和自定义条件来决定应该提供哪个pod

由于kube代理在L4负载平衡设备上工作,因此您可以基于客户端IP控制会话。它不读取客户端请求的标头

您可以使用服务obejct中的service.spec.sessionAffinityConfig字段控制会话

下面的命令提供了解释
kubectl解释服务.spec.sessionAffinityConfig

下面的段落和链接提供了详细的答案

可以通过将service.spec.sessionAffinity设置为“ClientIP”(默认值为“None”)来选择基于客户端IP的会话关联性,如果已经将service.spec.sessionAffinityConfig.ClientIP.timeoutSeconds设置为“ClientIP”,则可以通过设置字段service.spec.sessionAffinity来设置最大会话粘性时间(默认值为“10800”)

服务对象应该是这样的

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


Kubernetes服务创建一个负载平衡器(以及它的端点),默认情况下将使用循环机制在POD之间分发请求

你可以改变这种行为。
正如Suresh所说,您还可以使用sessionAffinity来确保对特定会话值的请求总是发送到同一个pod。

谢谢Suresh!另外,当没有服务运行时,我创建了两个独立的pod运行同一个应用程序。有什么类似于AffinityConfig的吗?服务对象为pod提供稳定性,一个s podIP可以在其生命周期中更改,因为它是一个不可变的对象。两个独立的Pod不是彼此的副本。此外,您需要有一个服务对象才能在内部或外部公开它。当然,服务更灵活、更方便。但是我们可以在Pod级别进行上述设置吗?我没有发现任何与会话a相关的内容在podspec中,您还可以使用以下命令进行验证
kubectl explain pod.spec--recursive|grep-i affinity