Qu’est-ce qu’OpenShift ?

OpenShift est une plateforme de PAAS développée par RedHat qui repose sur Kubernetes. En gros, c’est Kubernetes avec des outils en plus faits pour simplifier la vie des développeurs. Et en plus c’est opensource…

MiniShift

Si vous voulez tester l’outil ou avoir un environnement local qui ressemble un peu à votre cluster de production, il existe un outil appelé MiniShift.

Ce dernier permet de faire tourner un cluster Openshift sur un seul noeud dans une VM en local.

Installation de MiniShift

Voici la procédure pour l’installer avec les dépendances nécessaires:

  • Docker CE pour OSX
  • docker-machine
  • Minikube
  • xhyve (hyperviseur par défault pour OSX)
  • xhyve driver
  • MiniShift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Installer docker
# Rendez à l'adresse suivante https://docs.docker.com/docker-for-mac/install/ pour télécharger Docker CE. Il suffit de déplacer le binaire dans /Applications

# Installer docker-machine
$ curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \
chmod +x /usr/local/bin/docker-machine

# Installer Minikube
$ brew cask install minikube

# Installer MiniShift
$ brew cask install minishift

# Installer xhyve
$ brew install --HEAD xhyve

# Installer xhyve driver
$ brew install docker-machine-driver-xhyve
$ sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
$ sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve

Création de la VM

1
2
3
4
5
# Créer une VM dans xhyve et créer un cluster OpenShift sur cette dernière
minishift start

# Pour utiliser minishift avec virtualbox
# minishift start --vm-driver=virtualbox

Si tout se passe bien, vous devriez avoir ceci:

image

Test avec une application exemple

Dans cette section, nous allons déployer une application NodeJS fournie par OpenShift qui nous permettra de vérifier que tout fonctionne.

Il y a 3 manières de “piloter” OpenShift. Vous pouvez le faire avec le CLI, l’interface Web ou directement via l’API. Bien que l’interface Web soit très simple à utiliser, on va utiliser le CLI pour la suite de cet article.

Pour l’installer, il suffit d’exécuter la commande suivante:

1
2
3
4
5
6
7
8
9
10
11
$ brew install openshift-cli

# Vérifier l'installation
$ oc version
oc v3.7.1+ab0f056
kubernetes v1.7.6+a08f5eeb62
features: Basic-Auth

Server https://192.168.64.5:8443
openshift v3.7.1+a8deba5-34
kubernetes v1.7.6+a08f5eeb62

Si vous souhaitez obtenir des informations sur l’interface Web, il y a un très bon tutoriel sur le site d’OpenShift qui vous expliquera les points ci-dessous en vous aidant à déployer la webapp qui ressemble à cela:

image

  • Comment déployer une image disponible sur dockerhub
  • Comment scaler votre application extrèmement rapidement
  • Comment fonctionne le Routing HTTP avec HaProxy pour les services créés automatiquement lors du déploiement de l’image. (Prenez le temps de regarder, sécuriser vos routes par TLS est vraiment très simple. C’est limite une case à cocher…)
  • Comment builder une image à partir de votre code source sur Git (via l’outil S2I opensource. La documentation de cet outil est disponible ici)
1
2
3
4
5
6
7
8
9
10
11
12
oc login
# Utilisez developer/developer comme credentials

# Création d'un pod et déploiement de l'application test (git clone, build et push de l'image)
oc new-app https://github.com/openshift/nodejs-ex -l name=myapp

# Surveiller le déploiement en accédant aux logs
oc logs -f bc/nodejs-ex

# Création d'un service Kubernetes
# i.e: Exposer le port 80 en configurant un reverse proxy qui pointe sur le port 8080 du Pod précédement créé.
oc expose svc/nodejs-ex

Si tout s’est bien passé, une URL “publique” va être générée et vous permettra d’accéder à l’application juste déployée. L’application d’exemple déployée via le CLI ressemble à ceci:

image

Commandes utiles pour le CLI

Switcher de compte OpenShift

1
2
3
4
oc login --username developer 

# oc login --username <username> --password <password>
# oc login --token <token>

Lister les clusters sur lesquels on s’est déjà connecté

1
oc config get-clusters

Se connecter à un cluster spécifique avec un compte particulier

1
oc login https://clusterA.leandeep.com --username superadmin

Lister tous les contextes

1
oc config get-contexts

Who am I ?

1
2
3
4
oc whoami

# oc whoami --token (voir le token actuel)
# oc whoami --show-server (voir le cluster actuel)

Lister les projets

1
oc get projects

Créer un projet

1
oc new-project mon_super_projet

Accéder à un projet

1
oc project <nom-du-projet>

Créer une app s2i (source 2 image)

1
oc new-app --source-secret <nom-de-votre-secret-pour-se-connecter-a-votre-source-control> <image-docker-permettant-de-faire-du-s2i>~https://bitbucket.org/user/repo-avec-du-nodejs-et-un-dockerfile.git --name nom-de-votre-app-dans-votre-projet

Les ressources suivantes vont être automatiquement créées:

1
2
3
4
5
6
--> Creating resources ...
imagestream "image-docker-permettant-de-faire-du-s2i" created
imagestream "nom-de-votre-app-dans-votre-projet" created
buildconfig "nom-de-votre-app-dans-votre-projet" created
deploymentconfig "nom-de-votre-app-dans-votre-projet" created
service "nom-de-votre-app-dans-votre-projet" created

Update une app s2i

1
oc start-build <nom-du-build-pour-votre-app>

Delete une app

1
oc delete all -l app=bla-bla-bla-https

Donner les droits en lecture à un utilisateur

1
2
3
4
5
oc adm policy add-role-to-user view developer -n mon_super_projet

# oc adm policy add-role-to-user edit <username> -n <project> (donne les droits d'écriture + création de déploiements + effacement d'applications)

# oc adm policy add-role-to-user admin <username> -n <project> (donne tous les droits sur le projet)

Lister toutes les ressources d’un projet (dont DNS exposé)

1
2
3
4
5
6
7
oc get all

# Plus direct pour obtenir la route exposée
# oc get routes

# Lister et filtrer sur un label
oc get all -o name --selector app=apinodejs

Obtenir plus d’information sur une ressource

1
2
3
4
oc describe route/apinodejs
# alternative
# oc describe route apinodejs
`

Comprendre OpenShift (obtenir des informations sur les ressources)

1
2
3
4
5
oc get 
# ou
# oc types
# ou
# oc explain route.spec.host (utile lorsqu'on sort les réponses au format JSON. Exemple oc get route/apinodejs -o json ==> lire l'arborescence)

Editer une ressource

1
2
3
4
oc edit route/apinodejs 

ou
oc edit route/apinodejs -o json

Créer une ressource (formats json ou yml acceptés)

1
2
3
4
oc create -f apinodejs-fqdn.json

# Commande disponible pour la création de route
# oc create route edge apinodejs-fqdn --service apinodejs --insecure-policy Allow --hostname www.example.com

Editer une ressource

1
2
3
oc replace -f apinodejs-fqdn.json

# Erreur si la ressource n'existe pas. L'alternative: oc apply

Editer à la volée

1
2
3
oc patch route/apinodejs-fqdn --patch '{"spec":{"tls": {"insecureEdgeTerminationPolicy": "Allow"}}}'

# Erreur si la ressource n'existe pas. L'alternative: oc apply

Ajouter/Retirer un label sur un service

1
2
3
4
5
# Ajouter le label
oc label service/apinodejs web=true

# Retirer le label
oc label service/apinodejs web-

Effacer une ressource

1
2
3
4
oc delete route/apinodejs-fqdn

# Effacer plusieurs ressources
# oc delete all [--all] --selector app=apinodejs

Créer un environnement from scratch

1
conda create --name py35 python=3.5

Connect as Minishift superadmin

1
oc login -u system:admin

Accéder à Minishift en local

1
oc login https://<IP>:8443 -u system:admin --insecure-skip-tls-verify=true

Obtenir l’IP de Minishift

1
minishift ip

Troubleshooting

Un pod en terminating state ne se kill pas

1
2
oc get po 
oc delete pod <pod-name> -n <pod-namespace> --grace-period=0 --force

Un provisioned service “marked for deletion” ne s’efface pas

1
2
oc edit serviceinstance <provisioned-service> -n <namespace>
# Effacer metadata.finalizers de l'instance comme workaround

L’application ne s’affiche pas

Si vous avez l’erreur suivante, c’est qu’il y a un problème de résolution DNS sur votre Mac:

image

Pour corriger le problème, changez le DNS de votre Mac et utilisez celui de Google.
Pour ce faire, allez dans Préférences Système –> Network –> Cliquez sur le bouton avancé en bas à droit après avoir sélectionné l’interface réseau que vous utilisez –> Cliquez sur l’onglet DNS –> Ajoutez 8.8.8.8 dans la section DNS

Vous avez tout crashé et vous voulez tout recommencer de 0

En cas d’erreur avec votre VM, cette commande peut être utile pour effacer les dossiers en cache. Supprimer la VM dans VirtualBox ne suffit pas.

1
2
3
4
5
6
7
8
# Effacer le cache et la VM
minishift delete --clear-cache

# recréer votre VM
minishift start delete

# Si éventuellement vous ne pouvez pas recréer votre nouvelle VM car il reste des fichiers persistants, effacer le dossier suivant:
rm -rf ~/.minishift/machines/*