从pod连接到其他pod

问题描述 投票:4回答:2

基本上,我有一个部署,创建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
kubernetes kubernetes-pod
2个回答
4
投票

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

这里有三种可能的状态:

  • 从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。现在,如果您在那里键入nslookup redis-service(在测试窗格内),您将检查DNS在pod之间是否正常工作。您还可以尝试查看redis端口是否实际上是使用nc -zv redis-service 6379打开的。如果您的kube-dns工作正常,您应该看到该端口已打开。
  • 从运行在同一kubernetes集群但位于不同名称空间中的任何其他pod中连接到Redis pod。在这种情况下,您将使用由服务名称和命名空间名称组成的FQDN,如the documentation中给出的那样。
  • 从kubernetes集群外部连接到Redis pod。在这种情况下,您将需要一些入口之王或类似机制的nodePort来向外界公开redis服务。更多相关信息,请阅读the official documentation

2
投票

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

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

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.