DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Related

  • Using Azure DevOps Pipeline With Gopaddle for No-Code Kubernetes Deployments
  • CI/CD With Azure DevOps and Alibaba Cloud Kubernetes (ACK)
  • Docker Hub Rate Limits to Limitless DevOps in the Cloud
  • Deploying Containers on Azure Container Apps

Trending

  • Detecting Bugs and Vulnerabilities in Java With SonarQube
  • No More Cheap Claude: 4 First Principles of Token Economics in 2026
  • Why Your QA Engineer Should Be the Most Stubborn Person on the Team
  • How AI Is Rewriting Full-Stack Java Systems: Practical Patterns with Spring Boot, Kafka and WebSockets
  1. DZone
  2. Testing, Deployment, and Maintenance
  3. Deployment
  4. Set Up and Deploy to Kubernetes Using Azure DevOps (CI/CD)

Set Up and Deploy to Kubernetes Using Azure DevOps (CI/CD)

Build Docker images, push to a container registry, and deploy into Kubernetes.

By 
Gopal Jayanthi user avatar
Gopal Jayanthi
·
Anjanidevi Oruganti user avatar
Anjanidevi Oruganti
·
Sudheer Mareddy user avatar
Sudheer Mareddy
·
Sidda Reddy Moolamreddy user avatar
Sidda Reddy Moolamreddy
·
Aug. 12, 19 · Tutorial
Likes (4)
Comment
Save
Tweet
Share
27.6K Views

Join the DZone community and get the full member experience.

Join For Free

This article demonstrates how to build docker images, push to a container registry, and deploy that registry into Kubernetes.

Prerequisites

  • Azure Subscription credentials, Create an Azure container registry (ACR).

  • AKS Managed cluster.

Create an Azure Container Registry (ACR) Using CLI

The Azure container registry is a private Docker registry in Azure that stores Docker container images and uses Docker commands to push a container image into a registry. In the end, it pulls and runs the image from the registry. In order to use this tool, you need to: 

  •  Install Azure command-line interface.

  • Check the version of azure-CLI version with the following command.

az --version


  • Use the following command to set the subscription id or name of the subscription.
az account set --subscription "$(id or name)"


  •  Create a resource group.

az group create --name $(resource group) --location westus


  • Create a container registry by using the following command:
az acr create --resource-group (myResourceGroup) --name myContainerRegistry007 --sku Basic


This command gives output in a JSON format and takes note of the login server name, which is a container registry name.

  • Before pulling and pushing images into the ACR, you need to log in to ACR by using the following command.

az acr login --name <acrName>


Continuous Integration (CI)

Use the azure-pipelines.yml, shown in full at the end of this post at the root of your repository and adjust variables to work for your needs. This .yaml file will create a build pipeline for your project. Modify this file and commit it back to your repository so that your build/deploy processes are also treated as code.

Follow all instructions in "Introduction to Azure Pipelines" to create a build pipeline to build docker images for .NET or NodeJS applications.

Steps

  • Azure pipelines have an option to build and deploy using Microsoft-hosted agents. Each time you build or release a pipeline, you get a fresh virtual machine (VM) for the build.
  • If Microsoft-hosted agents don't work, use a self-hosted agent that will act as a system host.
pool:
   name: Hosted Ubuntu 1604


  • Build, push, or run a container Docker application. The task can be used with Docker or Azure Container registry.

Build Container Image Using docker-compose.yaml

This task will build the Docker image from the docker-compose file mentioned the ACR  and subscription details.

steps:
- task: DockerCompose@0
  displayName: 'Build services'
  inputs:
    azureSubscription: '(xxxx-xxxx-xxx-xxx)'
    azureContainerRegistry: '{"loginServer":"iotci.azurecr.io", "id" : "/subscriptions/a476/resourceGroups/xxxaa/providers/Microsoft.ContainerRegistry/registries/XXXX"}'
    dockerComposeFile: 'docker-compose.yml'
    action: 'Build services'
    additionalImageTags: '$(Build.BuildId)'
    includeLatestTag: true


  • Push a container image to Azure container registry(ACR)
steps:
- task: DockerCompose@0
  displayName: 'Push services'
  inputs:
    azureSubscription: 'SIOT-CI-01 (XXXX-XXXX-XXX-XXX-XXX)'
    azureContainerRegistry: '{"loginServer":"iotci.azurecr.io", "id" : "/subscriptions/XXXX-XXX-XXX-XXX/resourceGroups/iotcicd/providers/Microsoft.ContainerRegistry/registries/iotcicd9fa3"}'
    dockerComposeFile: 'docker-compose.yml'
    action: 'Push services'
    additionalImageTags: '$(Build.BuildId)'


  • Use of this task in the build pipeline to publish the build artifacts to the Azure pipelines file share.  Artifacts of the build store it in the Azure DevOps server.

steps:
- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'


Release Pipeline (CD)

Before creating a release pipeline, you need to create an AKS (Azure Kubernetes Cluster) manually by using Azure CLI or Azure Portal. AKS is a managed Kubernetes cluster used to quickly deploy and manage the cluster.

Create a Kubernetes Cluster

Use the following command to create an AKS cluster with one node.

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys


  • Manage kubernetes cluster with the kubectl command line; this will communicate with the kubernetes API cluster.
  • Use the following command to download credentials and configure the Kubernetes CLI.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster


  • Verify the connection to the cluster; use the kubectl get command to list the nodes
kubectl get nodes


  • Make sure that status is Ready


Run the Application

Kubernetes describes a desired state of the cluster and what container images to run. A manifest is used to create all objects needed; it can create a deployment, service, ingress, config map. Create a namespace with the following command.

kubectl create ns <namespace-name>


Create a file name with azure-svc.yaml, azure-dep.yaml and load balancer for service to expose the outside world. The Yaml definition will use these manifest files to deploy objects into a cluster.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: azure-vote-back
spec:
  replicas: 1
  selector:
    matchLabels:
      app: azure-vote-back
  template:
    metadata:
      labels:
        app: azure-vote-back
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: azure-vote-back
        image: redis
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        ports:
        - containerPort: 6379
          name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: azure-vote-back
spec:
  ports:
  - port: 6379
  selector:
    app: azure-vote-back
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: azure-vote-front
spec:
  replicas: 1
  selector:
    matchLabels:
      app: azure-vote-front
  template:
    metadata:
      labels:
        app: azure-vote-front
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: azure-vote-front
        image: microsoft/azure-vote-front:v1
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        ports:
        - containerPort: 80
        env:
        - name: REDIS
          value: "azure-vote-back"
---
apiVersion: v1
kind: Service
metadata:
  name: azure-vote-front
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: azure-vote-front


Deploy the application in AKS by using Kubectl to apply the following task.

variables:
  cluster_rg: 'DefaultResourceGroup-EUS'
  kube_cluster: 'test'

steps:
- task: Kubernetes@1
  displayName: 'kubectl apply'
  inputs:
    connectionType: 'Azure Resource Manager'
    azureSubscriptionEndpoint: 
    azureResourceGroup: '$(cluster_rg)'
    kubernetesCluster: '$(kube_cluster)'
    command: apply
    useConfigurationFile: true
    configuration: 'c:/azure.yaml'
    secretType: generic
    secretName: 'acr-authentication'
    versionSpec: 1.8.1


     Verify each task logs for Build (CI) and Release pipeline(CD) . Verifying task logs for Build (CI) and release pipeline (CD)


An azure-pipelines.yml is shown here.

# Build(CI) pipeline to build docker image and push into a Container,nodejs application code.
pool:
  vmImage: 'Ubuntu 16.04'
steps:
- task: NodeTool@0
  inputs:
    versionSpec: '8.x'
  displayName: 'Install Node.js'
- script: |
    cd result
    npm install
    npm run build
  displayName: 'npm install and build'

steps:
- task: DockerCompose@0
  displayName: 'Build services'
  inputs:
    azureSubscription: '(xxxx-xxxx-xxx-xxx)'
    azureContainerRegistry: '{"loginServer":"iotci.azurecr.io", "id" : "/subscriptions/a476/resourceGroups/xxxaa/providers/Microsoft.ContainerRegistry/registries/XXXX"}'
    dockerComposeFile: 'docker-compose.yml'
    action: 'Build services'
    additionalImageTags: '$(Build.BuildId)'
    includeLatestTag: true
steps:
- task: DockerCompose@0
  displayName: 'Push services'
  inputs:
    azureSubscription: 'IoT (XXXX-XXXX-XXX-XXX-XXX)'
    azureContainerRegistry: '{"loginServer":"iotci.azurecr.io", "id" : "/subscriptions/XXXX-XXX-XXX-XXX/resourceGroups/iotcicd/providers/Microsoft.ContainerRegistry/registries/iotcicd9fa3"}'
    dockerComposeFile: 'docker-compose.yml'
    action: 'Push services'
steps:
- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'
#Release(CD) pipeline to deploy into a nodejs application.
az aks get-credentials --resource-group $(cluster_rg) --name $(kube_cluster)
variables:
  cluster_rg: 'DefaultResourceGroup-EUS'
  kube_cluster: 'test'

steps:
- task: Kubernetes@1
  displayName: 'kubectl apply'
  inputs:
    connectionType: 'Azure Resource Manager'
    azureSubscriptionEndpoint: 'Subscription name (XXXX-XXXX-XXXX-XXXX)'
    azureResourceGroup: '$(cluster_rg)'
    kubernetesCluster: '$(kube_cluster)'
    command: apply
    useConfigurationFile: true
    configuration: 'c:/test.yaml'
    secretType: generic
    secretName: 'authenticate'
    versionSpec: 1.8.1
Continuous Integration/Deployment Kubernetes azure Docker (software) DevOps

Opinions expressed by DZone contributors are their own.

Related

  • Using Azure DevOps Pipeline With Gopaddle for No-Code Kubernetes Deployments
  • CI/CD With Azure DevOps and Alibaba Cloud Kubernetes (ACK)
  • Docker Hub Rate Limits to Limitless DevOps in the Cloud
  • Deploying Containers on Azure Container Apps

Partner Resources

×

Comments

The likes didn't load as expected. Please refresh the page and try again.

  • RSS
  • X
  • Facebook

ABOUT US

  • About DZone
  • Support and feedback
  • Community research

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 215
  • Nashville, TN 37211
  • [email protected]

Let's be friends:

  • RSS
  • X
  • Facebook