从一个 pod 连接到其他 pod
Connect to other pod from a pod
基本上,我有一个 Deployment,它创建了 3 个自动扩展的容器:PHP-FPM、NGINX 和包含应用程序的容器,所有这些都设置了秘密、服务和入口。该应用程序还在PHP-FPM和NGINX之间共享项目,所以都设置好了。
因为我想用 K8s 探索更多,我决定用 Redis 创建一个 pod,它也挂载一个永久磁盘(但这并不重要)。我还为 redis 创建了一个服务,如果我通过 SSH 进入 Redis 容器并且 运行 redis-cli
.
一切正常
有趣的是项目无法连接到 Redis 所在的 pod。我知道 pods 之间的容器共享同一个 "local" 网络,可以使用 localhost
.
访问它们
如何将我的项目连接到 运行ning 在其他 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
How do I connect my project to the redis server that is running in other pod, that scales independently?
这里有三种可能的状态:
从 在 任何其他 pod 运行ning 相同命名空间 中连接到 Redis pod因为 Redis pod 是 运行ning。在这种情况下,您将使用服务名称 redis-service
并指定服务端口 6379
以通过其当前的 ClusterIP 访问它(kube-dns 正在为您进行 DNS 解析)。我猜你问的是这个场景。
这里只是一个从另一个 pod 访问一个 pod 的例子(在你的例子中)。首先运行:
kubectl run -it --rm test --image=busybox --restart=Never -- sh
这将 运行 新的测试 pod 并在该 pod 中为您提供 sh
。现在,如果您在此处(在测试单元内)键入 nslookup redis-service
,您将检查 DNS 在 pods 之间是否正常工作。您也可以尝试查看redis 端口是否实际打开nc -zv redis-service 6379
。如果您的 kube-dns 工作正常,您应该会看到该端口已打开。
从 内 任何其他 pod 运行 连接到同一 kubernetes 集群中但 不同名称空间中的 Redis pod 。在这种情况下,您将使用由服务名称和命名空间名称组成的 FQDN,就像在 the documentation.
中给出的那样
从 kubernetes 集群的外部连接到 Redis pod。在这种情况下,您将需要某种类似机制的入口或节点端口来将 Redis 服务暴露给外界。您可以在 the official documentation.
中阅读更多相关信息
确实,使用服务名称作为主机名是可行的。我不知道 Kubernetes 的 DNS 也能做到这一点。我以前在 Docker Composer 中使用过它,在我的容器化应用程序中我用它连接到服务(即:MySQL、Redis、Elasticsearch)。
为了澄清这一点,在我的应用程序中,我将主机名设置为服务名称,例如 redis-service
。如果我想连接到 Postgres,我可以使用 pgsql-service
或该服务的任何名称。
谢谢!
如果您正在使用 MicroK8s, then see their documentation
我很难与另一个 pod 通信,另一件也没有按预期工作的事情是通过使用它们的名称与服务通信(DNS 查找似乎无法将服务名称转换为IP)。
无论如何,MicroK8s documentation 中有一些我需要执行的相关步骤,然后一切突然开始工作。
还要确保您确实安装了 MicroK8s DNS 服务:
microk8s.enable dns
最新的请参考MicroK8s documentation,但这里是今天的步骤:
基本上,我有一个 Deployment,它创建了 3 个自动扩展的容器:PHP-FPM、NGINX 和包含应用程序的容器,所有这些都设置了秘密、服务和入口。该应用程序还在PHP-FPM和NGINX之间共享项目,所以都设置好了。
因为我想用 K8s 探索更多,我决定用 Redis 创建一个 pod,它也挂载一个永久磁盘(但这并不重要)。我还为 redis 创建了一个服务,如果我通过 SSH 进入 Redis 容器并且 运行 redis-cli
.
有趣的是项目无法连接到 Redis 所在的 pod。我知道 pods 之间的容器共享同一个 "local" 网络,可以使用 localhost
.
如何将我的项目连接到 运行ning 在其他 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
How do I connect my project to the redis server that is running in other pod, that scales independently?
这里有三种可能的状态:
从 在 任何其他 pod 运行ning 相同命名空间 中连接到 Redis pod因为 Redis pod 是 运行ning。在这种情况下,您将使用服务名称
redis-service
并指定服务端口6379
以通过其当前的 ClusterIP 访问它(kube-dns 正在为您进行 DNS 解析)。我猜你问的是这个场景。这里只是一个从另一个 pod 访问一个 pod 的例子(在你的例子中)。首先运行:
kubectl run -it --rm test --image=busybox --restart=Never -- sh
这将 运行 新的测试 pod 并在该 pod 中为您提供
sh
。现在,如果您在此处(在测试单元内)键入nslookup redis-service
,您将检查 DNS 在 pods 之间是否正常工作。您也可以尝试查看redis 端口是否实际打开nc -zv redis-service 6379
。如果您的 kube-dns 工作正常,您应该会看到该端口已打开。从 内 任何其他 pod 运行 连接到同一 kubernetes 集群中但 不同名称空间中的 Redis pod 。在这种情况下,您将使用由服务名称和命名空间名称组成的 FQDN,就像在 the documentation.
中给出的那样从 kubernetes 集群的外部连接到 Redis pod。在这种情况下,您将需要某种类似机制的入口或节点端口来将 Redis 服务暴露给外界。您可以在 the official documentation.
中阅读更多相关信息
确实,使用服务名称作为主机名是可行的。我不知道 Kubernetes 的 DNS 也能做到这一点。我以前在 Docker Composer 中使用过它,在我的容器化应用程序中我用它连接到服务(即:MySQL、Redis、Elasticsearch)。
为了澄清这一点,在我的应用程序中,我将主机名设置为服务名称,例如 redis-service
。如果我想连接到 Postgres,我可以使用 pgsql-service
或该服务的任何名称。
谢谢!
如果您正在使用 MicroK8s, then see their documentation
我很难与另一个 pod 通信,另一件也没有按预期工作的事情是通过使用它们的名称与服务通信(DNS 查找似乎无法将服务名称转换为IP)。
无论如何,MicroK8s documentation 中有一些我需要执行的相关步骤,然后一切突然开始工作。
还要确保您确实安装了 MicroK8s DNS 服务:
microk8s.enable dns
最新的请参考MicroK8s documentation,但这里是今天的步骤: