【问题标题】:How to contact a random pod for one service (mutli instance of the same pod) in the same node in kubernetes如何在 kubernetes 的同一节点中为一项服务(同一 pod 的多个实例)联系一个随机 pod
【发布时间】:2021-05-04 19:33:33
【问题描述】:

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

App A 想要联系 App B。

我的问题是:App A 始终与 App B 的同一个 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```

【问题讨论】:

标签: kubernetes networking devops kubernetes-ingress kubernetes-pod


【解决方案1】:

@user3683760 您必须在部署中应用负载平衡策略。 Kube 有很多选择来平衡服务之间的流量。我建议尝试几种模式,看看哪种模式最适合您的需求。

【讨论】:

    【解决方案2】:

    默认情况下,该服务应以循环方式使用后端 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
    

    【讨论】:

    • 感谢您的回答,但我已经尝试过这个,但它不是那样工作的。我在 App B 上有记录器,我在调用之间间隔 1 秒启动了 40 个请求(从 App A 到 App B)。我一直有来自 App B 的同一个 pod 的时间记录器我使用 GRPC 流但是,我创建了 40 个新 GRPC 流
    • 你在 curl 中的 url 是什么? IPbaseService ?
    • 是baseService的ClusterIP。在我的例子中,kubectl get svc -n nm-app1 将在 nm-app1 命名空间中列出所有带有 ClusterIP 的服务。
    • 我已经尝试了你的答案,它的作品。事实上,就我而言,App A 是一个控制台应用程序,它使用 AppB (python) 打开一个流 GRPC。连接保持几分钟。如果我使用 AppB 启动另一个流(新的)GRPC,它总是与 App A 联系的同一个 pod。我如何联系其他 pod?因为如果我理解的话,AppA 总是联系 AppB 的同一个 pod,因为他在这个 pod 上有一些流 GRPC 活动..
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 2020-02-10
    • 2021-12-22
    • 1970-01-01
    • 2016-11-14
    • 2019-08-02
    • 2021-08-10
    • 2018-10-16
    相关资源
    最近更新 更多