Kubernetes 从一个pod连接到另一个pod

Kubernetes 从一个pod连接到另一个pod,kubernetes,kubernetes-pod,Kubernetes,Kubernetes Pod,基本上,我有一个部署,它创建了3个自动伸缩的容器:PHP-FPM、NGINX和包含应用程序的容器,所有这些都设置了机密、服务和入口。该应用程序还可以在PHP-FPM和NGINX之间共享该项目,因此一切都已就绪 因为我想用K8s进行更多的探索,所以我决定用Redis创建一个pod,它还可以挂载一个持久磁盘(但这并不重要)。我还为redis创建了一个服务,如果我使用SSH连接到redis容器并运行redis cli,所有这些都可以正常工作 有趣的是,该项目无法连接到Redis所在的pod。我知道PO

基本上,我有一个部署,它创建了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吊舱由一个部署配置文件提供动力(我不一定要扩展它,但我会期待它):

此外,当我点击kubectl get服务时,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
名称类型群集IP外部IP端口
kubernetes ClusterIP 10.96.0.1 443/TCP 21h
nginx服务节点端口10.100.111.16 80:30312/TCP 21h
redis服务群集IP 10.99.80.141 6379/TCP 6s
如何将我的项目连接到另一个独立扩展的pod中运行的redis服务器

这里有三种可能的状态:

  • 要从中的连接到Redis pod,请在与Redis pod运行相同的命名空间中运行任何其他pod。在这种情况下,您将使用服务名称
    redis service
    ,并指定服务端口
    6379
    ,以通过其当前集群到达它(kube dns正在那里为您进行dns解析)。我猜你是在要求这个场景

  • 这里只是一个从另一个pod中访问一个pod的示例(在您的案例中)。首次运行:

         kubectl run -it --rm test --image=busybox --restart=Never -- sh
    
    这将运行新的测试吊舱,并在该吊舱内为您提供
    sh
    。现在,如果您在那里(测试吊舱内)键入
    nslookup redis service
    ,您将检查DNS在吊舱之间是否正常工作。您还可以尝试使用
    nc-zv redis service 6379
    查看redis端口是否实际打开。如果kube dns工作正常,您应该看到端口已打开

  • 要从中的连接到Redis pod,请选择运行在同一kubernetes集群中但位于不同命名空间中的任何其他pod。在本例中,您将使用由服务名称和命名空间名称组成的FQDN,如中所示

  • 从kubernetes集群外部连接到Redis吊舱。在这种情况下,您将需要某种类似机制的入口或节点报告,以便向外界公开redis服务。更多关于这一点,你可以阅读


实际上,使用服务名称作为主机名是有效的。我不知道Kubernetes的DNS也能做到这一点。我以前在Docker Composer中使用过它,在我的容器化应用程序中,我使用它连接到服务(即:MySQL、Redis、Elasticsearch)

为了澄清这一点,在我的应用程序中,我将主机名设置为服务名称,比如
redis service
。如果我想连接到Postgres,我可以使用
pgsql服务
或该服务的任何名称

谢谢大家!

如果您正在使用,请查看他们的

我很难与另一个pod进行通信,另一件事情也没有像预期的那样工作,就是使用服务名称与服务进行通信(DNS查找似乎无法将服务名称转换为IP)

在任何情况下,都有一些相关的步骤,我需要执行,然后一切突然开始工作

还要确保您实际安装了MicroK8s DNS服务:

microk8s.enable dns
有关最新信息,请参阅,但以下是截至今天的步骤:


您现在如何连接到Redis?Redis没有外部IP,因此我无法从外部连接。集群IP是动态分配的,因此这没有用。我现在无法连接,这就是我想做的/要从集群外部连接,您可以将服务类型更改为LoadBalancer或NodePort,或者为服务添加入口。或者使用“kubectl代理”并通过API访问对不起,您能展示一些示例代码吗?你的意思是在我的应用程序中我会写:或者?还是我完全迷路了?谢谢你的回答。我有同样的问题,我可以看到我的redis服务时做的nslookup。然而,然后我尝试使用主机参数“redisservice”从Nodejs连接到Redis,但它不起作用。你知道那是什么吗?再次提前感谢您。
microk8s.enable dns