Probando skaffold


Skaffold

Esta vez veremos cómo comenzar con Skaffold. Parece un proyecto relativamente maduro y hace mucho más que algunas de las alternativas exploradas anteriormente: Skaffold es una herramienta de línea de comandos que facilita el desarrollo continuo de aplicaciones Kubernetes. Puedes iterar en el código fuente de tu aplicación localmente y luego desplegar en clústeres de Kubernetes locales o remotos. Skaffold maneja el flujo de trabajo para construir, empujar y desplegar tu aplicación. También proporciona bloques de construcción y describe personalizaciones para una canalización CI/CD. (Extraído de GitHub)


En este ejemplo estaré usando Digital Ocean (ese es mi enlace de referido), ten en cuenta que no tengo ninguna asociación con Digital Ocean, pero te dan $100 para probar sus productos durante 60 días. Si gastas $25, yo obtengo otros $25. Obtuve la idea del canal de YouTube Pelado Nerd.


Empecemos

Una vez que hayas creado tu cuenta y agregado tu tarjeta de crédito, obtendrás los $100 de crédito gratuito. Luego tendrás que ir a Manage en el panel izquierdo y hacer clic en Kubernetes. Crea tu clúster con la cantidad de nodos que consideres necesarios, pero recuerda apagarlos o eliminar estos recursos para que no desperdicies el crédito gratuito o tu propia tarjeta de crédito. Una vez que hayas creado tu clúster y descargado la configuración de kubectl, estás listo para comenzar.


Estaremos trabajando nuevamente con el chatbot; puedes ver el artículo original aquí y el repositorio aquí.


Digámosle a nuestro kubectl que use nuestra configuración descargada recientemente:

$ export KUBECONFIG=/home/kainlite/Downloads/k8s-1-13-1-do-2-nyc1-1546545313076-kubeconfig.yaml
$ kubectl get nodes -o wide

NAME                 STATUS    ROLES     AGE       VERSION   EXTERNAL-IP       OS-IMAGE                       KERNEL-VERSION   CONTAINER-RUNTIME
crazy-wozniak-8306   Ready     <none>    6h        v1.13.1   178.128.154.205   Debian GNU/Linux 9 (stretch)   4.9.0-8-amd64    docker://18.9.0
crazy-wozniak-830t   Ready     <none>    6h        v1.13.1   167.99.224.115    Debian GNU/Linux 9 (stretch)   4.9.0-8-amd64    docker://18.9.0

Tu configuración podría tener un nombre ligeramente diferente, pero debería ser similar. Podemos ver en la salida mucha información sobre nuestros nodos (trabajadores).


Pero vayamos al grano, estamos aquí por Skaffold:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/v0.20.0/skaffold-linux-amd64 && chmod +x skaffold && sudo mv skaffold /usr/local/bin

Puedes instalar el binario usando la línea proporcionada (Linux) o descargándolo desde la página de lanzamientos.


Una vez instalado, podemos ver los ejemplos; estaré usando el ejemplo de “getting-started”:

apiVersion: skaffold/v1beta2
kind: Config
build:
  artifacts:
  - image: kainlite/echobot
deploy:
  kubectl:
    manifests:
      - k8s-*

Con muy poco YAML podemos lograr mucho.


Necesitamos un archivo de manifiesto que coincida con ese patrón para que skaffold pueda desplegar/re-desplegar nuestra aplicación, así que generemos uno con kubectl run echobot --image=kainlite/echobot --dry-run -o yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: echobot
  name: echobot
spec:
  replicas: 1
  selector:
    matchLabels:
      run: echobot
  strategy: {}
  template:
    metadata:
      labels:
        run: echobot
    spec:
      containers:
      - image: kainlite/echobot
        name: echobot
        env:
        - name: SLACK_API_TOKEN
          value: really_long_token
        livenessProbe:
          exec:
            command:
            - '/bin/sh'
            - '-c'
            - '/app/health_check.sh'

El comando anterior puede usarse para generar cualquier tipo de recurso de k8s :); lo modifiqué un poco, porque había campos que no quería y agregué algunos que necesitamos para que funcione.


Entonces, lo único que queda por hacer es probar que todo funcione correctamente:

$ skaffold build

Starting build...
Building [kainlite/echobot]...
Sending build context to Docker daemon  66.56kB
Step 1/12 : FROM golang:1.11.2-alpine as builder
 ---> 57915f96905a
Step 2/12 : WORKDIR /app
 ---> Using cache
 ---> e04488a7f16b
Step 3/12 : RUN adduser -D -g 'app' app &&     chown -R app:app /app &&     apk add git && apk add gcc musl-dev
 ---> Running in 1339601fff6f
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
...
[recortado]
...
fc03e3d-dirty-3541257: digest: sha256:99c6d3d5b226a1947e8f96c0a5f963c8e499848d271f121ad50551046a0dc7ca size: 2197
Build complete in 48.642618413s
Starting test...
Test complete in 9.15µs
kainlite/echobot -> kainlite/echobot:fc03e3d-dirty-3541257

Como podemos ver, skaffold build no solo hizo el build de Docker, sino que también etiquetó y empujó la imagen a Docker Hub, lo cual es muy bueno y realmente útil para construir un sistema CI/CD con él.


Pero espera, necesitamos desplegar eso en nuestro clúster, vamos a ello:

$ skaffold deploy
Starting build...
Building [kainlite/echobot]...
[...]
[recortado]
[...]
Deploy complete in 5.676513226s

Deploy hace mucho, al igual que con gitkube: construye la imagen, la empuja al registro y luego realiza el despliegue al clúster. Como puedes ver, skaffold depende de kubectl y tengo una versión antigua de él.


Después de unos segundos, podemos ver que nuestro despliegue ha sido activado y tenemos un nuevo pod siendo creado para él.

$ kubectl get pods
NAME                       READY     STATUS              RESTARTS   AGE
echobot-57fdcccf76-4qwvq   0/1       ContainerCreating   0          5s
echobot-6fcd78658c-njvpx   0/1       Terminating         0          9m

Skaffold también tiene otra opción interesante llamada dev; observa la carpeta en busca de cambios y re-despliega la aplicación para que puedas enfocarte en el código.


Limpiemos y terminemos por hoy:

$ skaffold delete
Cleaning up...
deployment.extensions "echobot" deleted
Cleanup complete in 3.833219278s

Notas

Realmente me gustó el flujo de trabajo que skaffold proporciona; espero poder usarlo más en un futuro cercano. Y recuerda apagar el clúster de Kubernetes si estás usando Digital Ocean para que no te cobren por sorpresa más adelante.


Errata

Si encuentras algún error o tienes alguna sugerencia, por favor envíame un mensaje para que pueda corregirlo.

Además, puedes revisar el código fuente y los cambios en el código generado y las fuentes aquí


### **Skaffold**

Esta vez veremos cómo comenzar con Skaffold. Parece un proyecto relativamente maduro y hace mucho más que algunas de las alternativas exploradas anteriormente: Skaffold es una herramienta de línea de comandos que facilita el desarrollo continuo de aplicaciones Kubernetes. Puedes iterar en el código fuente de tu aplicación localmente y luego desplegar en clústeres de Kubernetes locales o remotos. Skaffold maneja el flujo de trabajo para construir, empujar y desplegar tu aplicación. También proporciona bloques de construcción y describe personalizaciones para una canalización CI/CD. (Extraído de GitHub)


En este ejemplo estaré usando Digital Ocean (ese es mi enlace de referido), ten en cuenta que no tengo ninguna asociación con Digital Ocean, pero te dan $100 para probar sus productos durante 60 días. Si gastas $25, yo obtengo otros $25. Obtuve la idea del canal de YouTube Pelado Nerd.


Empecemos

Una vez que hayas creado tu cuenta y agregado tu tarjeta de crédito, obtendrás los $100 de crédito gratuito. Luego tendrás que ir a Manage en el panel izquierdo y hacer clic en Kubernetes. Crea tu clúster con la cantidad de nodos que consideres necesarios, pero recuerda apagarlos o eliminar estos recursos para que no desperdicies el crédito gratuito o tu propia tarjeta de crédito. Una vez que hayas creado tu clúster y descargado la configuración de kubectl, estás listo para comenzar.


Estaremos trabajando nuevamente con el chatbot; puedes ver el artículo original aquí y el repositorio aquí.


Digámosle a nuestro kubectl que use nuestra configuración descargada recientemente:

$ export KUBECONFIG=/home/kainlite/Downloads/k8s-1-13-1-do-2-nyc1-1546545313076-kubeconfig.yaml
$ kubectl get nodes -o wide

NAME                 STATUS    ROLES     AGE       VERSION   EXTERNAL-IP       OS-IMAGE                       KERNEL-VERSION   CONTAINER-RUNTIME
crazy-wozniak-8306   Ready     <none>    6h        v1.13.1   178.128.154.205   Debian GNU/Linux 9 (stretch)   4.9.0-8-amd64    docker://18.9.0
crazy-wozniak-830t   Ready     <none>    6h        v1.13.1   167.99.224.115    Debian GNU/Linux 9 (stretch)   4.9.0-8-amd64    docker://18.9.0

Tu configuración podría tener un nombre ligeramente diferente, pero debería ser similar. Podemos ver en la salida mucha información sobre nuestros nodos (trabajadores).


Pero vayamos al grano, estamos aquí por Skaffold:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/v0.20.0/skaffold-linux-amd64 && chmod +x skaffold && sudo mv skaffold /usr/local/bin

Puedes instalar el binario usando la línea proporcionada (Linux) o descargándolo desde la página de lanzamientos.


Una vez instalado, podemos ver los ejemplos; estaré usando el ejemplo de “getting-started”:

apiVersion: skaffold/v1beta2
kind: Config
build:
  artifacts:
  - image: kainlite/echobot
deploy:
  kubectl:
    manifests:
      - k8s-*

Con muy poco YAML podemos lograr mucho.


Necesitamos un archivo de manifiesto que coincida con ese patrón para que skaffold pueda desplegar/re-desplegar nuestra aplicación, así que generemos uno con kubectl run echobot --image=kainlite/echobot --dry-run -o yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: echobot
  name: echobot
spec:
  replicas: 1
  selector:
    matchLabels:
      run: echobot
  strategy: {}
  template:
    metadata:
      labels:
        run: echobot
    spec:
      containers:
      - image: kainlite/echobot
        name: echobot
        env:
        - name: SLACK_API_TOKEN
          value: really_long_token
        livenessProbe:
          exec:
            command:
            - '/bin/sh'
            - '-c'
            - '/app/health_check.sh'

El comando anterior puede usarse para generar cualquier tipo de recurso de k8s :); lo modifiqué un poco, porque había campos que no quería y agregué algunos que necesitamos para que funcione.


Entonces, lo único que queda por hacer es probar que todo funcione correctamente:

$ skaffold build

Starting build...
Building [kainlite/echobot]...
Sending build context to Docker daemon  66.56kB
Step 1/12 : FROM golang:1.11.2-alpine as builder
 ---> 57915f96905a
Step 2/12 : WORKDIR /app
 ---> Using cache
 ---> e04488a7f16b
Step 3/12 : RUN adduser -D -g 'app' app &&     chown -R app:app /app &&     apk add git && apk add gcc musl-dev
 ---> Running in 1339601fff6f
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
...
[recortado]
...
fc03e3d-dirty-3541257: digest: sha256:99c6d3d5b226a1947e8f96c0a5f963c8e499848d271f121ad50551046a0dc7ca size: 2197
Build complete in 48.642618413s
Starting test...
Test complete in 9.15µs
kainlite/echobot -> kainlite/echobot:fc03e3d-dirty-3541257

Como podemos ver, skaffold build no solo hizo el build de Docker, sino que también etiquetó y empujó la imagen a Docker Hub, lo cual es muy bueno y realmente útil para construir un sistema CI/CD con él.


Pero espera, necesitamos desplegar eso en nuestro clúster, vamos a ello:

$ skaffold deploy
Starting build...
Building [kainlite/echobot]...
[...]
[recortado]
[...]
Deploy complete in 5.676513226s

Deploy hace mucho, al igual que con gitkube: construye la imagen, la empuja al registro y luego realiza el despliegue al clúster. Como puedes ver, skaffold depende de kubectl y tengo una versión antigua de él.


Después de unos segundos, podemos ver que nuestro despliegue ha sido activado y tenemos un nuevo pod siendo creado para él.

$ kubectl get pods
NAME                       READY     STATUS              RESTARTS   AGE
echobot-57fdcccf76-4qwvq   0/1       ContainerCreating   0          5s
echobot-6fcd78658c-njvpx   0/1       Terminating         0          9m

Skaffold también tiene otra opción interesante llamada dev; observa la carpeta en busca de cambios y re-despliega la aplicación para que puedas enfocarte en el código.


Limpiemos y terminemos por hoy:

$ skaffold delete
Cleaning up...
deployment.extensions "echobot" deleted
Cleanup complete in 3.833219278s

Notas

Realmente me gustó el flujo de trabajo que skaffold proporciona; espero poder usarlo más en un futuro cercano. Y recuerda apagar el clúster de Kubernetes si estás usando Digital Ocean para que no te cobren por sorpresa más adelante.


Errata

Si encuentras algún error o tienes alguna sugerencia, por favor envíame un mensaje para que pueda corregirlo.



No tienes cuenta? Regístrate aqui

Ya registrado? Iniciar sesión a tu cuenta ahora.

Iniciar session con GitHub
Iniciar sesion con Google
  • Comentarios

    Online: 0

Por favor inicie sesión para poder escribir comentarios.

by Gabriel Garrido