Primeros pasos con gitkube


Gitkube

Esta vez veremos cómo comenzar con Gitkube. Es un proyecto joven, pero parece funcionar bien y tiene un enfoque interesante en comparación con otras alternativas, ya que solo depende de git y kubectl. Aparte de eso, es solo un CRD y un controlador, por lo que terminas con 2 pods en kube-system: uno para el controlador y otro para gitkubed. Gitkubed se encarga de clonar tus repositorios y también de construir las imágenes de Docker. Parece que la idea detrás de Gitkube es para el uso diario en un entorno de desarrollo/pruebas donde necesitas probar tus cambios rápidamente y sin complicaciones. Puedes encontrar más ejemplos aquí. Asegúrate también de revisar su página y documentación si te gusta o quieres aprender más.


En los ejemplos estaré usando minikube, o puedes consultar este repositorio que tiene una buena visión general de minikube. Una vez instalado y arrancado (minikube start), ese comando descargará y configurará el entorno local. Si has estado siguiendo las publicaciones anteriores, ya tienes minikube instalado y funcionando, pero en este post asegúrate de usar minikube tunnel si configuras Gitkube con un balanceador de carga (o si configuras cualquier servicio de tipo balanceador de carga):


Empecemos

Vamos a desplegar o re-desplegar nuestro bot de eco una vez más, pero esta vez usando Gitkube. Puedes encontrar el chat bot: artículo aquí, y el repositorio: aquí


En primer lugar, necesitamos instalar el binario de Gitkube en nuestra máquina y luego el CRD en nuestro clúster de Kubernetes:

$ kubectl create -f https://storage.googleapis.com/gitkube/gitkube-setup-stable.yaml
customresourcedefinition.apiextensions.k8s.io "remotes.gitkube.sh" created
serviceaccount "gitkube" created
clusterrolebinding.rbac.authorization.k8s.io "gitkube" created
configmap "gitkube-ci-conf" created
deployment.extensions "gitkubed" created
deployment.extensions "gitkube-controller" created

$ kubectl --namespace kube-system expose deployment gitkubed --type=LoadBalancer --name=gitkubed
service "gitkubed" exposed

Nota que hay 2 formas de instalar Gitkube en nuestro clúster: usando los manifiestos como se muestra ahí o usando el binario de Gitkube y ejecutando gitkube install.


Para instalar el binario de Gitkube, la forma más sencilla es hacer:

curl https://raw.githubusercontent.com/hasura/gitkube/master/gimme.sh | sudo bash

Esto descargará y copiará el binario en: /usr/local/bin. Como regla general, recomiendo leer lo que vas a canalizar a bash en tu terminal para evitar posibles peligros de internet.


Luego, necesitamos generar (y luego crearlo en el clúster) un archivo llamado remote.yaml (o cualquier nombre que prefieras). Es necesario para indicarle a Gitkube cómo desplegar nuestra aplicación una vez que hagamos git push:

$ gitkube remote generate -f remote.yaml
Remote name: minikube
namespace: default
SSH public key file: ~/.ssh/id_rsa.pub
Initialisation: K8S YAML Manifests
Manifests/Chart directory: Enter
Choose docker registry: docker.io/kainlite
Deployment name: echobot
Container name: echobot
Dockerfile path: Dockerfile
Build context path: ./
Add another container? [y/N] Enter
Add another deployment? [y/N] Enter

Y esto generará el siguiente archivo remote.yaml que luego necesitamos crear en nuestro clúster, ya que es un recurso personalizado y puede verse un poco diferente de los recursos predeterminados de Kubernetes.


El archivo real remote.yaml:

apiVersion: gitkube.sh/v1alpha1
kind: Remote
metadata:
  creationTimestamp: null
  name: minikube
  namespace: default
spec:
  authorizedKeys:
  - |
    ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA8jvVVtDSVe25p2U2tDGQyVrnv3YcWjJc6AXTUMc0YNi+QDm6s+hMTwkf2wDRD7b6Y3kmgNSqLEE0EEgOkA69c8PgypM7AwbKZ51V9XcdPd7NyLabpomNiftpUwi01DGfBr25lJV9h2MHwsI/6w1izDvQyN7fAl+aTFgx+VGg1p4FygXWeBqm0n0DfHmBI7PDXxGbuFTJHUmRVS+HPd5Bi31S9Kq6eoodBWtV2MlVnZkpF67FWt2Xo2rFKVf4pZR4N1yjZKRsvIaI5i14LvtOoOqNQ+/tPMAFAif3AhldOW06fgnddYGi/iF+CatVttwNDWmClSOek9LO72UzR4s0xQ== gabriel@kainlite
  deployments:
  - containers:
    - dockerfile: Dockerfile
      name: echobot
      path: ./
    name: echobot
  manifests:
    helm: {}
    path: ""
  registry:
    credentials:
      secretKeyRef:
        key: ""
      secretRef: minikube-regsecret
    url: docker.io/kainlite
status:
  remoteUrl: ""
  remoteUrlDesc: ""

Hay algunos detalles a tener en cuenta aquí: el nombre del deployment porque Gitkube espera que ya exista un deployment con ese nombre para poder actualizarlo/mejorarlo; la ruta al Dockerfile o al chart de Helm; credenciales para el registro si las hay. Estoy usando una imagen pública, así que no necesitamos nada de eso. El asistente te permitirá elegir y personalizar algunas opciones para tu despliegue.


El último paso sería finalmente crear el recurso:

$ gitkube remote create -f remote.yaml
INFO[0000] remote minikube created
INFO[0000] waiting for remote url
INFO[0000] remote url: ssh://default-minikube@10.98.213.202/~/git/default-minikube

  # añade el remoto a tu repositorio git y haz push:
  git remote add minikube ssh://default-minikube@10.98.213.202/~/git/default-minikube
  git push minikube master

Después de agregar el nuevo remoto llamado minikube, tenemos todo listo para comenzar, así que probémoslo y veamos qué sucede:

$ git push minikube master
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (10/10), 1.92 KiB | 1.92 MiB/s, done.
Total 10 (delta 2), reused 0 (delta 0)
remote: Gitkube build system : Tue Jan  1 23:50:58 UTC 2019: Initialising
remote:
remote: Creating the build directory
remote: Checking out 'master:a0265bc5d0229dce0cffc985ca22ebe28532ee95' to '/home/default-minikube/build/default-minikube'
remote:
remote: 1 deployment(s) found in this repo
remote: Trying to build them...
remote:
remote: Building Docker image for : echobot
remote:
remote: Building Docker image : docker.io/kainlite/default-minikube-default.echobot-echobot:a0265bc5d0229dce0cffc985ca22ebe28532ee95
remote: Sending build context to Docker daemon   7.68kB
remote: Step 1/12 : FROM golang:1.11.2-alpine as builder
remote:  ---> 57915f96905a
remote: Step 2/12 : WORKDIR /app
remote:  ---> Using cache
remote:  ---> 997342e65c61
remote: Step 3/12 : RUN adduser -D -g 'app' app &&     chown -R app:app /app &&     apk add git && apk add gcc musl-dev
remote:  ---> Using cache
remote:  ---> 7c6d8b9d1137
remote: Step 4/12 : ADD . /app/
remote:  ---> Using cache
remote:  ---> ca751c2678c4
remote: Step 5/12 : RUN go get -d -v ./... && go build -o main . && chown -R app:app /app /home/app
remote:  ---> Using cache
remote:  ---> 16e44978b140
remote: Step 6/12 : FROM golang:1.11.2-alpine
remote:  ---> 57915f96905a
remote: Step 7/12 : WORKDIR /app
remote:  ---> Using cache
remote:  ---> 997342e65c61
remote: Step 8/12 : RUN adduser -D -g 'app' app &&     chown -R app:app /app
remote:  ---> Using cache
remote:  ---> 55f48da0f9ac
remote: Step 9/12 : COPY --from=builder --chown=app /app/health_check.sh /app/health_check.sh
remote:  ---> Using cache
remote:  ---> 139250fd6c77
remote: Step 10/12 : COPY --from=builder --chown=app /app/main /app/main
remote:  ---> Using cache
remote:  ---> 2f1eb9f16e9f
remote: Step 11/12 : USER app
remote:  ---> Using cache
remote:  ---> a72f27dccff2
remote: Step 12/12 : CMD ["/app/main"]
remote:  ---> Using cache
remote:  ---> 034275449e08
remote: Successfully built 034275449e08
remote: Successfully tagged kainlite/default-minikube-default.echobot-echobot:a0265bc5d0229dce0cffc985ca22ebe28532ee95
remote: pushing docker.io/kainlite/default-minikube-default.echobot-echobot:a0265bc5d0229dce0cffc985ca22ebe28532ee95 to registry
remote: The push refers to repository [docker.io/kainlite/default-minikube-default.echobot-echobot]
remote: bba61bf193fe: Preparing
remote: 3f0355bbea40: Preparing
remote: 2ebcdc9e5e8f: Preparing
remote: 6f1324339fd4: Preparing
remote: 93391cb9fd4b: Preparing
remote: cb9d0f9550f6: Preparing
remote: 93448d8c2605: Preparing
remote: c54f8a17910a: Preparing
remote: df64d3292fd6: Preparing
remote: cb9d0f9550f6: Waiting
remote: 93448d8c2605: Waiting
remote: c54f8a17910a: Waiting
remote: df64d3292fd6: Waiting
remote: 2ebcdc9e5e8f: Layer already exists
remote: 6f1324339fd4: Layer already exists
remote: 3f0355bbea40: Layer already exists
remote: bba61bf193fe: Layer already exists
remote: 93391cb9fd4b: Layer already exists
remote: 93448d8c2605: Layer already exists
remote: cb9d0f9550f6: Layer already exists
remote: df64d3292fd6: Layer already exists
remote: c54f8a17910a: Layer already exists
remote: a0265bc5d0229dce0cffc985ca22ebe28532ee95: digest: sha256:3046c989fe1b1c4f700aaad875658c73ef571028f731546df38fb404ac22a9c9 size: 2198
remote:
remote: Updating Kubernetes deployment: echobot
remote: deployment "echobot" image updated
remote: deployment "echobot" successfully rolled out
remote: NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
remote: echobot   1         1         1            1           31s
remote:
remote: Removing build directory
remote:
remote: Gitkube build system : Tue Jan  1 23:51:16 UTC 2019: Finished build
remote:
remote:
To ssh://10.98.213.202/~/git/default-minikube
 * [new branch]      master -> master

Pasaron muchas cosas allí. En primer lugar, gitkubed revisó el commit de la rama o HEAD que empujamos a /home/default-minikube/build/default-minikube y luego comenzó a construir y etiquetó la imagen de Docker con el SHA correspondiente. Después de eso, empujó la imagen a Docker Hub y luego actualizó el deployment que ya teníamos allí para el bot de eco.


El último paso sería verificar que el pod realmente se actualizó, por lo que podemos inspeccionar la configuración del pod con kubectl describe pod echobot-654cdbfb99-g4bwv:

 $ kubectl describe pod echobot-654cdbfb99-g4bwv
Name:               echobot-654cdbfb99-g4bwv
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               minikube/10.0.2.15
Start Time:         Tue, 01 Jan 2019 20:51:10 -0300
Labels:             app=echobot
                    pod-template-hash=654cdbfb99
Annotations:        <none>
Status:             Running
IP:                 172.17.0.9
Controlled By:      ReplicaSet/echobot-654cdbfb99
Containers:
  echobot:
    Container ID:   docker://fe26ba9be6e2840c0d43a4fcbb4d79af38a00aa3a16411dee5e4af3823d44664
    Image:          docker.io/kainlite/default-minikube-default.echobot-echobot:a0265bc5d0229dce0cffc985ca22ebe28532ee95
    Image ID:       docker-pullable://kainlite/default-minikube-default.echobot-echobot@sha256:3046c989fe1b1c4f700aaad875658c73ef571028f731546df38fb404ac22a9c9
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 01 Jan 2019 20:51:11 -0300
    Ready:          True
    Restart Count:  0
    Liveness:       exec [/bin/sh -c /app/health_check.sh] delay=0s timeout=1s period=10s #success=1 #failure=3
    Environment:
      SLACK_API_TOKEN:  really_long_token
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-ks4jx (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-ks4jx:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-ks4jx
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  39m   default-scheduler  Successfully assigned default/echobot-654cdbfb99-g4bwv to minikube
  Normal  Pulled     39m   kubelet, minikube  Container image "docker.io/kainlite/default-minikube-default.echobot-echobot:a0265bc5d0229dce0cffc985ca22ebe28532ee95" already present on machine
  Normal  Created    39m   kubelet, minikube  Created container
  Normal  Started    39m   kubelet, minikube  Started container

Como podemos ver, la imagen es la que se construyó a partir de nuestro git push y todo está funcionando como se esperaba.


Y eso es todo por ahora. Creo que esta herramienta tiene mucho potencial; es simple, agradable y rápida.


Erratas

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