16

基本上,我有一个部署,它创建了 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
4

3 回答 3

16

如何将我的项目连接到在其他 pod 中运行且独立扩展的 redis 服务器?

这里有三种可能的状态:

  • 从运行 Redis pod的同一命名空间中运行的任何其他 pod连接到 Redis pod 。在这种情况下,您将使用服务名称并指定服务端口以通过其当前的 ClusterIP 访问它(kube-dns 正在为您进行 DNS 解析)。我猜你在问这个场景。redis-service6379

  • 这只是从另一个 pod 中访问一个 pod 的示例(在您的情况下)。第一次运行:

         kubectl run -it --rm test --image=busybox --restart=Never -- sh
    

    这将运行新的测试吊舱并sh在该吊舱内为您提供。现在,如果您nslookup redis-service在此处键入(在测试 pod 中),您将检查 DNS 在 pod 之间是否正常工作。你也可以试试看redis端口是否真的用nc -zv redis-service 6379. 如果您的 kube-dns 工作正常,您应该会看到端口已打开。

  • 从运行在同一 kubernetes 集群中但在不同命名空间中任何其他 pod连接到 Redis pod 。在这种情况下,您将使用由服务名称和命名空间名称组成的 FQDN,就像文档中给出的那样。

  • 从kubernetes 集群外部连接到 Redis pod。在这种情况下,您将需要某种类似机制的 ingress 或 nodePort 来将 redis 服务暴露给外界。有关这方面的更多信息,您可以在官方文档中阅读。

于 2018-09-11T11:51:15.990 回答
5

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

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

谢谢你!

于 2018-09-11T12:39:36.560 回答
0

如果您使用的是MicroK8s,请参阅他们的文档

我努力与另一个 pod 进行通信,而另一件事也没有按预期工作,那就是使用服务名称与服务进行通信(DNS 查找似乎无法将服务名称转换为 IP)。

无论如何,我需要执行MicroK8s 文档中的一些相关步骤,然后一切突然开始工作。

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

microk8s.enable dns

请参阅MicroK8s 文档以获取最新信息,但以下是截至今天的步骤:

在此处输入图像描述

于 2019-09-03T06:08:19.023 回答