我手头有以下情况,我希望在Pod之间获得尽可能低的延迟(我不希望将所有容器都部署到同一Pod)。因此,以下情况是我想要实现的目标:
假设您有一个带有4个节点的Kubernetes集群: -在每个节点上,都有一个不属于kubernetes的中央数据库的sqlproxy -在每个节点上,您有4个Pod通过该sqlproxy调用数据库
据我在创建服务时所学,服务在服务中的各个Pod之间“随机”分配流量。意味着节点1的pod可以在节点4上调用sqlproxy,节点2的pod可以在节点3上调用sqlproxy,依此类推。
我希望在节点1上尽可能通过sqlproxy实现对节点1上的pod的调用,因此它具有最小的延迟。
这是否有可能,或者节点之间的延迟如此之小以至于可以忽略不计?
答案 0 :(得分:1)
将SQL代理作为辅助工具部署到您的应用(一个容器中有两个容器,一个是应用,一个是代理)。
您的部署将如下所示:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
namespace: ...
name: my-app
labels:
app: my-app
spec:
replicas: 3
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: << app image >>
ports:
- containerPort: 8080
- name: sql-proxy
image: << SQL proxy image >>
ports:
- containerPort: 3306
现在,使应用程序连接到localhost:3306
,以连接到在同一容器中运行的SQL代理。这样,您可以避免潜在的昂贵的跨节点跃点,并保持本地连接。
答案 1 :(得分:0)
@Oliver提出的解决方案-将sqlproxy作为sidecar容器与应用程序放在同一吊舱中运行-可能会为您带来最低的延迟。
如果由于某种原因您仍然想在每个节点上运行一个sqlproxy实例(例如,利用数据库连接池和重用),则应用程序将需要在运行时动态发现该节点上的IP地址。它正在运行,并使用它连接到同一节点上的sqlproxy实例。
以下是一种动态发现主机节点IP地址并将其设置为环境变量的方法(另请参见Kubernetes文档中的The Downward API):
...
spec:
containers:
- name: app-container-name
image: <app-image>
env:
- name: POD_HOST_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
然后使用$(POD_HOST_IP)
,我们可以在同一部署配置中的其他位置引用环境变量。