从Pod连接到其他Pod

Ale*_*oki 6 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
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

另外,当我点击时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
Run Code Online (Sandbox Code Playgroud)

小智 7

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

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

谢谢你!


Con*_*nst 6

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

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

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

    • 这只是从另一个Pod(以您的情况为例)中访问一个Pod的示例。首轮:

      kubectl run -it --rm test --image=busybox --restart=Never -- sh
      
      Run Code Online (Sandbox Code Playgroud)

      这将运行新的测试容器,并sh在该容器内进行测试。现在,如果您nslookup redis-service在此处输入(在测试容器内),您将检查DNS在各个容器之间是否正常工作。您也可以尝试查看redis端口是否真的通过打开nc -zv redis-service 6379。如果您的kube-dns工作正常,您应该看到该端口已打开。

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

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