首页 文章

Kubernetes,将前端应用程序php代码连接到后端服务器php代码

提问于
浏览
0

现在我正在尝试使用kubernetes托管简单的网站 . 我的应用程序有一个简单的php文件在前端和后端运行 . 我的前端php文件想要访问后端php文件,我正在创建一个ajax请求来做同样的事情 . 但是我无法弄清楚在我的ajax调用中需要指定什么base-url(对于kubernetes)才能访问后端 .

我目前的设置:

  • 创建了两个容器映像,一个用于前端代码,另一个用于后端 .

  • 将这些图像推送到我的gcr .

  • 开始了Kubernetes集群 . 为前端RC和服务以及后端RC和服务设置yaml文件

  • 通过运行kubectl命令,我们可以使用外部IP独立访问这两种服务 .

  • 但我们的前端无法与后端服务进行通信 .

  • 不确定我们是否需要一个DNS服务器?如果你认为我们需要它,如何设置它 .

后端服务yaml文件

apiVersion: v1
kind: Service
metadata:
  `labels:
      name: mytestapp-be
   name: mytestapp-be-service
spec:
   ports:
     - port: 80 
       targetPort: 80
       protocol: TCP
   selector:
      app: mytestapp-be        
      tier: backend

我用上面的文件创建了一个服务 . 我的前端应用程序代码有一个ajax代码段,它带有一个url,用于使用服务名称和端口名称访问后端文件 .

url: "http://mytestapp-be-service:80",

2 回答

  • 2

    通常,在一个完全配置的kubernetes集群上,你应该让dns开箱即用 . 如果您在同一名称空间中前后部署,则您的pod应该只能通过服务名称进行通信 . 您可能在这里遇到的问题是,当您在浏览器上打开页面并尝试从其发出请求时,只需指向您的后端服务,您就会尝试发出不在kubernetes集群内的请求 from the browser ,并且可以没有通过in-kubernetes网络到达其他 beans 荚 .

    如果是这种情况,您需要公开前端和后端,因此浏览器都可以访问它们(实际上有几种方法可以实现,从nodePort服务开始,通过LB服务到Ingress .

  • 1

    如果你在这里发布你的yamls,将更容易找出你的问题 . 但这里有一些一般信息:

    内部服务发现的便利性是kubernetes的优势之一 . 对于从容器内部到k8s中的另一个服务的通信,您可以使用内置的DNS或环境变量 . DNS的工作方式如下:服务名称可用,并解析为服务的集群IP . 因此,如果您的服务名称是 backendservice ,您应该能够在群集内通过该名称访问其群集IP(如果您选择了一个,则在指定的命名空间下,例如 backendservice.my-namespace ) . 服务端口应转发到作为服务一部分的pod的已定义目标端口 . 例如:

    apiVersion: v1
    kind: Service
    metadata:
      name: backendservice
    spec:
      selector:
        name: nginxphppod
      ports:
        - name: http 
          port: 80 
          targetPort: 80
    

    将您的前端指向 http://backendservice:80 即可使用该服务

    有关更多信息,请阅读thisthis .

    要解决问题,请运行 kubectl get svc 并仔细检查所有服务是否已分配了clusterIP . 如果您未在服务yaml中指定 clusterIP: None ,则应该是这种情况 .

相关问题