Упражнение. Развертывание контейнера микрослужб в Kubernetes

Завершено

Kubernetes запускает контейнеры для вас. Вы описываете, что нужно сделать Kubernetes с помощью YAML-файла. В этом упражнении вы создадите файл, чтобы можно было развернуть и запустить бэкенд-сервис в Kubernetes.

Важный

Прежде чем продолжить, необходимо убедиться, что у вас установлена реализация Kubernetes. Мы будем использовать реализацию k3d, выполняемую в пространстве кода. Мы начнем лабораторную работу, установив эту реализацию.

Установка средств и реализации Kubernetes

Необходимо установить как средство kubectl, так и реализацию Kubernetes k3d.

  1. В интерфейсе Codespace, перейдите на вкладку ТЕРМИНАЛ, а затем выполните следующие команды для установки необходимых компонентов:

    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl
    
  2. Затем, чтобы скачать ключ подписи для репозиториев пакетов Kubernetes, выполните следующие команды:

    sudo mkdir /etc/apt/keyrings
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    

    Если вы получите сообщение об ошибке, что каталог уже существует, выполните команду curl отдельно.

  3. Добавьте репозиторий Kubernetes в конфигурацию apt:

    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    
  4. Теперь можно установить средство kubectl:

    sudo apt-get update
    sudo apt-get install -y kubectl
    
  5. Наконец, установите k3d реализацию Kubernetes и создайте кластер:

    curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
    k3d cluster create devcluster --config k3d.yml
    

Создание файла развертывания для серверной службы

Развертывание контейнера управления файлами можно создать в Kubernetes с помощью YAML-файла. Создадим файл для развертывания серверной службы.

  1. Создайте новый файл в папке donet-kubernetes codespace с именем backend-deploy.yml.

  2. Скопируйте следующий текст в файл и сохраните его.

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
        name: productsbackend
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: productsbackend
        spec:
          containers:
          - name: productsbackend
            image: [YOUR DOCKER USER NAME]/productservice:latest
            ports:
            - containerPort: 80
            env:
            - name: ASPNETCORE_URLS
              value: http://*:80
      selector:
        matchLabels:
          app: productsbackend
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: productsbackend
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
        nodePort: 32001
      selector:
        app: productsbackend
    
  3. Замените заполнитель [YOUR DOCKER USER NAME] фактическим именем пользователя Docker.

Этот файл выполняет несколько действий.

Первая часть определяет спецификацию развертывания для контейнера, который будет развернут в Kubernetes. Он задает одну реплику, указывает, где найти образ контейнера, какие порты открыть в нем, и устанавливает некоторые переменные среды. Эта первая часть также определяет метки и имена, которые можно использовать для ссылки на контейнер и спецификацию.

Вторая часть затем определяет, что контейнер работает как служба Kubernetes NodePort. Для этого модуля вам не нужно понимать все особенности NodePorts. Однако следует знать, что этот тип службы предоставляет внешний IP-адрес, чтобы можно было протестировать службу за пределами кластера.

Развертывание и запуск серверной микрослужбы

Затем разверните и запустите микрослужбу.

  1. На вкладке терминала выполните следующую команду:

    kubectl apply -f backend-deploy.yml
    

    Эта команда сообщает Kubernetes запустить созданный файл. Он скачивает образ из Docker Hub и создает контейнер.

  2. Команда kubectl apply возвращается быстро. Но создание контейнера может занять некоторое время. Чтобы просмотреть ход выполнения, используйте следующий код.

    kubectl get pods
    

    В получившемся выходном результате у вас есть строка с productsbackend, за которой следует строка случайных символов в столбце NAME. Когда все готово, 1/1 в столбце ГОТОВО и Запуск в столбце СТАТУС.

  3. Чтобы протестировать службу, перейдите на вкладку ПОРТЫ рядом с локальным адресом порта серверной части, щелкните значок глобуса. В браузере откроется новая вкладка на этом адресе.

  4. Чтобы запросить некоторые продукты, к адресу добавьте /api/product, а затем нажмите клавишу ВВОД. В формате JSON должны отображаться некоторые сведения о продукте.

    [
        {
            "id": 1,
            "name": "Solar Powered Flashlight",
            "description": "A fantastic product for outdoor enthusiasts",
            "price": 19.99,
            "imageUrl": "product1.png"
        },
        {
            "id": 2,
            "name": "Hiking Poles",
            "description": "Ideal for camping and hiking trips",
            "price": 24.99,
            "imageUrl": "product2.png"
        },
        {
            "id": 3,
            "name": "Outdoor Rain Jacket",
            "description": "This product will keep you warm and dry in all weathers",
            "price": 49.99,
            "imageUrl": "product3.png"
        },
        ...
    

Создание файла развертывания и запуск интерфейсной службы

Как и серверная служба, нам нужен файл развертывания для внешнего интерфейса.

  1. Создайте новый файл в папке donet-kubernetes с именем frontend-deploy.yml

  2. Вставьте следующий код в файл:

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: storefrontend
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: storefrontend
        spec:
          containers:
          - name: storefrontend
            image: [YOUR DOCKER USER NAME]/storeimage:latest
            ports:
            - containerPort: 80
            env:
            - name: ASPNETCORE_URLS
              value: http://*:80
            - name: ProductEndpoint
              value: http://productsbackend
      selector:
        matchLabels:
          app: storefrontend
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: storefrontend
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
        nodePort: 32000
      selector:
        app: storefrontend
    
  3. Замените заполнитель [YOUR DOCKER USERNAME] фактическим именем пользователя Docker.

    Обратите внимание, что этот файл похож на тот, который мы создали для серверной микрослужбы. Существует два различия:

    • Мы указываем другой контейнер для работы под значением развертывания spec.template.spec.containers.image.
    • В разделе spec.template.spec.containers.env есть новая переменная среды. Код в приложении storefrontend вызывает серверную часть, но поскольку мы не указали полное доменное имя (FQDN), мы не знаем IP-адрес серверной микрослужбы; поэтому мы используем имя, указанное в узле metadata.nameDeployment. Kubernetes заботится о остальных.
  4. Разверните контейнер в Kubernetes с помощью следующей команды:

    kubectl apply -f frontend-deploy.yml
    

    Снова можно использовать kubectl get pods для просмотра состояния развертывания. После того как в строке для storefrontend в столбце Статус отображается Выполнение, все готово.

  5. Чтобы протестировать службу фронтенда, перейдите на вкладку ПОРТЫ, а затем справа от локального адреса для порта Фронтенд выберите значок глобуса. В браузере отображается домашняя страница.

  6. Выберите продукты. В каталоге отображаются товары Компании Contoso.

    Снимок экрана страницы продуктов eSHopLite.

В этом упражнении вы создали файл развертывания, описывающий именно то, как контейнеры будут выполняться в Kubernetes. Затем вы заставили Kubernetes скачать образ из Docker Hub и запустить контейнеры.