2016-11-15 5 views
1

그래서 내 백엔드와 프런트 엔드가 하나의 컨테이너로 분리되어 있습니다. Kubernetes Deployment.Kubernetes에서 2 개의 다른 DNS 이름을 실행하기 위해 2 개의 컨테이너를 어떻게 설정할 수 있습니까?

현재로서는 다른 포트을 통해 프런트 엔드 & 백엔드에 액세스해야합니다.

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

내가 내 프런트 엔드 컨테이너 내가 GCP를 사용하고 api.example.com

에서 실행 www.example.com & 내 백엔드 컨테이너에서 실행하는 방법을 내가 설정 할 수 있습니다 궁금하네요 (구글 클라우드) , 내 DNS를 올바르게 설정했는지 확인하십시오. & 각 포트에 할당 된 포트 (5000 = frontend, 7000 = backend)를 사용하여 서비스 (웹 응용 프로그램)에 액세스해야합니다.

나는 가능한 해결책을 수동으로 생각하고 있지만, 무언가가 내장되어 있는지 궁금해하고있다. Kubernetes.

내가 설정 포트 80에서 실행됩니다 내는 Kubernetes 클러스터의 nginx를 컨테이너 거라고, 그래서 해당 포트로 리디렉션 될 것이다 통해 오는 모든 요청은 :이 솔루션은 것

예 : 나는 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/을 읽으십시오.

강연을 마치면 동일한 백킹 포드 (엔드 포인트)와 일치하지만 다른 포트 (즉, 앞면 : 80-> 5000 api : 80-> 7000). 문제는 여전히 k8s 클러스터 내에서만 작업을 노출하고 있다는 것입니다. 외부 적으로 공개하려면 노드 포트 또는 LoadBalancer 유형의 서비스를 사용할 수 있습니다 (먼저 높은 포트를 사용하여 서비스를 공개하는 단점이 있고 두 번째 서비스는 서비스 당 별도의 LB (따라서 IP)가됩니다). 두 서비스 (전면/API)와 솔루션을 분할 할 때

개인적으로 공개적으로 http://kubernetes.io/docs/user-guide/ingress/

마지막으로 침투/IngressController를 사용하는 서비스를 노출하는 것을 선호 무엇, 당신은 그들을 함께 유지하는 진짜 이유가없는 것을 볼 수 하나의 배치/포드에서. 두 가지 별개의 배포로 분리하면 더 유연한 아키텍처를 얻을 수 있으며 솔루션을보다 세밀하게 제어 할 수 있습니다.

+0

예이 솔루션은 현재 사용중인 것보다 낫습니다. 나는 처음에는 이런 식으로 할 것이지만, 나는 단지 kubernetes로 시작 했으므로 아기 단계를 취하고 싶었다! – James111

+0

1 질문 : 백엔드와 프론트 엔드가 서로 다른 두 가지 서비스에 있다고 가정하면 '클러스터 IP'를 통해 백엔드를 호출하겠습니까? (로컬 인 것처럼 빠르지 않습니까?) 또는 '호스트 이름'(예 :'api.example.com')? – James111

+1

당신은 클러스터 IP로 그것을 호출 할 수 있지만, kubernetes가 kube-dns에 의해 상자 밖으로 제공되는 경우에는 약간의 발견이 필요합니다. 실제로 DNS로 연결해야합니다. 동일한 네임 스페이스에서 배포/서비스를 모두 실행하는 경우 'backend'와 같은 이름으로 서비스를 호출하거나 'backend.default.svc.cluster.local'과 같은 FQDN으로 서비스를 호출하면 충분합니다 ('default' 네임 스페이스에있는 경우).). 이러한 도메인 이름은 대부분의 경우 동일하지만 ClusterIP로 해결되지만 명시 적으로 서비스를 제거하고 다시 작성하면 변경할 수 있습니다. –

0

요청을 k8s IP 주소로 라우팅하는 데 nginx를 사용하지 않아도됩니다. 작동 시키려면 IP 주소가 포함 된 포드 DNS 이름이 있어야합니다. 포드의 크기를 조정하면 매번 새로운 호스트 이름/DNS 이름으로 nginx config를 수정해야합니다. 포드가 죽게되면, 재시작 후 동일한 IP를 얻게 될 것이라는 보장은 없습니다. 그래서 기본적으로 좋은 접근 방법이 아닙니다.

아마도 더 나은 디자인은 프런트 엔드와 백 엔드를 분리하는 것입니다. 이렇게하면 독립적으로 배포 할 수 있습니다. 백엔드는 아마도 더 많은 자원을 필요로 할 것이며 배율을 조정하면 프런트 엔드를 따라 들고 자원을 공유 할 필요가 없습니다.

서비스를 분리하기로 선택한 경우 k8s services을 확인하십시오. 이해하기 쉽고 설치가 빠릅니다. 프런트 엔드 및 백엔드 용 k8s 서비스를 만든 후에는 자동으로 서비스에 제공 한 이름으로 DNS 이름을 확인할 수 있습니다 (물론 코드에서도 사용할 수 있습니다). 당신이 GKE을 사용하고 있기 때문에

, 당신은 사용하여로드 밸런서를 통해 세계에 이러한 서비스 (또는 단지 프론트 엔드)을 표시 할 수 있습니다 k8s ingress

관련 문제