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

Exposed Service and Replica Set Relation in Kubernetes

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

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

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

为了这件事情想了解一下kubernetes的内幕。我们能控制这个吗?我们可以根据客户端请求和自定义条件来决定应该为哪个 pod 提供服务吗?

can we decide which pod should serve based on client requests and custom conditions?

由于 kube-proxy 用于 L4 负载平衡,因此您可以根据 客户端 IP[=28= 控制 session ].它不读取客户端请求的 header。

您可以通过 service obejct 中的以下字段 service.spec.sessionAffinityConfig 控制 session

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

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

Client-IP based session affinity can be selected by setting service.spec.sessionAffinity to “ClientIP” (the default is “None”), and you can set the max session sticky time by setting the field service.spec.sessionAffinityConfig.clientIP.timeoutSeconds if you have already set service.spec.sessionAffinity to “ClientIP” (the default is “10800”)-service-proxies

服务object会是这样

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 服务创建一个负载均衡器(及其端点),默认情况下将使用循环法在 pods.

之间分配请求

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