- Доступ к учетной записи Azure
- Доступ к Azure DevOps и PAT Token
Доступ к учетной записи GitHub
Создайте организацию Azure DevOps. Голова Здесь и нажмите кнопку «Создать новую организацию».
Все следующие команды должны выполняться в облачной оболочке Azure. Доступ к оболочке здесь из любого браузера и войти в свою учетную запись Azure.
Вы можете использовать экран PowerShell, но в этом прохождении я использую Bash. Введите «Bash» в терминале, чтобы переключиться на команды Bash.
Общая архитектура
Я использовал Cloudskew Чтобы создать вышеуказанную диаграмму. Настоятельно рекомендую вам проверить это (это бесплатно).
Azure DevOps & GitHub отличные, простые в использовании продукты SaaS — GitHub и Azure Tipines помогут вам достичь вашего источника и потребностей CI/CD. Исходный код находится в репозитории GIT в GitHub (ваше приложение, инфраструктура и код трубопровода), а ваш трубопровод CI/CD является трубопроводом Azure YAML.
Реестр контейнеров Azure (ACR) это реестр контейнерных контейнеров Azure, очень похожий на Docker Hub, но это решение Azure Containers Registry, поэтому он интегрируется с другими ресурсами Azure и использует Azure Active Directory для дополнительной безопасности. Попрос Azure в этой демонстрации — это строительство и толкание изображения Docker к ACR (новая версия изображения создается при каждом успешном заезде выполнения трубопровода).
Azure Kubernetes Service (AKS) это без сервера управляемой контейнерной службы оркестровки. AKS работает непосредственно на Azure в качестве услуги PAAS и предоставляет вам среду Kubernetes для развертывания и управления вашим приложением Docker в контейнер. Эта управляемая среда Kubernetes — это то, что управляет вашими ресурсами Kubernetes в этой демонстрации.
Azure Active Directory это встроенное решение для управления идентификацией Azure. В этой демонстрации это важно для вас, потому что вам нужен принципал обслуживания (личность, основанная на регистрации приложения Azure AD). Этот принципал сервиса используется для создания безопасного аутентифицированного подключения на основе идентификаторов (подключение к сервису с Mazure Resource Manager) Таким образом, вы можете развернуть ресурсы с правильными разрешениями для правильной подписки Azure.
Начальная настройка
- Добавьте расширение Azure DevOps в свой сеанс облачной оболочки:
az extension add --name azure-devops
- Добавьте контекст для вашей оболочки, чтобы ссылаться на вашу организацию DevOps:
az devops configure --defaults organization=https://dev.azure.com/insertorgnamehere/
- Установите переменную среды Azure_devops_ext_pat на уровне процесса. Теперь запустите любую команду, не входите в явно:
export AZURE_DEVOPS_EXT_PAT=insertyourpattokenhere
- Создайте новый проект Azure DevOps:
az devops project create --name k8s-project
- Установите проект по умолчанию для работы:
az devops configure --defaults project=k8s-project
Развертывание инфраструктуры
- Создайте ресурсную группу для логической организации ресурсов Azure, которые вы будете создавать:
az group create --location westeurope --resource-group my-aks-rg
- Создайте директор службы. Ваш кластер AKS будет использовать этот принципал сервиса для доступа к реестру контейнеров Azure и вытягивания изображений контейнеров.
Важно: скопируйте вывод следующей команды, вам понадобится позже:
az ad sp create-for-rbac --skip-assignment
- Создайте кластер AKS для развертывания вашего приложения (здесь вы используете вывод из предыдущей команды)
ВАЖНО: Иногда вы получаете ошибку, такую как «400 клиентская ошибка: Плохой запрос на URL » — это известная проблема и повторно выполнять команду, как правило, обычно работает:
Опишите ошибку
Запуск в Cloudshell, команда не сбои, работает правильно на клиенте.
Командное имя AZ Relessment Create
Ошибки:
The command failed with an unexpected error. Here is the traceback:
400 Client Error: Bad Request for url: http://localhost:50342/oauth2/token
Traceback (most recent call last):
File "/opt/az/lib/python3.6/site-packages/knack/cli.py", line 206, in invoke
cmd_result = self.invocation.execute(args)
File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 560, in execute
raise ex
File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 618, in _run_jobs_serially
results.append(self._run_job(expanded_arg, cmd_copy))
File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 611, in _run_job
six.reraise(*sys.exc_info())
File "/opt/az/lib/python3.6/site-packages/six.py", line 693, in reraise
raise value
File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 588, in _run_job
result = cmd_copy(params)
File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 297, in __call__
return self.handler(*args, **kwargs)
File "/opt/az/lib/python3.6/site-packages/azure/cli/core/__init__.py", line 453, in default_command_handler
return op(**command_args)
File "/opt/az/lib/python3.6/site-packages/azure/cli/command_modules/role/custom.py", line 134, in create_role_assignment
resolve_assignee=(not assignee_object_id))
File "/opt/az/lib/python3.6/site-packages/azure/cli/command_modules/role/custom.py", line 150, in _create_role_assignment
object_id = _resolve_object_id(cli_ctx, assignee) if resolve_assignee else assignee
File "/opt/az/lib/python3.6/site-packages/azure/cli/command_modules/role/custom.py", line 1614, in _resolve_object_id
filter="servicePrincipalNames/any(c:c eq '{}')".format(assignee)))
File "/opt/az/lib/python3.6/site-packages/msrest/paging.py", line 143, in __next__
self.advance_page()
File "/opt/az/lib/python3.6/site-packages/msrest/paging.py", line 129, in advance_page
self._response = self._get_next(self.next_link)
File "/opt/az/lib/python3.6/site-packages/azure/graphrbac/operations/service_principals_operations.py", line 156, in internal_paging
response = self._client.send(request, stream=False, **operation_config)
File "/opt/az/lib/python3.6/site-packages/msrest/service_client.py", line 336, in send
pipeline_response = self.config.pipeline.run(request, **kwargs)
File "/opt/az/lib/python3.6/site-packages/msrest/pipeline/__init__.py", line 197, in run
return first_node.send(pipeline_request, **kwargs) # type: ignore
File "/opt/az/lib/python3.6/site-packages/msrest/pipeline/__init__.py", line 150, in send
response = self.next.send(request, **kwargs)
File "/opt/az/lib/python3.6/site-packages/msrest/pipeline/requests.py", line 65, in send
self._creds.signed_session(session)
File "/opt/az/lib/python3.6/site-packages/azure/cli/core/adal_authentication.py", line 26, in signed_session
scheme, token, _ = self._token_retriever()
File "/opt/az/lib/python3.6/site-packages/azure/cli/core/_profile.py", line 532, in _retrieve_token
return self._get_token_from_cloud_shell(resource)
File "/opt/az/lib/python3.6/site-packages/azure/cli/core/_profile.py", line 365, in _get_token_from_cloud_shell
auth = MSIAuthentication(resource=resource)
File "/opt/az/lib/python3.6/site-packages/msrestazure/azure_active_directory.py", line 576, in __init__
self.set_token()
File "/opt/az/lib/python3.6/site-packages/msrestazure/azure_active_directory.py", line 582, in set_token
self.scheme, _, self.token = get_msi_token(self.resource, self.port, self.msi_conf)
File "/opt/az/lib/python3.6/site-packages/msrestazure/azure_active_directory.py", line 485, in get_msi_token
result.raise_for_status()
File "/opt/az/lib/python3.6/site-packages/requests/models.py", line 940, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: http://localhost:50342/oauth2/token
Воспроизводить:
Шаги, чтобы воспроизвести поведение. Обратите внимание, что значения аргументов были отредактированы, так как они могут содержать конфиденциальную информацию.
- Поместите здесь любые предварительные шаги …
AZ Relessment Create -Assignee {} -ROLE {} -SCOPE {}
Ожидаемое поведение
Краткое описание окружающей среды
Linux-4.15.0-1041-azure-x86_64-with-debian-stretch-sid Python 3.6.5 Shell: bash azure-cli 2.0.64 Extensions: resource-graph 0.1.8 interactive 0.4.1
Дополнительный контекст
Спасибо за ваш отзыв! Команда работала за 4,050 секунды.
az aks create -g my-aks-rg -n myakscluster -c 1 --generate-ssh-keys --service-principal "insertappidhere" --client-secret "insertpasswordhere"
- Создайте реестр контейнеров Azure (ACR). Это будет хранилище для наших контейнеров, используемых в AKS:
az acr create -g my-aks-rg -n insertuniqueacrnamehere --sku Basic --admin-enabled true
- Чтобы AKS вытащить изображения из ACR, мы должны установить наши разрешения Azure RBAC для принципала услуги:
ACR_ID=$(az acr show --name ghostauacr --resource-group my-aks-rg --query "id" --output tsv) CLIENT_ID=$(az aks show -g my-aks-rg -n myakscluster --query "servicePrincipalProfile.clientId" --output tsv) az role assignment create --assignee $CLIENT_ID --role acrpull --scope $ACR_ID
Развертывание приложения
Разветвляется это репозитором GitHub (откройте эту ссылку на новой вкладке и нажмите «Вилка»):
GhostInthewires/K8S-применение
Теперь клонируйте его к сеансу терминала в облачной оболочке:
git clone https://github.com//k8s-application.git cd k8s-application
- Создайте конвейер в Azure DevOps:
az pipelines create --name "k8s-application-pipeline"
- Следуйте подсказкам в вашем терминале, чтобы настроить конвейер:
Введите свое имя пользователя GitHub; нажмите Ввод
Введите свой пароль GitHub; нажмите Ввод
Подтвердите, снова введя свой пароль GitHub; нажмите Ввод
(Если включено) Введите код вашего двух фактора аутентификации
Введите имя подключения к службе (например, K8SApplicationPipeline); нажмите Ввод
Выберите [3] для развертывания в Azure Kubernetes Service; нажмите Ввод
Выберите только что созданный вами кластер K8S; нажмите Ввод
Выберите [2] для пространства имен «по умолчанию»; нажмите Ввод
Выберите только что созданный вами ACR; нажмите Ввод
Введите значение для имени изображения (нажмите Enter, чтобы принять по умолчанию); нажмите Ввод
Введите значение для порта службы (нажмите Enter, чтобы принять по умолчанию); нажмите Ввод
Введите значение для просмотра App Flow для просмотра запросов (нажмите ENTER, не набирая значения)
Выберите [1], чтобы продолжить с генерируемым YAML; нажмите Ввод
Выберите [1], чтобы посвятить себя непосредственно в главную ветвь; нажмите Ввод
Поздравляю!
Вы создали проект Azure DevOps! Подождите несколько минут, пока контейнер будет построить, подтолкните ACR, затем разверните в AKS.
- Доступ к своему кластеру AKS, получив учетные данные KubeConfig:
az aks get-credentials --resource-group my-aks-rg --name myakscluster
- Посмотреть ресурсы Kubernetes, созданный ваш проект:
kubectl get all
- Скопируйте IP -адрес службы (в разделе «Внешний IP») и вставьте на новую вкладку браузера с »: 8888» (например, 51.137.4.161:8888) до конца.
Это должен быть ваш окончательный результат!
Резюме
За относительно короткий промежуток времени вы создали новый проект в Azure DevOps. В этом проекте вы настроили конвейер CI/CD. Этот трубопровод построил ваше приложение внутри контейнера, выдвинул этот контейнер в хранилище контейнера и развернул контейнер в AKS. Наконец, позволяя вам просматривать ваше веб -приложение, работающее в AKS из Интернета через службу Kubernetes. Вы удивительны, молодец!
ВАЖНО: Вернитесь обратно в свое раздвоенное репо и ознакомьтесь с файлом «Azure-Pipelines.yml». Вы должны увидеть строку «Триггер: — Мастер», что означает, что каждый раз, когда мы вносим изменение в главную ветку, новая сборка будет автоматически начнется. Магия!
Теперь, когда у вас есть полностью рабочее приложение, развернутое в AKS, держу пари, что вы не можете дождаться, чтобы погрузиться и посмотреть, как все это работает под капюшоном. Я рекомендую это Пост в блоге У этого есть много полезных фрагментов и советов для работы с Kubernetes.
Любые вопросы, свяжитесь с Twitter
Оригинал: «https://dev.to/ghostinthewire5/deploying-an-app-to-aks-using-azure-devops-azure-cloud-shell-3ah7»