kubernetes pod 与本地主机端口通信
kubernetes pod talking to a localhost port
我在本地 kubernetes 集群的 pod 中有一个 celery 实例 运行,而它连接的 redis server/broker 是在我的 localhost:6379 上启动的,没有 kubernetes 。如何让我的 k8 pod 与本地部署的 redis 通信?
您可以使用 Redis 服务器所在节点的静态定义 IP 地址创建 Headless Service and an Endpoint 运行。
我创建了一个示例来说明它是如何工作的。
首先,我创建了一个 Headless Service
和一个 Endpoint
。
注意: Endpoint
有redis服务器所在节点的IP地址 运行:
# example.yml
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
clusterIP: None
ports:
- name: redis
port: 6379
protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
name: redis
namespace: default
subsets:
- addresses:
- ip: 10.156.0.58 # your node's IP address
ports:
- port: 6379
name: redis
protocol: TCP
创建上述资源后,我们可以将 redis
服务名称解析为 IP 地址:
# kubectl get svc,ep redis
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis ClusterIP None <none> 6379/TCP 28m
NAME ENDPOINTS AGE
endpoints/redis 10.156.0.58:6379 28m
# kubectl run dnsutils --image=gcr.io/kubernetes-e2e-test-images/dnsutils:1.3 -it --rm
/ # nslookup redis
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: redis.default.svc.cluster.local
Address: 10.156.0.58
另外,如果你的redis服务器只监听localhost
,你需要修改iptables
规则。要配置从端口 6379
(默认 redis 端口)到 localhost
的端口转发,您可以使用:
注意: 而不是 10.156.0.58
使用您的 redis 服务器所在节点的 IP 地址 运行.
# iptables -t nat -A PREROUTING -p tcp -d 10.156.0.58 --dport 6379 -j DNAT --to-destination 127.0.0.1:6379
如您所见,如果 Redis 不仅在 localhost
上侦听,那就更容易了,因为那时我们不必修改 iptables
规则。
最后,让我们看看是否可以从Pod连接到宿主机上的redis服务器:
# kubectl exec -it redis-client -- bash
root@redis-client:/# redis-cli -h redis
redis:6379> SET key1 "value1"
OK
我在本地 kubernetes 集群的 pod 中有一个 celery 实例 运行,而它连接的 redis server/broker 是在我的 localhost:6379 上启动的,没有 kubernetes 。如何让我的 k8 pod 与本地部署的 redis 通信?
您可以使用 Redis 服务器所在节点的静态定义 IP 地址创建 Headless Service and an Endpoint 运行。
我创建了一个示例来说明它是如何工作的。
首先,我创建了一个 Headless Service
和一个 Endpoint
。
注意: Endpoint
有redis服务器所在节点的IP地址 运行:
# example.yml
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
clusterIP: None
ports:
- name: redis
port: 6379
protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
name: redis
namespace: default
subsets:
- addresses:
- ip: 10.156.0.58 # your node's IP address
ports:
- port: 6379
name: redis
protocol: TCP
创建上述资源后,我们可以将 redis
服务名称解析为 IP 地址:
# kubectl get svc,ep redis
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis ClusterIP None <none> 6379/TCP 28m
NAME ENDPOINTS AGE
endpoints/redis 10.156.0.58:6379 28m
# kubectl run dnsutils --image=gcr.io/kubernetes-e2e-test-images/dnsutils:1.3 -it --rm
/ # nslookup redis
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: redis.default.svc.cluster.local
Address: 10.156.0.58
另外,如果你的redis服务器只监听localhost
,你需要修改iptables
规则。要配置从端口 6379
(默认 redis 端口)到 localhost
的端口转发,您可以使用:
注意: 而不是 10.156.0.58
使用您的 redis 服务器所在节点的 IP 地址 运行.
# iptables -t nat -A PREROUTING -p tcp -d 10.156.0.58 --dport 6379 -j DNAT --to-destination 127.0.0.1:6379
如您所见,如果 Redis 不仅在 localhost
上侦听,那就更容易了,因为那时我们不必修改 iptables
规则。
最后,让我们看看是否可以从Pod连接到宿主机上的redis服务器:
# kubectl exec -it redis-client -- bash
root@redis-client:/# redis-cli -h redis
redis:6379> SET key1 "value1"
OK