Ko et Kind

Photo by Luis Quintero from Pexels

TL;DR: ko est un utilitaire qui crée une image docker à partir de l'équivalent d'un import go. Il permet en outre de déployer un fichier de manisfest kubernetes qui référence cette image. Cet article montre comment utiliser ko avec un cluster Kubernetes in Docker ou Kind.

Pour cet article, vous devrez avoir curl, go, git, docker, kubectl et kind installés. Vous devrez également avoir configuré votre GOPATH. Les sections qui suivent décrivent:

  • Comment installer google/ko et une registry locale
  • Comment publier une image à partir d'un programme Go
  • Comment créer un cluster Kind connecté à la registry
  • Comment créer le manifeste Kubernetes et publier l'application
  • Comment tester l'application
  • Comment supprimer l'application

Installer Ko et une registry

Pour installer google/ko, étant donné que vous devez avoir go installé sur votre machine, le plus simple est probablement de lancer la commande ci-dessous:

go get -u github.com/google/ko/cmd/ko
export PATH=$GOPATH/bin:$PATH
ko help

Pour utiliser Ko avec un cluster Kubernetes, vous devez partager une registry docker. Le plus simple, pour Kind, est d'utiliser une registry locale. Pour cela, vous allez lancer la commande ci-dessous:

docker run \
    -d --restart=always -p 5000:5000 --name kind-registry \
    registry:2

Note: le nom du container qui publie la registry est important car il est réutilisé par le script de création du cluster.

Publier un premier container

Vous trouverez un exemple de programme Go dans le répertoire 'blog/ko-helloworld` du projet easyteam-fr/side-effects/. Pour publier le container associé, téléchargez les sources dans votre GOPATH:

go get -u -d github.com/easyteam-fr/side-effects/blog/ko-helloworld

Pour construire le container, il suffit de lancer la commande ci-dessous:

export KO_DOCKER_REPO=localhost:5000
ko publish github.com/easyteam-fr/side-effects/blog/ko-helloworld

Créer un cluster connecté à la registry

Pour utiliser Ko avec Kind, vous devez partager la registry précédente. Le document Local Registry explique comment procéder. Vous pouvez simplement lancer la commande ci-dessous:

curl -L https://kind.sigs.k8s.io/examples/kind-with-registry.sh | sh

Créer le manifeste Kubernetes et publier l'application

Pour créer le manifest utilisable par Kubernetes, vous pouvez lancer la commande ko resolve avec le fichier ko-helloworld.yaml lequel contient dans l'image, la référence au programme:

export KO_DOCKER_REPO=localhost:5000
cd $GOPATH/src/github.com/easyteam-fr/side-effects/blog/ko-helloworld
ko resolve -f ko-helloworld.yaml

Depuis le cluster, la registry est accessible via l'alias registry et non pas localhost. Pour appliquer le manifest, vous devrez le transformer au préalable comme ceci:

export KO_DOCKER_REPO=localhost:5000
cd $GOPATH/src/github.com/easyteam-fr/side-effects/blog/ko-helloworld
ko resolve -f ko-helloworld.yaml | \
  sed 's/localhost/registry/' | \
  kubectl apply -f -

Tester l'application

Pour tester l'application, il suffit de se connecter au port 8080 du pod associé et de lancer une commande curl comme ci-dessous:

kubectl get pods
export POD=$(kubectl get pods -l app=hello-world \
              -o custom-columns=name:metadata.name \
              --no-headers)

kubectl port-forward $POD 8080:8080 &

curl 0.0.0.0:8080/greg

Supprimer l'application

Pour supprimer l'application, lancez la commande ci-dessous:

export KO_DOCKER_REPO=localhost:5000
cd $GOPATH/src/github.com/easyteam-fr/side-effects/blog/ko-helloworld
ko resolve -f ko-helloworld.yaml | \
  sed 's/localhost/registry/' | \
  kubectl delete -f -

Aller plus loin...

Pour améliorer l'utilisation de Ko, on voudra ajouter un certificat à la registry et faire un alias local. Vous pourrez ainsi éviter la commande sed pour déployer une nouvelle version.

Ko permet de surtout de déployer des containers depuis vos programmes Go en quelques secondes. Il est notamment utilisé pour développer Tekton.

Easyteam DevOps

Easyteam DevOps