2016-11-15 95 views
1

所以我有我的後端和前端作爲單獨的容器在Kubernetes部署如何設置兩個不同的容器在Kubernetes中的兩個不同的DNS名稱上運行?

目前我不得不通過不同的端口訪問前端&後端。

example.com:5000 = frontend & example.com:7000 = backend

我不知道如何我可以設置我的前端容器上www.example.com &我的後端容器中運行對api.example.com

我使用GCP運行(谷歌雲) ,已經設置我的DNS正確&我必須使用我分配給他們每個端口(5000 =前端,7000 =後端)的端口訪問服務(網絡應用程序)。

我正在考慮一個可能的解決方案,它是手動的,但我想知道是否有內置於Kubernetes。該解決方案將是:

我最好安裝在我的Kubernetes集羣的nginx的容器,將80端口上運行,這樣來通過將被重定向到相應的端口的任何請求:

如我能有api.example.com point to <my_cluster_ip>/backend &同爲我的前端<my_cluster_ip>/frontend讓nginx的點/後端端口5000和/前端到端口7000

我希望有內置到,我可以使用kubernetes的東西嗎?這裏是我的部署配置,因爲它代表:

{ 
    "apiVersion": "extensions/v1beta1", 
    "kind": "Deployment", 
    "metadata": { 
    "name": "my_container" 
    }, 
    "spec": { 
    "replicas": 1, 
    "template": { 
     "metadata": { 
     "labels": { 
      "app": "my_app" 
     }   
     }, 
     "spec": { 
     "containers": [ 
      { 
      "name": "backend", 
      "image": "backend_url", 
      "ports": [ 
       { 
       "containerPort": 7000 
       } 
      ], 
      "imagePullPolicy": "Always", 
      "env": [ 
       { 
       "name": "NODE_PORT", 
       "value": "7000" 
       }, 
       { 
       "name": "NODE_ENV", 
       "value": "production" 
       } 
      ] 
      }, 
      { 
      "name": "frontend", 
      "image": "frontend_url", 
      "ports": [ 
       { 
       "containerPort": 5000 
       } 
      ], 
      "imagePullPolicy": "Always", 
      "env": [ 
       { 
       "name": "PORT", 
       "value": "5000" 
       }, 
       { 
       "name": "NODE_ENV", 
       "value": "production" 
       } 
      ] 
      } 
     ] 
     } 
    } 
    } 
} 

回答

2

嗯,首先,你不應該立足於部署暴露你的服務。爲此,您應該使用服務覆蓋您的部署。請閱讀http://kubernetes.io/docs/user-guide/services/

當您完成演講時,您可能會注意到完全可以設置兩個匹配相同支持窗格(端點)但位於不同端口的服務(即front:80-> 5000 api:80-> 7000)。問題是,它仍然只在k8s羣集內暴露你的工作。要在外部發布它,你可以使用NodePort或LoadBalancer類型的服務(第一種方法有使用高端口向公衆公開服務的缺點,第二種服務是每個服務單獨的LB(因此是IP))。

我個人比較喜歡什麼用入口/ IngressController http://kubernetes.io/docs/user-guide/ingress/

最後公開揭露的服務,當你有兩個服務(前/ API)劃分的解決方案,你會看到,有沒有真正的理由,讓他們在一起在一個部署/吊艙。如果您將它們分爲兩個不同的部署,您將獲得更靈活的架構,並對您的解決方案進行更細緻的控制。

+0

是的,我喜歡這個解決方案比我現在的更好。我最初會這樣做,但我想要帶着寶貝步驟,因爲我剛剛開始與kubernetes! – James111

+0

1問題:假設您在兩種不同的服務中有後端和前端,您是否會通過'cluster ip'調用後端(這不會更快,因爲它們是本地的?)或'hostname'(例如'api.example.com')? – James111

+1

你可以通過集羣IP來調用它,但是這需要一些發現,在kubernetes的情況下kube-dns提供了這種發現。所以實際上你應該通過DNS連接。如果你在同一個命名空間中運行兩個部署/服務,就足夠通過它的名字來調用服務,比如'backend'或者通過像'backend.default.svc.cluster.local'這樣的FQDN來調用服務(如果你處於'default'命名空間)。這些域名將解析爲ClusterIP - 在大多數情況下都是一樣的,但如果您明確刪除並重新創建服務,它可能會更改。 –

0

使用nginx的請求路由到K8S IP地址是不必要的。爲了使其工作,您需要擁有包含其IP地址的豆莢DNS名稱。如果您縮放該窗格,則需要每次使用新的主機名/ DNS名稱修改nginx配置。如果你的豆莢被殺死了,不能保證,重啓後他們會得到相同的IP地址。所以基本上,不是一個好方法。

可能更好的設計是將前端與後端分開。這樣您可以獨立部署它們。後端可能會消耗更多資源,並且在擴展時,您不必攜帶前端並與之共享資源。

如果您選擇分開您的服務,請查看k8s services。他們很容易理解和快速建立。在爲前端和後端創建k8s服務之後,您可以將DNS名稱解析爲您自動提供服務的名稱(並在您的代碼中使用它)。

由於您使用GKE,您可以通過負載均衡器通過使用公開這些服務(或僅前端)世界k8s ingress

相關問題