kubernetes - 如何在 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```
解决方案
默认情况下,该服务应以循环方式使用后端 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