从Pod连接到其他Pod

时间:2018-09-11 10:43:57

标签: kubernetes kubernetes-pod

基本上,我有一个Deployment,它会创建3个可自动缩放的容器:PHP-FPM,NGINX和包含应用程序的容器,所有这些容器都设置有机密,服务和入口。该应用程序还在PHP-FPM和NGINX之间共享该项目,因此已全部完成。

由于我想使用K8s进行更多探索,因此我决定使用Redis创建一个Pod,该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

3 个答案:

答案 0 :(得分:3)

  

我如何将我的项目连接到在其他Pod中运行,可独立扩展的Redis服务器?

您在这里有三种可能的状态:

  • 要从内部与运行Redis Pod的同一名称空间中运行的其他Pod从连接到Redis Pod。在这种情况下,您将使用服务名称redis-service并指定服务端口6379以通过当前的ClusterIP到达该端口(kube-dns正在那里为您进行DNS解析)。我猜您是在要求这种情况。

    • 这里仅是从另一个容器中访问一个容器的示例(在您的情况下)。首次运行:

      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集群中运行,但在不同命名空间中。在这种情况下,您将使用由服务名称和名称空间名称组成的FQDN,就像在the documentation中给出的一样。

  • 要从kubernetes集群的外部连接到Redis Pod。在这种情况下,您将需要一些入口之王或类似机制的nodePort才能将redis服务公开给外界。有关更多信息,请参见the official documentation

答案 1 :(得分:1)

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

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

谢谢!

答案 2 :(得分:0)

如果您使用的是MicroK8s,请查看他们的documentation

我很难与另一个Pod通信,而另一个也不如预期的那样是通过使用服务名称与服务进行通信(DNS查找似乎无法将服务名称转换为IP )。

无论如何,我需要执行MicroK8s documentation内的一些相关步骤,然后所有内容突然开始工作。

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

microk8s.enable dns

请参考MicroK8s documentation,以了解最新信息,但以下是截至今天的步骤:

enter image description here