我有一个问题,当有多个Pod副本时,kubernetes如何决定服务Pod。
对于实例,假设我有一个在k8s集群上运行的Web应用程序,它是多个Pod副本,它们由服务公开。
当客户端发送请求时,它将转到服务和kube-proxy。但是kubernetes会在何时何地决定应由哪个Pod服务该请求?
我想知道这个问题的kubernetes内部。我们可以控制吗?我们可以根据客户的要求和自定义条件决定应使用哪个吊舱?
答案 0 :(得分:2)
我们可以根据客户请求和自定义条件决定应使用哪个吊舱?
由于kube-proxy在 L4 负载均衡设备上工作,因此您可以基于客户端IP 控制会话。它不读取客户端请求的标头。
您可以使用服务对象
中的以下字段 service.spec.sessionAffinityConfig 控制会话。以下命令提供说明
kubectl explain service.spec.sessionAffinityConfig
以下段落和链接提供了详细的答案。
可以通过将service.spec.sessionAffinity设置为“ ClientIP”(默认值为“ None”)来选择基于客户端IP的会话亲和性,并且可以通过设置字段service.spec.sessionAffinityConfig来设置最大会话粘性时间。 .clientIP.timeout秒,如果您已经将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
答案 1 :(得分:1)
Kubernetes服务会创建一个负载平衡器(及其终结点),并且默认情况下将使用轮询来在pod之间分配请求。
您可以更改此行为。 正如Suresh所说,您还可以使用sessionAffinity确保对特定会话值的请求始终发送到同一吊舱。