Преобразование Docker -Композит в Kubernetes - PullRequest
0 голосов
/ 08 января 2020

Я изучаю Kubernetes и испытываю большие затруднения в понимании использования имен / меток / селекторов и необходимости выравнивания имен модулей и контейнеров.

У меня есть настройка с. NET Core MVC Приложение, база данных PostgreSQL и обратный прокси Nginx.

Отлично работает с этим docker -compose.yml:

version: "3.7"

services:

  reverseproxy:
    build:
      context: ./Nginx
      dockerfile: ../Nginx.dockerfile
    ports:
      - "80:80"
      - "443:443"
    restart: always

  db:
    image: postgres:12.1-alpine
    environment:
      POSTGRES_PASSWORD: "mvcdbsecretpassword"

  mvc:
    depends_on:
      - reverseproxy
      - db
    build:
      context: .
      dockerfile: ./MyMvc.dockerfile
    environment:
      ConnectionStrings.MyMvc: "Host=db;Port=5432;Database=MyMvcDb;Username=postgres;Password=mvcdbsecretpassword"
    expose:
      - "5000"
    restart: always

MVC Контейнер приложения создается, помечается и помещается в мой реестр Docker. При запуске он регистрирует строку подключения и принимает настройки из файла docker -compose (очевидно - он работает в конце концов).

Я преобразовал это в шесть файлов yaml kubernetes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  labels:
    name: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:12.1-alpine
        env:
        - name: POSTGRES_PASSWORD
          value: mvcdbsecretpassword
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  ports:
  - name: "postgres"
    port: 5432
    targetPort: 5432
  selector:
    app: postgres
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mvc
  labels:
    name: mymvc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mymvc
  template:
    metadata:
      labels:
        app: mymvc
    spec:
      containers:
      - name: mvc
        image: mymvc:v2
        env:
          - name: ConnectionStrings.MyMvc
            value: "Host=postgres;Port=5432;Database=MyMvcDb;Username=postgres;Password=mvcdbsecretpassword"
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: mvc
  labels:
    app: mymvc
spec:
  ports:
  - name: "mvc"
    port: 5000
    targetPort: 5000
  selector:
    app: mymvc
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reverseproxy-deployment
  labels:
    app: mymvc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mymvc
  template:
    metadata:
      labels:
        app: mymvc
    spec:
      containers:
      - name: reverseproxy
        image: reverseproxy:v2
        ports:
        - containerPort: 80
        - containerPort: 443
---
apiVersion: v1
kind: Service
metadata:
  name: reverseproxy-service
  labels:
    app: mymvc
spec:
  ports:
  - name: "http"
    port: 80
    targetPort: 80
  - name: "https"
    port: 443
    targetPort: 443
  selector:
    app: mymvc
  type: LoadBalancer

Как уже говорилось ранее, я очень озадачен тем, когда использовать имена и когда использовать ярлыки.

Небольшое руководство будет высоко оценено.

РЕДАКТИРОВАТЬ: Дэвид Мэйз помог мне понять связь между именами, метками и селекторами. Файлы YAML обновляются соответствующим образом.

Я также добавил службу для приложения mvc, предоставляющего порт 5000.

Теперь модули больше не выходят из строя, но у меня все еще нет доступа к MVC app.

Полагаю, я должен упомянуть, что я пытаюсь запустить этот прогон на Docker Desktop на коробке Windows 10.

Обратный прокси имел смысл в стек Compose, но я больше не уверен, что это также имеет смысл в кластере Kubernetes, или если мне лучше настроить какой-нибудь контроллер Ingress.

Может кто-нибудь сказать мне, если это вообще возможно проверить эту настройку на Docker Рабочий стол?

Запуск kubectl get nodes -o wide показывает, что нет внешнего IP, но я также не уверен, что кластер зеркально отображен на localhost.

Ответы [ 2 ]

1 голос
/ 08 января 2020

В этой настройке действительно важны три вещи:

  1. Когда ваш модуль "mvc" пытается подключиться к хосту с именем postgres через строку подключения к базе данных, которая соответствует имя службы.
  2. В ваших двух службах matchLabels: должно быть подмножеством меток капсулы; то есть spec, template, metadata, labels развертывания.
  3. В развертываниях matchLabels должны соответствовать меткам соответствующий модуль (прямо рядом с ними в файле YAML).

Другие части (названия развертываний, метки служб и объекты развертывания верхнего уровня) фактически не имеют значения , но они могут быть полезны для поиска вещей позже.

В примере вы показываете, что метки сервисов на самом деле не совпадают. Вам нужно сказать например

apiVersion: v1
kind: Service
spec:
  selector:
    matchLabels:
      app: reverseproxy # <-- include "app:" key

Если вы посмотрите на вывод как kubectl describe service reverseproxy-service (используя объект name в командной строке), вы должны увидеть строку как Endpoints: <none>; это указывает на то, что служба неправильно связывается с соответствующими модулями, и такое несоответствие меток является частой причиной.

0 голосов
/ 19 января 2020

Что мне нужно было понять, так это необходимость в контроллере Ingress и Ingress.yaml.

Все провайдеры облачного хостинга предоставляют свои собственные контроллеры Ingress, но для тестирования на Docker Desktop вы должны установить один сам.

Команды для установки Nginx -Вход для Docker Рабочий стол:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/provider/

Мой пример Ingress.yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: mvc-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "false"
spec:
  tls:
  - hosts:
    - mymvc.local
    secretName: mvcsecret-tls
  rules:
    - host: mymvc.local
      http:
        paths:
        - path: /
          backend:
            serviceName: mvc
            servicePort: 5000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...