Стручки не общаются при работе в облаке, в отличие от мини-куба - PullRequest
0 голосов
/ 15 марта 2019

Редактировать - я применил LoadBalancer к каждому из моих сервисов, и только мой интерфейс запускает правильное изображение. На других моих снимках показывается фляга, но я не могу открыть URL, которые есть в моих последних изображениях. Мои изображения хранятся в репозитории Docker, и я использую облако Google.

Я пытаюсь развернуть мой сервис, который я запускаю локально на миникубе, в облаке. Все работает, как и ожидалось, при локальном запуске, однако, когда я перешел в облако, кажется, что я не могу получить ответ ни от одного из моих модулей, когда я получаю запрос. Я, вероятно, делаю что-то глупое здесь, так как я никогда не пытался Кубе на облаке. Может кто-нибудь пролить свет? Похоже, kube не может разрешить адрес моего сервиса.

my deploy.yaml

apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: frontend
spec:
  ports:
  - port: 5000
    name: http
  selector:
    app: frontend
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: frontend
        version: v1
    spec:
      containers:
        - name: frontend
          image: jor2/frontend
          ports:
          - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: backend
  labels:
    app: backend
spec:
  ports:
  - port: 5000
    name: http
  selector:
    app: backend
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: backend
        version: v1
    spec:
      containers:
        - name: backend
          image: jor2/backend
          ports:
          - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: admin-backend
  labels:
    app: admin-backend
spec:
  ports:
  - port: 5000
    name: http
  selector:
    app: admin-backend
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: admin-backend
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-backend
        version: v1
    spec:
      containers:
        - name: admin-backend
          image: jor2/admin-backend
          ports:
          - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: utils-backend
  labels:
    app: utils-backend
spec:
  ports:
  - port: 5000
    name: http
  selector:
    app: backend
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: utils-backend
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: utils-backend
        version: v1
    spec:
      containers:
        - name: utils-backend
          image: jor2/utils-backend
          ports:
          - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: mongo
spec:
  ports:
    - port: 27017
      targetPort: 27017
  selector:
    name: mongo
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mongo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: mongo
        version: v1
    spec:
      containers:
        - image: mongo
          name: mongo
          ports:
            - containerPort: 27017

клиент пытается отправить запрос в бэкэнд-сервис

from flask import Flask, render_template, request, flash, redirect, url_for, session, jsonify
import requests

app = Flask(__name__)

app.url_map.strict_slashes = False

HEADERS = dict()


@app.route("/view_users/", methods=['GET'])
def view_users():
    users = invoke_backend(page_name="view_users", service="utils")
    return jsonify(users)


def invoke_backend(page_name, id="", service="", headers={}):
    url = create_url(page_name, id, service)
    try:
        res = requests.get(url, headers=headers)
    except Exception:
        return "Error with {}.".format(url)
    try:
        response = res.json()
    except ValueError:
        return "Decoding JSON has failed."
    return response


def create_url(page_name, id="", service=""):
    if service == "admin":
        be_host = os.getenv('ADMIN_BACKEND_SERVICE_HOST', 'admin-backend')
        be_port = os.getenv('ADMIN_BACKEND_SERVICE_PORT', '5000')
        url = 'http://{host}:{port}/{page_name}/{id}'.format(host=be_host, port=be_port, page_name=page_name, id=id)
        return url
    elif service == "frontend":
        be_host = os.getenv('FRONTEND_SERVICE_HOST', 'frontend')
        be_port = os.getenv('FRONTEND_SERVICE_PORT', '5000')
        url = 'http://{host}:{port}/{page_name}/{id}'.format(host=be_host, port=be_port, page_name=page_name, id=id)
        return url
    elif service == "utils":
        be_host = os.getenv('UTILS_BACKEND_SERVICE_HOST', 'utils-backend')
        be_port = os.getenv('UTILS_BACKEND_SERVICE_PORT', '5000')
        url = 'http://{host}:{port}/{page_name}/{id}'.format(host=be_host, port=be_port, page_name=page_name, id=id)
        return url

    be_host = os.getenv('BACKEND_SERVICE_HOST', 'backend')
    be_port = os.getenv('BACKEND_SERVICE_PORT', '5000')
    url = 'http://{host}:{port}/{page_name}/{id}'.format(host=be_host, port=be_port, page_name=page_name, id=id)
    return url


if __name__ == '__main__':
    app.secret_key = 'secret123'
    app.run(debug=True, host='0.0.0.0')

Ответы [ 2 ]

1 голос
/ 15 марта 2019

У меня был неправильный селектор в конфигурации развертывания utils-backend.После тестирования я сузил свой баг до бэкэнда утилит и обнаружил проблему.

selector:
  app: backend

редакция:

selector
  app: utils-backend
0 голосов
/ 15 марта 2019

это ваш скрипт fask, работающий внутри кластера kubernetes?

Конфигурация порта имени службы в развертывании выглядит идеально

Можете ли вы попробовать с mongo = MongoClient("mongodb://mongo:27017")

и если ваш скрипт фляги работает внутри kubernetes, тогда и тогда он может разрешить адрес mongo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...