介绍
创建每个资源(AKS、ACR)后,可以使用 kubectl 命令轻松执行到 AKS 的部署。在实际开发中,如果你懒得敲命令来执行部署,你将无法快速释放该功能。因此,最好实施 CI/CD 管道以自动部署到 AKS。在本文中,我们将使用 Azure Pipeline 和 Github 自动将 docker 容器部署到 AKS。
为 Azure Kubernetes 服务和 Azure 容器注册表创建资源。
下面描述如何创建每个资源。
尝试将容器化的 Spring Boot 应用程序部署到 Azure Kubernetes 服务 - Qiita
创建 Azure DevOps
创建项目
添加服务连接
为了从 Azure DevOps 访问 Azure 资源,需要为每个资源创建一个服务连接。
添加 Docker Container Registry 服务连接
如果在注册表类型中选择 Azure 容器注册表,将显示另一个弹出窗口。如果您在浏览器中阻止弹出窗口,它们将不会出现,因此您需要更改设置。此外,如果弹出窗口没有出现,即使它没有被阻止,更新浏览器可能会解决问题。
从弹窗中,如果可以成功登录Azure,Azure端的订阅和ACR资源会显示在订阅和Azure容器注册表的下拉菜单中。选择任何项目,确定服务连接名称,然后注册。
为 Azure Kubernetes 服务添加服务连接
创建 Azure 管道
在这种情况下,我们将与 Github 一起设置一个 Azure Pipeline,以便在将新代码推送到特定分支时运行。
如果 Github 和 Azure Pipeline 没有链接,您将被自动重定向到 Github 的 OAuth 页面,因此请授予请求的访问权限。
与 Github 成功链接后,选择任意一个仓库。此演示中的应用程序与上一篇文章中创建的 Spring Boot 应用程序相同,将容器化的 Spring Boot 应用程序部署到 Azure Kubernetes 服务。实际的 Github 存储库在这里 →https://github.com/ryuichi-f/deploy-aks
k8s/deployaks-app-depl.yml 中只有一处更改。向 spec.template.spec.containers.image 添加了 azure 容器注册表 URL 和图像名称。
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployaks-app-depl
spec:
replicas: 1
selector:
matchLabels:
app: deployaks-app
template:
metadata:
labels:
app: deployaks-app
spec:
containers:
- name: deployaks-app
image: nicetestacr.azurecr.io/deploy-aks # <- 変更
---
apiVersion: v1
kind: Service
metadata:
name: deployaks-app-loadbalancer
spec:
type: LoadBalancer
selector:
app: deployaks-app
ports:
- name: deployaks-port
protocol: TCP
port: 80
targetPort: 8080
由于是选择管道 YAML 模板,所以选择最简单的 Starter 管道。
将以下代码粘贴到管道 YAML 中。然后点击“保存并运行”。
trigger:
- main
variables:
ACRServiceConnection: 'niceTestACRServiceConnection'
AKSServiceConnection: 'niceTestAKCServiceConnection'
dockerRegistryURL: 'nicetestacr.azurecr.io'
imageRepo: deploy-aks
tag: '$(Build.BuildId)'
stages:
- stage: build_image
displayName: build an image
jobs:
- job: build_container_image_job
pool:
vmImage: ubuntu-latest
steps:
- task: Docker@2
inputs:
containerRegistry: $(ACRServiceConnection)
repository: '$(imageRepo)'
command: buildAndPush
Dockerfile: '$(Build.SourcesDirectory)/Dockerfile'
buildContext: '$(Build.SourcesDirectory)'
tags: |
$(tag)
- job: publish_k8s_manifest_files_job
pool:
vmImage: ubuntu-latest
steps:
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)/s/k8s'
artifact: 'manifests'
publishLocation: 'pipeline'
- stage: deploy_container
dependsOn: build_image
displayName: deploy a container
jobs:
- job: deployment_job
pool:
vmImage: ubuntu-latest
variables:
aksSecretName: testAKSSecretName
steps:
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: 'manifests'
targetPath: '$(Pipeline.Workspace)/manifests'
- task: KubernetesManifest@0
inputs:
action: 'deploy'
kubernetesServiceConnection: $(AKSServiceConnection)
namespace: 'default'
containers: |
$(dockerRegistryURL)/$(imageRepo):$(tag)
manifests: |
$(Pipeline.Workspace)/manifests/deployaks-app-depl.yml
Pipeline YAML 各部分的描述
trigger:
- main
将代码推送到trigger 指定的分支时执行 Azure 管道。
variables:
ACRServiceConnection: 'niceTestACRServiceConnection'
AKSServiceConnection: 'niceTestAKCServiceConnection'
dockerRegistryURL: 'nicetestacr.azurecr.io'
imageRepo: deploy-aks
tag: '$(Build.BuildId)'
您可以使用variables 定义要在管道上使用的变量。变量的范围根据定义它的层次结构而变化。这次我们将它定义在最高层次结构中,因此我们可以从所有层次结构中访问该变量。
stages:
- stage: build_image
# 以下省略...
- stage: deploy_container
# 以下省略...
在 Azure 管道中,可以分阶段定义每个流程。从广义上讲,共有三种类型:stage、jobstep。其中stage对应最高层级划分。这次,我们定义了两个阶段,build_image 阶段和 deploy_container 阶段。
jobs:
- job: build_container_image_job
# 以下省略...
- job: publish_k8s_manifest_files_job
# 以下省略...
job 对应于在stage 的部门内进一步划分的部门。每个job 与一个单独的agent 并行运行。
steps:
- task: DownloadPipelineArtifact@2
# 以下省略...
- task: KubernetesManifest@0
# 以下省略...
step 对应于job 部门中的进一步部门。每个step 从上到下依次执行。
- task: Docker@2
inputs:
containerRegistry: $(ACRServiceConnection)
repository: '$(imageRepo)'
command: buildAndPush
Dockerfile: '$(Build.SourcesDirectory)/Dockerfile'
buildContext: '$(Build.SourcesDirectory)'
tags: |
$(tag)
Docker@2 是构建镜像并将其推送到容器注册表的任务。
- containerRegistry:为 Azure 容器注册表指定服务连接
- repository:指定 docker dockrt 镜像的存储库名称
- 命令:指定 Docker@2 命令。可能的命令是:
- “buildAndPush”|“构建”|“推送”|“登录”|“注销”|
- Dockerfile:指定 Dockerfile 的位置。
- buildContext:指定 docker 镜像的构建上下文。
- tags:指定 docker 镜像的标签。多个可以指定为列表。
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)/s/k8s'
artifact: 'manifests'
publishLocation: 'pipeline'
PublishPipelineArtifact@1 是将指定的工件(文件等)上传到特定文件夹的任务。上传的工件可以通过DownloadPipelineArtifact@2 任务下载到另一个stage 并使用。
- 输入:
- targetPath:指定工件的位置。
- artifact:指定任意名称以引用该工件。
- publishLocation:指定要上传到的任何文件夹的名称。
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: 'manifests'
targetPath: '$(Pipeline.Workspace)/manifests'
用于下载PublishPipelineArtifact@1 上传的工件的任务。
- 输入:
- buildType:指定工件源的类型。可能的类型有:
- “当前”|“特定”
- artifactName:
PublishPipelineArtifact@1指定指定工件的名称。 - targetPath:指定上传工件的位置。
- buildType:指定工件源的类型。可能的类型有:
- task: KubernetesManifest@0
inputs:
action: 'deploy'
kubernetesServiceConnection: $(AKSServiceConnection)
namespace: 'default'
containers: |
$(dockerRegistryURL)/$(imageRepo):$(tag)
manifests: |
$(Pipeline.Workspace)/manifests/deployaks-app-depl.yml
将 k8s 清单文件部署到 k8s 集群的任务。
- 输入:
- action:共有 8 种可能的操作。根据指定的操作,之后可以指定的输入类型将发生变化。这一次,指定“部署”操作。可能的行动是:
- 'deploy' | 'promote' | 'reject' | 'createSecret' | 'bake | scale' |
- 命名空间:指定 k8s 命名空间。
- 容器:**在 k8s 清单文件中
spec.template.spec.containers.image指定一个 URL 以替换该部分中的 docker 图像 URL。 - manifest:指定k8s清单文件的位置。
- action:共有 8 种可能的操作。根据指定的操作,之后可以指定的输入类型将发生变化。这一次,指定“部署”操作。可能的行动是:
Azure 管道检测到 Github 存储库中的新提交并自动执行管道。
当所有阶段和作业都变为绿色复选标记时,管道已成功运行。从现在开始,每当新代码推送到主分支时,都会执行管道并部署应用程序。
可以在 AKS 资源的“服务和入口”下找到实际部署的应用程序的 IP 地址。
检查您的服务以查看您的负载平衡器的 EXTERNAL-IP。这次的公网IP是20.18.213.108,所以http://20.18.213.108/hello-world您可以使用以下命令访问您的 Spring Boot 应用程序
结尾
我们成功地使用 Azure Pipeline 自动部署 Docker 容器。在 Pipeline YAML 中配置 CI/CD 后,后续部署是无缝的,可实现快速的功能发布。
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308629606.html