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

时间:2019-05-15 07:55:21

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

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

对于实例,假设我有一个在k8s集群上运行的Web应用程序,它是多个Pod副本,它们由服务公开。

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

我想知道这个问题的kubernetes内部。我们可以控制吗?我们可以根据客户的要求和自定义条件决定应使用哪个吊舱?

2 个答案:

答案 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确保对特定会话值的请求始终发送到同一吊舱。