Упражнение. Развертывание приложения в кластере Службы Azure Kubernetes
В этом упражнении разверните веб-сайт вашей компании в качестве тестового приложения на Служба Azure Kubernetes (AKS). Веб-сайт — это статический веб-сайт с базовым стеком технологий HTML, CSS и JavaScript. Он не получает столько запросов, сколько другие службы, и обеспечивает надежный способ тестирования вариантов развертывания.
Примечание.
Код веб-приложения доступен в этом репозитории GitHub, если вы хотите более подробно изучить исходный код. Кроме того, этот образец приложения будет развернут только в пуле узлов Linux.
Внимание
Для выполнения этого упражнения вам нужна собственная подписка Azure. При этом с вас может взиматься плата. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.
Создание манифеста развертывания
Создайте файл манифеста развертывания для развертывания приложения. Файл манифеста позволяет определить тип ресурса, который требуется развернуть, и все сведения, связанные с рабочей нагрузкой.
Kubernetes группирует контейнеры в логические структуры, называемые модулями pod, которые не имеют логики. Развертывания добавляют недостающую логику для создания приложения. Создадим файл развертывания.
Войдите в Azure Cloud Shell.
В Cloud Shell создайте файл манифеста для развертывания Kubernetes с именем
deployment.yaml
с помощью встроенного редактора.touch deployment.yaml
Откройте интегрированный редактор в Cloud Shell, введя
code .
Откройте файл
deployment.yaml
и добавьте следующий код в разделе YAML.# deployment.yaml apiVersion: apps/v1 # The API resource where this workload resides kind: Deployment # The kind of workload we're creating metadata: name: contoso-website # This will be the name of the deployment
В этом коде вы добавили первые два ключа, чтобы сообщить Kubernetes
apiVersion
иkind
создаваемого манифеста.name
— это имя развертывания. Используйте его для идентификации и запроса сведений о развертывании при использованииkubectl
.Совет
Дополнительные сведения о
apiVersion
и о том, какие значения добавлять в этот ключ, см. в официальной документации Kubernetes. Ищите ссылку в конце этого модуля.Развертывание создает оболочку для модуля pod. Определение шаблона используется для определения сведений о pod в файле манифеста. Шаблон помещается в файл манифеста под разделом спецификации развертывания.
Обновите файл
deployment.yaml
так, чтобы он соответствовал следующему YAML.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: # Metadata for the pod labels: app: contoso-website
Модули Pod не используют те же имена, что и развертывания. Имя модуля pod — это сочетание имени развертывания с случайным идентификатором, добавленным в конец.
Обратите внимание на использование ключа
labels
. Добавьте ключlabels
, чтобы разрешить развертываниям поиск и группирование модулей pod.Модуль pod создает оболочку для одного или нескольких контейнеров. Все модули pod имеют раздел спецификации, позволяющий определять контейнеры внутри этого модуля.
Обновите файл
deployment.yaml
так, чтобы он соответствовал следующему YAML.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: # Here we define all containers - name: contoso-website
Ключ
containers
является массивом спецификаций контейнеров, так как модуль pod может содержать один или несколько контейнеров. Спецификация определяет , aimage
name
,resources
ports
и другие важные сведения о контейнере.Все запущенные модули pod следуют имени
contoso-website-<UUID>
, где идентификатор UUID является созданным идентификатором для идентификации всех ресурсов уникальным образом.Рекомендуется определить минимальное и максимальное количество ресурсов, которые приложение может использовать из кластера. Для указания этих сведений используется ключ
resources
.Обновите файл
deployment.yaml
так, чтобы он соответствовал следующему YAML.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: # Minimum amount of resources requested cpu: 100m memory: 128Mi limits: # Maximum amount of resources requested cpu: 250m memory: 256Mi
Обратите внимание, что в разделе ресурсов можно указать минимальный объем ресурсов в качестве запроса и максимальное количество ресурсов в качестве ограничения.
Последний шаг — определить порты, предоставляемые этим контейнером за пределами
ports
ключа. Ключports
— это массив объектов, что означает, что контейнер в модуле pod может предоставлять несколько портов с несколькими именами.Обновите файл
deployment.yaml
так, чтобы он соответствовал следующему YAML.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 # This container exposes port 80 name: http # We named that port "http" so we can refer to it later
Обратите внимание на то, что для назначения имени порта используется ключ
name
. Именование портов позволяет изменять доступный порт, не изменяя файлы, ссылающиеся на этот порт.Наконец, добавьте раздел селектора, чтобы определить рабочие нагрузки, которыми управляет развертывание. Ключ
selector
помещается в раздел спецификации развертывания файла манифеста. Используйте ключmatchLabels
, чтобы вывести список меток для всех модулей pod, управляемых развертыванием.Обновите файл
deployment.yaml
так, чтобы он соответствовал следующему YAML.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: selector: # Define the wrapping strategy matchLabels: # Match all pods with the defined labels app: contoso-website # Labels follow the `name: value` template template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 name: http
Примечание.
В кластере AKS с несколькими пулами узлов (Linux и Windows) файл манифеста развертывания, ранее перечисленный выше, определяет
nodeSelector
, чтобы сообщить кластеру AKS запустить модуль pod примера приложения на узле, который может запускать контейнеры Linux.Узлы Linux не могут запускать контейнеры Windows и наоборот.
Сохраните файл манифеста и закройте редактор.
Применение манифеста
В Cloud Shell выполните команду
kubectl apply
, чтобы отправить манифест развертывания в кластер.kubectl apply -f ./deployment.yaml
Результат выполнения этой команды должен выглядеть примерно так.
deployment.apps/contoso-website created
Выполните команду
kubectl get deploy
, чтобы проверить успешность развертывания.kubectl get deploy contoso-website
В результате выполнения этой команды должна отобразиться таблица, которая должна выглядеть примерно так:
NAME READY UP-TO-DATE AVAILABLE AGE contoso-website 0/1 1 0 16s
Выполните команду
kubectl get pods
, чтобы проверить, запущен ли модуль pod.kubectl get pods
В результате выполнения этой команды должна отобразиться таблица, которая должна выглядеть примерно так:
NAME READY STATUS RESTARTS AGE contoso-website-7c58c5f699-r79mv 1/1 Running 0 63s