Créditos

https://blogs.msdn.microsoft.com/wushuai/2018/12/02/get-started-with-aks-ci-cd-in-azure-devops/

Introduccion

La forma más sencilla de crear un canal de CI / CD del servicio de Azure Kubernetes es utilizar el proyecto DevOps de Azure, que proporciona plantillas para varios lenguajes de programación. En este artículo, vamos a usar una aplicación web de node.js muy simple como ejemplo para demostrar cómo realizar un AKS CI / CD en DevOps de Azure.

Pre-requisitos

Proyecto de muestra

El proyecto de ejemplo es una sencilla aplicación nodejs basada en Express, devolverá el nombre del pod por solicitud. A continuación se muestra la estructura del código.

A continuación se muestra el código para index.js

'use strict';
 
const express = require('express');
 
// Constants
const PORT = 80;
const HOST = '0.0.0.0';
 
// App
const app = express();
app.get('/', (req, res) => {
  res.send('Hello from ' + process.env.PODNAME);
});
 
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

A continuación se muestra el código para Dockerfile

FROM node:carbon
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY src /app
EXPOSE 80
CMD [ "node", "index.js" ]

A continuación se muestra el código para nodejsapp.yaml. Implementará nodejs-front como pod y lo expondrá mediante un equilibrador de carga externo. Tenga en cuenta que la variable predefinida Build.BuildId se usa para definir la etiqueta de imagen y la actualizaremos en el canal de compilación.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-front
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nodejs-front
  template:
    metadata:
      labels:
        app: nodejs-front
    spec:
      containers:
      - name: nodejs-front
        image: jacregistry1.azurecr.io/aksdevops-nodejs:#{Build.BuildId}#
        ports:
        - containerPort: 80
        env:
          - name: PODNAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
      imagePullSecrets:
      - name: registrysecret
---
apiVersion: v1
kind: Service
metadata:
  name: nodejs-front
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nodejs-front

Construir Canal (Pipeline)

En este canal- pipeline, construiremos y publicaremos la imagen en un registro de contenedor de Azure existente, luego publicaremos nodejsapp.yaml en el artefacto que se usará en la tubería de la versión más adelante. Antes de seguir adelante, asegúrese de seleccionar "Hosted Ubuntu 1604" como agente de compilación.

npm install

Hemos agregado "npm install" como la primera tarea en el proceso, aunque no es realmente necesario en este proyecto de muestra, puede ser seguido por otras tareas npm como la prueba unitaria en el proyecto de producción.

Reemplazar tokens en Yaml

Como se mencionó anteriormente, la variable predefinida Build.BuildId se usa como marcador de posición en nodejsapp.yaml, la actualizaremos con el id de compilación actual en la tarea "Reemplazar el token" que se encuentra a continuación.

Construir una imagen

Para construir una imagen, usaremos "Docker" aquí, alternativamente, Docker Compose también está disponible. Asegúrese de que la suscripción azul se puede seleccionar correctamente, si la suscripción esperada no aparece, siga el enlace "Administrar" para crear el principio de servicio manualmente. Asegúrese de que la compilación esté seleccionada como comando y también complete la ruta de Dockfile que se muestra a continuación.

Publicar una imagen

Al igual que en la tarea de compilación de una imagen, solo asegúrese de completar el registro del contenedor de Azure correcto y de que la opción de inserción esté seleccionada.

Copiar Yaml

Cree una tarea de "Copiar archivos" para copiar el nodejsapp.yaml al directorio de ensayo que se muestra a continuación.

Publicar artefacto

Por último, se crea una tarea "Publicar artefacto" para publicar el directorio provisional, el archivo yaml se empaqueta en el artefacto y se usará en la canalización de la versión para realizar la implementación.

Canal de publicación - Release

Asegúrese de que el canal de compilación anterior esté seleccionado como la fuente de este canal de lanzamiento y luego cree un entorno de escenario vacío; también se debe usar Hosted Ubuntu 1604 como agente. Cree una tarea "Implementar en Kubernetes" y seleccione aplicar como comando, lo que significa que la tarea ejecutará el comando kubectl apply en segundo plano. En esta tarea, también necesitamos completar la sección secreta, ejecutará kubectl create docker-registry secret en segundo plano para que el clúster kubernetes obtenga la imagen del registro de contenedores a través del secreto.