端点在kubernetes中的URL管理

时间:2017-09-25 12:03:32

标签: url flask kubernetes google-cloud-platform

我是Kubernetes的超级初学者,我试图想象如何在不同的微服务中分割我的单片应用程序。 假设我在Flask中编写我的微服务应用程序,并且每个应用程序都暴露了一些端点,如:

微服务1:

  • / V1 /用户帐户

微服务2:

  • / V1 /储蓄

微服务3:

  • / V1 / AUTH

如果所有这些都在单片应用程序中作为蓝图运行,则所有这些都将使用相同的IP作为前缀,即运行我的应用程序的主机服务器的IP,例如10.12.234.69。

现在,在Kubernetes的3个不同POD /节点上部署这3个“蓝图”将改变每个端点的IP地址,可能是10.12.234.69,而不是10.12.234.70或10.12.234.75

即使IP地址发生变化,我如何编写一个使URL引用保持不变的应用程序?

  • Load Balancer Service会不会这样做?
  • 也许Kubernetes的Service Registry功能为我做了“DNS”部分?

我知道这听起来非常明显,但我仍然无法找到这个简单问题的参考/例子。

提前致谢!

编辑:(作为simon回答的后续行动)

问题:

  • 鉴于Ingress服务产生负载均衡器,并且可以从负载均衡器的IP(http://<ADDRESS>/v1/savings)前缀的http /路径到达所有路由,我该怎么办?将IP关联到负载均衡器以匹配运行烧瓶Web服务器的pod的ip?

  • 如果我将其他子路由添加到相同的路径,例如/v1/savings/get/v1/savings/get/id/<var_id>,我应该更新入口http路径中的所有子路由,以便它们可以通过负载均衡器?

1 个答案:

答案 0 :(得分:3)

  1. 您正在寻找负载均衡器。
  2. Kubernetes服务将使您的pod可以在给定的主机名集群内部访问。
  3. 如果要在单个IP和不同路径下从群集外部访问服务,可以使用负载均衡器和Kubernetes HTTP Ingresses。它们定义了应在哪个域和路径上映射服务,并且可以由负载均衡器获取以构建其配置。

    基于您的微服务架构的示例:

    模拟应用程序

    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: user-accounts
    spec:
      template:
        metadata:
          labels:
            app: user-accounts
        spec:
          containers:
          - name: server
            image: nginx
            ports:
            - containerPort: 80
            args: 
            - /bin/bash
            - "-c" 
            - echo 'server { location /v1/user-accounts { return 200 "user-accounts"; }}' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: savings
    spec:
      template:
        metadata:
          labels:
            app: savings
        spec:
          containers:
          - name: server
            image: nginx
            ports:
            - containerPort: 80
            command: 
            - /bin/bash 
            - "-c" 
            - echo 'server { location /v1/savings { return 200 "savings"; }}' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: auth
    spec:
      template:
        metadata:
          labels:
            app: auth
        spec:
          containers:
          - name: server
            image: nginx
            ports:
            - containerPort: 80
            command: 
            - /bin/bash 
            - "-c" 
            - echo 'server { location /v1/auth { return 200 "auth"; }}' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'
    

    这些部署代表您的服务,只需通过/v1/name下的HTTP返回其名称。

    将应用程序映射到服务

    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: user-accounts
    spec:
      type: NodePort
      selector:
        app: user-accounts
      ports:
      - protocol: TCP
        port: 80
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: savings
    spec:
      type: NodePort
      selector:
        app: savings
      ports:
      - protocol: TCP
        port: 80
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: auth
    spec:
      type: NodePort
      selector:
        app: auth
      ports:
      - protocol: TCP
        port: 80
    

    这些服务创建一个内部IP和一个根据其名称解析它的域,将它们映射到给定选择器找到的pod。在同一群集命名空间中运行的应用程序将能够在user-accountssavingsauth下访问它们。

    通过负载均衡器

    使服务可达
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: example
    spec:
      rules:
      - http:
          paths:
          - path: /v1/user-accounts
            backend:
              serviceName: user-accounts
              servicePort: 80
          - path: /v1/savings
            backend:
              serviceName: savings
              servicePort: 80
          - path: /v1/auth
            backend:
              serviceName: auth
              servicePort: 80
    

    此Ingress定义了应在哪些路径上访问不同的服务。通过kubectl get ingress验证您的Ingress:

    # kubectl get ingress
    NAME      HOSTS     ADDRESS   PORTS     AGE
    example   *                   80        1m
    

    如果您在Google容器引擎上运行,则有一个Ingress controller running in your cluster会在您创建新的Ingress对象时生成Google Cloud Load Balancer。在上面输出的ADDRESS列下,会显示一个IP,您可以在其下访问您的应用程序:

    # curl http://<ADDRESS>/v1/user-accounts
    user-accounts⏎
    # curl http://<ADDRESS>/v1/savings
    savings⏎
    # curl http://<ADDRESS>/v1/auth
    auth⏎