首页 > 解决方案 > 如何在 kubernetes 的同一节点中为一项服务(同一 pod 的多个实例)联系一个随机 pod

问题描述

我只有一个节点。在这个节点上,我有 2 个具有多实例的应用程序(每个 3 个 pod)

App A 想要联系 App B。

我的问题是:App A 始终与 App B 的同一个 pod 联系。我想要备用 pod(例如循环中的负载平衡)例如:第一个请求:AppPod3 响应第二个请求:AppPod1 响应第三个请求:AppPod2 响应

我怎么能这样做?

非常感谢您的帮助...您可以在应用程序 B 的配置下方看到我尝试为 sessionaffinity 设置 timeoutSeconds 但它不起作用...

kind: Deployment
metadata:
  name: AppB
spec:
  selector:
    matchLabels:
      app: AppB
  replicas: 3
  template:
    metadata:
      labels:
        app: AppB
    spec:
      containers:
      - name: AppB-container
        image: image
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: AppB
  labels:
    app: svc-AppB
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: AppB
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 1```

标签: kubernetesnetworkingdevopskubernetes-ingresskubernetes-pod

解决方案


默认情况下,该服务应以循环方式使用后端 pod。如果 pod 是无状态的,则不需要 sessionAffinity 设置;否则你将被重定向到基于源 ID 的同一个 pod。

也许您可以将日志记录添加到 pod 并观察它们何时被访问。对服务的后续调用应以循环方式重定向到 pod,并使用最少的服务配置。

更新:这是我正在使用的部署。它按预期平衡吊舱;每个发送到服务 clusterip:port 的 curl 请求都在不同的 pod 上结束。我的 k8s 安装在前提下,v1.18.3。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: baseDeployment
  labels:
    app: baseApp
  namespace: nm-app1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: baseApp
  template:
    metadata:
      labels:
        app: baseApp
    spec:
      containers:
      - name: baseApp
        image: local-registry:5000/baseApp
        ports:
        - containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
  name: baseService
  namespace: nm-app1
spec:
  selector:
    app: baseApp 
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

推荐阅读