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
Please enter at least three characters to search
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Zones

Culture and Methodologies Agile Career Development Methodologies Team Management
Data Engineering AI/ML Big Data Data Databases IoT
Software Design and Architecture Cloud Architecture Containers Integration Microservices Performance Security
Coding Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Culture and Methodologies
Agile Career Development Methodologies Team Management
Data Engineering
AI/ML Big Data Data Databases IoT
Software Design and Architecture
Cloud Architecture Containers Integration Microservices Performance Security
Coding
Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance
Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks

Last call! Secure your stack and shape the future! Help dev teams across the globe navigate their software supply chain security challenges.

Modernize your data layer. Learn how to design cloud-native database architectures to meet the evolving demands of AI and GenAI workloads.

Releasing software shouldn't be stressful or risky. Learn how to leverage progressive delivery techniques to ensure safer deployments.

Avoid machine learning mistakes and boost model performance! Discover key ML patterns, anti-patterns, data strategies, and more.

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
  • The DevOps Toolchain

Trending

  • Agentic AI for Automated Application Security and Vulnerability Management
  • How the Go Runtime Preempts Goroutines for Efficient Concurrency
  • Transforming AI-Driven Data Analytics with DeepSeek: A New Era of Intelligent Insights
  • Why High-Performance AI/ML Is Essential in Modern Cybersecurity
  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.3K 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
  • The DevOps Toolchain

Partner Resources

×

Comments
Oops! Something Went Wrong

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

ABOUT US

  • About DZone
  • Support and feedback
  • Community research
  • Sitemap

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 100
  • Nashville, TN 37211
  • support@dzone.com

Let's be friends:

Likes
There are no likes...yet! 👀
Be the first to like this post!
It looks like you're not logged in.
Sign in to see who liked this post!