kubernetes - 从 pod 连接到其他 pod

标签 kubernetes kubernetes-pod

基本上,我有一个部署,它创建了 3 个自动扩展的容器:PHP-FPM、NGINX 和包含应用程序的容器,所有这些都设置了 secret 、服务和入口。该应用程序还在 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服务时,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?

这里有三种可能的状态:

  • 从与 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 之间正常工作。您还可以尝试使用 nc -zv redis-service 6379 来查看 redis 端口是否确实打开。如果您的 kube-dns 工作正常,您应该会看到端口已打开。

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

  • 从 kubernetes 集群外部连接到 Redis pod。在这种情况下,您将需要某种类似机制的入口或nodePort来向外界公开redis服务。有关更多信息,您可以阅读 the official documentation .

关于kubernetes - 从 pod 连接到其他 pod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52274134/

相关文章:

kubernetes - 如何在 Kubernetes 的容器中设置环境变量?

amazon-web-services - AWS Ingress Controller 设置

docker - 如何通过docker镜像在kubernetes容器中安装kubectl

kubernetes - 具有新 etcd 卷的新 master 不会加入集群

kubernetes - Istio 无法将请求路由到具有不同目标端口的工作负载

django-celery - Celery 任务在本地运行时在正常关闭时重新排队进入代理,但尽管配置相同但在 kubernetes 中丢失

kubernetes - 在Azure Kubernetes Service(AKS)中使用Dask Kubernetes处理大数据

amazon-web-services - 使用 AWS 和 Kubernetes 提供商的 Terraform 周期

docker - kubernetes pod 中的容器是否属于同一 cgroup?

javascript - 如何在 Pod 之间复制文件或在 Pod 中执行?