从 pod 连接到其他 pod
Posted
技术标签:
【中文标题】从 pod 连接到其他 pod【英文标题】:Connect to other pod from a pod 【发布时间】:2019-02-15 20:28:11 【问题描述】:基本上,我有一个部署,它创建了 3 个自动扩展的容器:php-FPM、nginx 和包含应用程序的容器,所有这些都设置了秘密、服务和入口。该应用程序还在 PHP-FPM 和 NGINX 之间共享项目,所以一切都设置好了。
因为我想用 K8s 探索更多,我决定用 Redis 创建一个 Pod,它还挂载一个永久磁盘(但这并不重要)。我还为 redis 创建了一个服务,如果我通过 SSH 连接到 Redis 容器并运行 redis-cli
,一切都可以正常工作。
有趣的是项目无法连接到 Redis 所在的 Pod。我知道 Pod 之间的容器共享同一个“本地”网络,可以使用 localhost
访问它们。
如何将我的项目连接到在其他 pod 中运行且独立扩展的 redis 服务器? Redis 服务出了什么问题?
我的 Redis 服务是这样的:
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
我的 Redis pod 由部署配置文件提供支持(我不一定要对其进行扩展,但我会期待它):
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
strategy:
type: Recreate
template:
metadata:
labels:
app: redis
spec:
volumes:
- name: redis-persistent-volume
persistentVolumeClaim:
claimName: redis-pvc
containers:
- image: redis:4.0.11
command: ['redis-server']
name: redis
imagePullPolicy: Always
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
ports:
- containerPort: 6379
name: redis
volumeMounts:
- name: redis-persistent-volume
mountPath: /data
另外,当我点击kubectl get service
时,Redis 服务器有一个集群 IP:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
nginx-service NodePort 10.100.111.16 <none> 80:30312/TCP 21h
redis-service ClusterIP 10.99.80.141 <none> 6379/TCP 6s
【问题讨论】:
您现在如何尝试连接到 Redis? Redis没有外部IP,所以无法从外部连接。集群 IP 是动态分配的,所以这没什么用。从现在开始我无法连接,这就是我想要做的。 :// 要从集群外部连接,您可以将服务类型更改为 LoadBalancer 或 NodePort 或为服务添加入口。 medium.com/google-cloud/… 或者使用'kubectl proxy',通过API访问kubernetes.io/docs/tasks/administer-cluster/… 【参考方案1】:如何将我的项目连接到在其他 pod 中运行且独立扩展的 redis 服务器?
这里有三种可能的状态:
从 within 与 Redis pod 运行时在同一命名空间 中运行的任何其他 pod 连接到 Redis pod。在这种情况下,您将使用服务名称 redis-service
并指定服务端口 6379
以通过其当前的 ClusterIP 访问它(kube-dns 正在为您进行 DNS 解析)。我猜你是在问这个场景。
这只是从另一个 pod 中访问一个 pod 的示例(在您的情况下)。第一次运行:
kubectl run -it --rm test --image=busybox --restart=Never -- sh
这将运行新的测试 pod 并在该 pod 中为您提供sh
。现在,如果您在此处(在测试 pod 中)键入 nslookup redis-service
,您将检查 DNS 在 pod 之间是否正常工作。你也可以试试看redis端口是否真的用nc -zv redis-service 6379
打开了。如果您的 kube-dns 工作正常,您应该会看到端口已打开。
从在在同一 kubernetes 集群中但在不同命名空间中运行的任何其他 pod 连接到 Redis pod。在这种情况下,您将使用由服务名称和命名空间名称组成的 FQDN,就像在 the documentation 中给出的那样。
从 kubernetes 集群的外部连接到 Redis pod。在这种情况下,您将需要某种类似机制的 ingress 或 nodePort 来将 redis 服务暴露给外界。更多关于这方面的内容你可以在the official documentation阅读。
【讨论】:
感谢您的回复。我遇到了同样的问题,在执行 nslookup 时可以看到我的 redis 服务。但是,然后我尝试使用作为主机参数“redis-service”从 Nodejs 连接到 Redis,但它不起作用。你知道那可能是什么吗?再次提前感谢您。【参考方案2】:确实,使用服务名称作为主机名有效。我不知道 Kubernetes 的 DNS 也能做到这一点。我之前在 Docker Composer 中使用过它,在我的容器化应用程序中,我使用它来连接服务(即:mysql、Redis、Elasticsearch)。
为了澄清这一点,在我的应用程序中,我将主机名设置为服务名称,例如 redis-service
。如果我想连接到 Postgres,我可以使用 pgsql-service
或任何该服务的名称。
谢谢!
【讨论】:
对不起,你能展示一些示例代码吗?你的意思是在我的应用程序中我会写如下内容:redis-service 或 redis-service:6379 或 redis-service.com?还是我完全迷路了?【参考方案3】:如果您使用的是MicroK8s,请查看他们的documentation
我很难与另一个 pod 进行通信,而另一个也没有按预期工作的事情是使用服务名称与服务进行通信(DNS 查找似乎无法将服务名称转换为 IP )。
无论如何,我需要执行MicroK8s documentation 中的一些相关步骤,然后一切突然开始工作。
还要确保您实际安装了 MicroK8s DNS 服务:
microk8s.enable dns
请参阅MicroK8s documentation 获取最新信息,但以下是截至今天的步骤:
【讨论】:
以上是关于从 pod 连接到其他 pod的主要内容,如果未能解决你的问题,请参考以下文章
无法从 GKE 中的 pod 内部连接到 Postgres SQL 实例
Kubernetes - 无法从服务的 pod 连接到服务 IP