2017-04-25 48 views
0

現在我正在嘗試使用kubernetes託管簡單的網站。我的應用程序在前端和後端都有一個簡單的php文件。我的前端php文件想要訪問後端php文件,我正在創建一個ajax請求來執行相同的操作。但無法確定我需要在我的ajax調用中指定哪些base-url(對於kubernetes)來訪問後端。Kubernetes,將前端應用程序的php代碼連接到後端服務器php代碼

我的當前設置:

  1. 創建了兩個集裝箱的圖像,一個用於前端代碼,另一個用於後端。

  2. 將這些圖像推到我的gcr。

  3. 啓動Kubernetes羣集。爲前端RC和服務以及後端RC和服務設置yaml文件
  4. 通過運行kubectl命令,我們能夠使用其外部IP獨立訪問這兩個服務。
  5. 但我們的前端還沒有能夠與後端服務進行通信。
  6. 不確定我們是否需要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", 
+0

您可以爲您的後端使用類型爲Clusterip的服務,並在您的前端代碼中使用該服務來進行AJAX調用。在羣集內,該服務IP應該可以正確解析。 –

回答

0

通常,在完全配置的kubernetes集羣上,您應該擁有dns開箱即用的功能。如果您在相同的命名空間中部署前後臺,則您的容器應該只能通過服務名稱進行通信。您在這裏可能遇到的問題是,當您在瀏覽器上打開一個頁面並嘗試從它請求時,只需指向您的後端服務,即可嘗試從瀏覽器發出此請求,該請求不在kubernetes內集羣,並且無法通過in-kubernetes聯網訪問其他Pod。

如果是這樣的話,你需要公開前端和後端,這樣它們都可以被瀏覽器訪問(有兩種方法可以實現這一點,從nodePort服務開始,通過LB服務到Ingress 。

+0

感謝您的回覆。但是我的前端和後端都是公開的,並且位於同一個羣集中。我可以爲他們創建服務,並且可以獨立在瀏覽器上運行它。但我不知道如何連接這兩個服務,特別是我需要在我的應用程序代碼中提供哪些url(例如,我已經打包在容器圖像中的index.php)以使用ajax訪問後端。 –

+0

那麼,你怎麼暴露他們?因爲你寫的東西似乎你使用的ClusterIP服務不會在集羣外面暴露服務/ pod –

1

這將是更容易,如果你在這裏發表您yamls要找準你的問題,但這裏的一些常規信息:。

內部服務發現的易用性是kubernetes的強項之一通信從一個容器內到k8s中的另一個服務,您可以使用內置的DNS或環境變量,DNS的工作方式如下:服務可以按名稱使用,並且它解析爲服務的集羣IP。 o如果您的服務名稱爲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,則應該是這種情況。

+0

非常感謝你的回覆。所以你的意思是,如果我在我的前端php文件(容器內)中爲後端php文件(再次在容器中)中有ajax請求,那麼ajax url必須是http:// [backendservicename]:portname。那是對的嗎? –

+0

是的,假設服務具有clusterIP,並且您正在POD內的目標端口上服務,例如與Nginx或其他東西。 –

+0

我編輯了我的問題發佈我的後端服務yaml文件和我的ajax url代碼片段。我的前端容器有一個php文件(它有一個按鈕)。當我使用kubectl命令呈現我的前端服務和rc時,我得到一個外部IP。我在瀏覽器中使用這個外部IP來查看我的前端網頁。現在,當我單擊前端頁面上的按鈕時,我期待它從我的後端服務文件中獲取數據。所以這就是我期待我的阿賈克斯電話做 –