Развертывание приложения ASP.NET Core в Kubernetes в Google Kubernetes Engine

1. Обзор

ASP.NET Core — это новый кроссплатформенный фреймворк с открытым исходным кодом для создания современных облачных и подключенных к интернету приложений с использованием языка программирования C#.

Kubernetes — это проект с открытым исходным кодом, который может работать в самых разных средах: от ноутбуков до высокодоступных многоузловых кластеров, от публичных облаков до локальных развертываний, от виртуальных машин до физических серверов.

В этой лабораторной работе вы развернете простое приложение ASP.NET Core в Kubernetes , работающем на Kubernetes Engine . Эта лабораторная работа основана на лабораторной работе «Сборка и запуск приложения ASP.NET Core из Google Cloud Shell» . Возможно, вам стоит сначала выполнить ту лабораторную работу, прежде чем приступать к этой.

Цель этого практического занятия — превратить ваш код (здесь — простое приложение ASP.NET Core "Hello World") в реплицированное приложение, работающее на Kubernetes. Вы берете код, разработанный на вашем компьютере, преобразуете его в образ контейнера Docker, а затем запускаете этот образ в Google Kubernetes Engine.

Вот схема различных элементов, задействованных в этом практическом занятии, которая поможет вам понять, как они взаимодействуют друг с другом. Используйте её в качестве справочного материала по мере прохождения задания; к концу всё должно стать понятным (но пока можете не обращать на это внимания).

7dbdc973aceef1af.jpeg

В рамках этого практического занятия использование управляемой среды, такой как Kubernetes Engine (версия Kubernetes, размещенная Google и работающая на Compute Engine), позволяет вам больше сосредоточиться на изучении Kubernetes, а не на настройке базовой инфраструктуры.

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

Что вы узнаете

  • Как упаковать простое приложение ASP.NET Core в контейнер Docker.
  • Как создать кластер Kubernetes в Google Kubernetes Engine (GKE).
  • Как развернуть приложение ASP.NET Core в поде.
  • Как разрешить внешний трафик к вашему поду.
  • Как масштабировать сервис и внедрить обновление.
  • Как запустить графическую панель управления Kubernetes.

Что вам понадобится

Как вы будете использовать этот учебный материал?

Прочитайте только от начала до конца. Прочитайте текст и выполните упражнения.

Как бы вы оценили свой опыт работы с Google Cloud Platform?

Новичок Средний Профессионал

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любое время.
  • Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он останется неизменным на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . 853e55310c205094.png .

55efc1aaa7a4d3ad.png

Если вы никогда раньше не запускали Cloud Shell, вам будет показан промежуточный экран (внизу), описывающий его назначение. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:

9c92662c6a846a5c.png

Подготовка и подключение к Cloud Shell займут всего несколько минут.

9f0e51b578fecce5.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего Chromebook.

После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и что проект уже настроен на ваш идентификатор проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list

вывод команды

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project

вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью следующей команды:

gcloud config set project <PROJECT_ID>

вывод команды

Updated property [core/project].

3. Создайте приложение ASP.NET Core в Cloud Shell.

В командной строке Cloud Shell вы можете проверить, установлен ли инструмент командной строки dotnet, проверив его версию. В результате должна отобразиться версия установленного инструмента командной строки dotnet:

dotnet --version

Далее создайте новый шаблон веб-приложения ASP.NET Core.

dotnet new mvc -o HelloWorldAspNetCore

Это должно создать проект и восстановить его зависимости. Вы должны увидеть сообщение, похожее на приведенное ниже.

Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.

Restore succeeded.

4. Запустите приложение ASP.NET Core.

Мы почти готовы запустить наше приложение. Перейдите в папку приложения.

cd HelloWorldAspNetCore

Наконец, запустите приложение.

dotnet run --urls=http://localhost:8080

Приложение начинает прослушивать порт 8080.

Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.

Чтобы убедиться, что приложение запущено, нажмите кнопку предварительного просмотра в веб-версии в правом верхнем углу и выберите «Предварительный просмотр на порту 8080».

Capture.PNG

Вы увидите стандартную веб-страницу ASP.NET Core:

f42271880ce4d572.png

После того, как вы убедитесь, что приложение запущено, нажмите Ctrl+C, чтобы закрыть его.

5. Упакуйте приложение ASP.NET Core в контейнер Docker.

Далее подготовьте ваше приложение к работе в контейнере. Первым шагом является определение контейнера и его содержимого.

В корневом каталоге приложения создайте Dockerfile , определяющий образ Docker.

touch Dockerfile

Добавьте следующее в Dockerfile , используя ваш любимый редактор ( vim, nano,emacs или редактор кода Cloud Shell).

# Use Microsoft's official build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build
WORKDIR /app

# Install production dependencies.
# Copy csproj and restore as distinct layers.
COPY *.csproj ./
RUN dotnet restore

# Copy local code to the container image.
COPY . ./
WORKDIR /app

# Build a release artifact.
RUN dotnet publish -c Release -o out

# Use Microsoft's official runtime .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine-amd64 AS runtime
WORKDIR /app
COPY --from=build /app/out ./

# Make sure the app binds to port 8080
ENV ASPNETCORE_URLS http://*:8080

# Run the web service on container startup.
ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]

Важным параметром в вашем Dockerfile является порт, на котором приложение принимает входящий трафик (8080). Это достигается путем установки переменной среды ASPNETCORE_URLS , которую приложения ASP.NET Core используют для определения порта, на котором следует принимать трафик.

Сохраните этот Dockerfile . Теперь давайте соберем образ:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 .

После завершения этого процесса (потребуется некоторое время для загрузки и распаковки всего содержимого) вы увидите, что образ создан и сохранен локально:

docker images

REPOSITORY                             TAG   
gcr.io/yourproject-XXXX/hello-dotnet   v1            

Проверьте образ локально с помощью следующей команды, которая запустит контейнер Docker локально на порту 8080 из созданного вами образа контейнера:

docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

И снова воспользуйтесь функцией предварительного просмотра веб-страниц в CloudShell:

Скриншот от 03.11.2015 17:20:22.png

В новой вкладке должна открыться стандартная веб-страница ASP.NET Core.

f42271880ce4d572.png

После того, как вы убедитесь, что приложение корректно работает локально в контейнере Docker, вы можете остановить запущенный контейнер, нажав Ctrl-> C .

Теперь, когда образ работает как положено, вы можете загрузить его в Google Container Registry — частный репозиторий для ваших образов Docker, доступный из любого проекта Google Cloud (а также извне Google Cloud Platform):

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

Если все пройдет успешно, через некоторое время вы сможете увидеть образ контейнера в разделе « Реестр контейнеров» . На этом этапе у вас будет доступен образ Docker для всего проекта, к которому Kubernetes сможет получить доступ и управлять им, как вы увидите через несколько минут.

576374602b52f4e4.png

Если вам интересно, вы можете просмотреть образы контейнеров, хранящиеся в Google Cloud Storage, перейдя по этой ссылке: https://console.cloud.google.com/storage/browser/ (полная ссылка должна выглядеть примерно так: https://console.cloud.google.com/project/ PROJECT_ID /storage/browser/).

6. Создайте кластер Kubernetes.

Итак, теперь вы готовы создать свой кластер GKE, но перед этим перейдите в раздел Google Kubernetes Engine в веб-консоли и дождитесь инициализации системы (это займет всего несколько секунд).

d5f6e3c267feea1a.png

Кластер состоит из главного API-сервера Kubernetes, управляемого Google, и набора рабочих узлов. Рабочие узлы представляют собой виртуальные машины Compute Engine.

Давайте воспользуемся интерфейсом командной строки gcloud из вашей сессии CloudShell для создания кластера. Укажите зону, близкую к вашей ( из списка зон ). Это займет несколько минут:

gcloud container clusters create hello-dotnet-cluster --cluster-version=latest --num-nodes 4 --zone europe-west1-b

В итоге вы должны увидеть созданный кластер.

Creating cluster hello-dotnet-cluster...done.
Created [https://container.googleapis.com/v1/projects/dotnet-atamel/zones/europe-west1-b/clusters/hello-dotnet-cluster].
kubeconfig entry generated for hello-dotnet-cluster.
NAME                  ZONE            MASTER_VERSION  
hello-dotnet-cluster  europe-west1-b  1.10.7-gke.6

Теперь у вас должен быть полностью функционирующий кластер Kubernetes на базе Google Kubernetes Engine:

eefb8d9b7f39598b.png

Теперь пришло время развернуть ваше собственное контейнеризированное приложение в кластере Kubernetes! С этого момента вы будете использовать командную строку kubectl (уже настроенную в вашей среде Cloud Shell). Для выполнения остальной части этого практического задания требуется, чтобы версия клиента и сервера Kubernetes была 1.2 или выше. kubectl version покажет вам текущую версию команды.

7. Создайте развертывание.

Под Kubernetes — это группа контейнеров, объединенных для целей администрирования и работы в сети. Он может содержать один или несколько контейнеров. Здесь вы просто используете один контейнер, созданный на основе образа ASP.NET Core, хранящегося в вашем частном реестре контейнеров. Он будет предоставлять контент на порту 8080.

Создайте файл hello-dotnet.yaml , используя свой любимый редактор ( vim, nano,emacs или редактор кода Cloud Shell), и определите развертывание Kubernetes для пода:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: hello-dotnet
  template:
    metadata:
      labels:
        run: hello-dotnet
    spec:
      containers:
      - name: hello-dotnet
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

Разверните приложение в пространство имен по умолчанию с помощью kubectl :

kubectl apply -f hello-dotnet.yaml
deployment.apps/hello-dotnet created

Как видите, вы создали объект развертывания . Развертывания — это рекомендуемый способ создания и масштабирования подов. В данном случае новое развертывание управляет одной репликой пода, работающей с образом hello-dotnet:v1 .

Чтобы просмотреть созданное вами развертывание, просто выполните следующую команду:

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   1         1         1            1           37s

Чтобы просмотреть созданный в результате развертывания под, выполните следующую команду:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-ztzrb   1/1       Running   0          57s

Сейчас самое время рассмотреть несколько интересных команд kubectl (ни одна из них не изменит состояние кластера, полная документация доступна здесь ):

kubectl get pods
kubectl cluster-info
kubectl config view
kubectl get events
kubectl logs <pod-name>

На этом этапе ваш контейнер должен работать под управлением Kubernetes, но вам все еще необходимо обеспечить к нему доступ извне.

8. Разрешить внешний трафик

По умолчанию доступ к поду внутри кластера возможен только по его внутреннему IP-адресу. Чтобы сделать контейнер hello-dotnet доступным извне виртуальной сети Kubernetes, необходимо предоставить доступ к поду в качестве сервиса Kubernetes.

Из Cloud Shell вы можете сделать под доступным из публичного интернета с помощью команды kubectl expose в сочетании с флагом --type="LoadBalancer" . Этот флаг необходим для создания внешнего IP-адреса:

kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080

Флаг, используемый в этой команде, указывает на то, что вы будете использовать балансировщик нагрузки, предоставляемый базовой инфраструктурой (в данном случае балансировщик нагрузки Compute Engine ). Обратите внимание, что вы предоставляете доступ к развертыванию, а не непосредственно к поду. Это приведет к тому, что результирующий сервис будет распределять трафик между всеми подами, управляемыми развертыванием (в данном случае только одним подом, но вы добавите больше реплик позже).

Главный узел Kubernetes создает балансировщик нагрузки и связанные с ним правила переадресации Compute Engine, целевые пулы и правила брандмауэра, чтобы обеспечить полную доступность сервиса извне платформы Google Cloud Platform.

Чтобы узнать общедоступный IP-адрес службы, просто запросите у kubectl вывод списка всех служб кластера:

kubectl get services
NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
hello-dotnet 10.3.253.62   104.155.20.69   8080/TCP    1m
kubernetes   10.3.240.1     <none>           443/TCP    5m

Обратите внимание, что для вашей службы указаны 2 IP-адреса, оба обслуживают порт 8080 Один из них — внутренний IP-адрес, видимый только внутри вашей виртуальной сети в облаке; другой — внешний IP-адрес с балансировкой нагрузки. В этом примере внешний IP-адрес — 104.155.20.69 .

Теперь вы сможете получить доступ к сервису, перейдя в браузере по следующему адресу: http://<EXTERNAL_IP> :8080

6b053874002827fe.png

К этому моменту вы уже получили как минимум несколько преимуществ от перехода на контейнеры и Kubernetes — вам не нужно указывать, на каком хосте запускать рабочую нагрузку, а также вы получаете выгоду от мониторинга и перезапуска сервисов. Давайте посмотрим, что еще вы можете получить от вашей новой инфраструктуры Kubernetes.

9. Масштабируйте свой сервис.

Одна из мощных функций Kubernetes — это простота масштабирования вашего приложения. Предположим, вам внезапно потребуется больше ресурсов для вашего приложения; вы можете просто указать контроллеру репликации управлять новым количеством реплик для вашего пода:

kubectl scale deployment hello-dotnet --replicas=4
kubectl get deployment
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         4         4            3           16m
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m
hello-dotnet-714049816-sh812   1/1       Running   0          1m
hello-dotnet-714049816-ztzrb   1/1       Running   0          16m

Обратите внимание на декларативный подход : вместо запуска или остановки новых экземпляров вы указываете, сколько экземпляров должно работать одновременно. Циклы согласования Kubernetes просто проверяют, соответствует ли реальное положение дел запрошенному, и предпринимают необходимые действия.

Вот диаграмма, суммирующая состояние вашего кластера Kubernetes:

6af0243662464ca9.png

Вы также можете очень легко уменьшить масштаб своего сервиса. Вот как это можно сделать, уменьшив количество модулей с 4 до 2.

kubectl scale deployment hello-dotnet --replicas=2
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

10. Испытание на устойчивость

Kubernetes (точнее, ReplicaSet) отслеживает состояние ваших подов, и если с подом что-то не так и он выходит из строя, он немедленно создает новый. Давайте протестируем это и посмотрим, как это работает.

Сначала получите список модулей:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

Удалите один из подов, указав его имя:

kubectl delete pod hello-dotnet-714049816-g4azy

Если вы снова посмотрите на список подов, то увидите, что сразу же создается и запускается новый под:

kubectl get pods
NAME                         READY     STATUS           RESTARTS   AGE
hello-dotnet-714049816-abczy   1/1    ContainerCreating  0          1m
hello-dotnet-714049816-rk0u6   1/1    Running            0          1m

11. Внедрите обновление для вашего сервиса.

В какой-то момент развернутому вами в производственной среде приложению потребуется исправление ошибок или добавление новых функций. Давайте посмотрим, как выглядит этот процесс.

Для начала давайте изменим приложение. Откройте редактор кода в Cloud Shell.

f487389b8b1cc105.png

Перейдите в Index.cshtml в папке HelloWorldAspNetCore > Views > Home и обновите одно из сообщений карусели.

Найдите следующую строку:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core 

И измените это на следующее:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud

Сохраните изменения, а затем вернитесь в Cloud Shell. Внутри HelloWorldAspNetCore, соберите образ Docker:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 . 

И отправить данные в Реестр контейнеров:

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 

Теперь вы готовы к тому, чтобы Kubernetes плавно обновил ваш контроллер репликации до новой версии приложения. Чтобы изменить метку образа для запущенного контейнера, вам необходимо отредактировать существующее hello-dotnet deployment и изменить образ с gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 на gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .

Для этого вам понадобится команда ` kubectl edit . Она откроет текстовый редактор, отображающий полную конфигурацию развертывания в формате YAML. Сейчас нет необходимости понимать всю конфигурацию YAML, достаточно понимать, что, обновив поле ` spec.template.spec.containers.image в конфигурации, вы указываете развертыванию обновить поды, чтобы они использовали новый образ.

kubectl edit deployment hello-dotnet
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: 2017-01-06T10:05:28Z
  generation: 3
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
  resourceVersion: "151017"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-dotnet
  uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
  replicas: 4
  selector:
    matchLabels:
      run: hello-dotnet
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hello-dotnet
    spec:
      containers:
      - image: gcr.io/PROJECT_ID/hello-dotnet:v1 # Update this line
        imagePullPolicy: IfNotPresent
        name: hello-dotnet
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30

После внесения изменений сохраните и закройте файл (для этого используется vi, поэтому нажмите "Esc", затем введите :wq и нажмите клавишу "Enter").

deployment "hello-dotnet" edited

Это обновляет развертывание с использованием нового образа, в результате чего создаются новые поды с новым образом, а старые поды удаляются.

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         5         4            3           1h

В этот период пользователи сервисов не должны испытывать никаких перебоев. Через некоторое время они начнут получать доступ к новой версии вашего приложения.

fb9f41e814dda653.png

Более подробную информацию о поэтапных обновлениях можно найти в документации Kubernetes .

Надеемся, что, учитывая эти функции развертывания, масштабирования и обновления, вы согласитесь, что после настройки вашей среды (здесь — ваш кластер GKE/Kubernetes) Kubernetes поможет вам сосредоточиться на вашем приложении, а не на управлении инфраструктурой.

12. Создание облачной инфраструктуры

До сих пор мы создавали контейнеры с помощью обычных команд Docker (docker build ...), а затем вручную загружали образ в реестр контейнеров Google Cloud Platform. Также можно отложить оба шага до серверной части Cloud Build , которая может собрать и загрузить образ контейнера без локальной установки Docker.

Сначала включите Cloud Build API в API Manager > Library. Найдите Cloud Build , перейдите в Cloud Build API :

f8b0239fa7719f29.png

Нажмите «Включить API» , если он еще не включен. В итоге вы увидите, что API включен, как показано ниже:

ea6053f9603613b5.png

После включения API Cloud Build вы можете выполнить следующую команду для сборки и отправки образа непосредственно из сервиса Container Builder:

$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3

Образ автоматически сохраняется в реестре контейнеров.

13. Запустите графическую панель управления Kubernetes.

В последних версиях Kubernetes был представлен графический веб-интерфейс пользователя (панель управления). Этот интерфейс позволяет быстро начать работу и предоставляет доступ к некоторым функциям командной строки, делая взаимодействие с системой более удобным и понятным.

Для настройки доступа к панели управления кластера Kubernetes в окне Cloud Shell введите следующие команды:

gcloud container clusters get-credentials hello-dotnet-cluster \
    --zone europe-west1-b --project ${GOOGLE_CLOUD_PROJECT}
kubectl proxy --port 8081

Затем снова воспользуйтесь функцией предварительного просмотра Cloud Shell, чтобы перейти на порт 8081 :

port8081.png

Это должно перенаправить вас на конечную точку API. Возможно, вы увидите страницу «Несанкционированный доступ», но не беспокойтесь. Чтобы перейти на панель управления, удалите «?authuser=3» и замените его на « /ui ».

Наслаждайтесь графической панелью управления Kubernetes и используйте ее для развертывания контейнеризированных приложений, а также для мониторинга и управления вашими кластерами!

177789527b650f6b.png

В качестве альтернативы вы можете получить доступ к панели управления с компьютера разработчика или локального компьютера, используя аналогичные инструкции, которые предоставляются при нажатии кнопки «Подключиться» для кластера, который вы хотите отслеживать, в веб-консоли.

da1ccc707dd6647.png

a51c7160e237f32f.png

После завершения работы с панелью управления вы можете нажать Ctrl + C, чтобы остановить прокси-сервер. Узнайте больше о панели управления Kubernetes, пройдя ознакомительный тур по панели управления .

14. Ведение лесозаготовок

Для получения логов контейнера, работающего в Kubernetes, можно использовать команду kubectl logs . При использовании Google Kubernetes Engine для запуска управляемых кластеров Kubernetes все логи автоматически пересылаются и сохраняются в Google Cloud Logging. Просмотреть все логи подов можно, перейдя в консоль Google Cloud по пути StackdriverLogging → Logs :

b63159b959ba5010.png

В консоли логирования вы можете перейти в раздел GKE Container , чтобы просмотреть все логи, собранные из STDOUT:

43e9aab3e02358d5.png

Здесь вы можете, при желании, экспортировать логи в Google BigQuery для дальнейшего анализа или настроить оповещения на основе логов . Сегодня на лабораторной работе мы этим заниматься не будем.

15. Поздравляем!

На этом завершается этот простой вводный практический урок по ASP.NET Core и Kubernetes. Мы лишь поверхностно ознакомились с этой технологией, и мы рекомендуем вам продолжить изучение с помощью собственных подов, контроллеров репликации и сервисов, а также ознакомиться с проверками работоспособности (проверками состояния) и рассмотреть возможность использования API Kubernetes напрямую.

Уборка

Вот и всё! Пора провести очистку используемых ресурсов (чтобы сэкономить средства и быть ответственным пользователем облачных сервисов).

Удалите развертывание (при этом также удаляются запущенные поды) и службу (при этом также удаляется ваш внешний балансировщик нагрузки):

Сначала удалите службу и развертывание, что также приведет к удалению вашего внешнего балансировщика нагрузки:

kubectl delete service,deployment hello-dotnet
service "hello-dotnet" deleted
deployment "hello-dotnet" deleted

Далее удалите свой кластер:

gcloud container clusters delete hello-dotnet-cluster --zone=europe-west1-b
The following clusters will be deleted.
 - [hello-dotnet-cluster] in [europe-west1-b]
Do you want to continue (Y/n)?  Y
Deleting cluster hello-dotnet-cluster...done.                                                                                                                                                                                            
Deleted [https://container.googleapis.com/v1/projects/<PROJECT_ID>/zones/europe-west1-b/clusters/hello-dotnet-cluster].

Это удалит все экземпляры Google Compute Engine, на которых запущен кластер.

Наконец, удалите хранилище Docker Registry, в котором размещены ваши образы:

gsutil ls
gs://artifacts.<PROJECT_ID>.appspot.com/
gsutil rm -r gs://artifacts.${GOOGLE_CLOUD_PROJECT}.appspot.com/
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...

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

Что мы рассмотрели

  • Как упаковать простое приложение ASP.NET Core в контейнер Docker.
  • Как создать кластер Kubernetes в Google Kubernetes Engine.
  • Как развернуть приложение ASP.NET Core в поде.
  • Как разрешить внешний трафик к вашему поду.
  • Как масштабировать сервис и внедрить обновление.
  • Как запустить графическую панель управления Kubernetes.

Следующие шаги

Лицензия

Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.