# 🇫🇷 Code Ready Containers - 1er contact

Aujourd'hui, je vous explique comment je vais tester et utiliser Code Ready Containers. Par la suite je vais l'appeler CRC.

CRC est le successeur de MiniShift, il vous permet d'avoir sur votre machine un mono-cluster OpenShift v 4.x pour vous familiariser avec la plateforme.

  • ⚠️ Attention, vous avez besoin d'une machine plutôt "costaude" pour le faire tourner (surtout si vous faites tourner d'autres applications en même temps): 4 virtual CPUs (vCPUs), 8 GB de RAM et 35 GB de place disque
  • Pour le moment je vais tester directement sur un Mac "sur vitaminé", plus tard je le ferais sur un NUC.
  • CRC exécute OpenShift dans une VM
  • je vais créer une seconde VM pour passer les commandes à mon cluster OpenShift comme si je l'appelais d'une machine distante (mais vous pouvez très bien le faire en local)

# Installation

L'équipe CRC a fait du très bon boulot, le setup est plutôt facile à dérouler et vous obtenez assez rapidement un cluster fonctionnel sur votre machine.

La procédure d'installation est ici: GETTING STARTED WITH RED HAT CODEREADY CONTAINERS (opens new window)

# Tips si problème au démarrage

Pour le moment je fais mes tests sur un Mac. Une fois CRC installé, pour le démarrer il faut lancer la commande crc start. J'ai eu un message qui m'expliquait qu'il y avait un problème réseau, j'ai résolu mon problème de la façon suivante:

  • j'ai lancé un ping api.crc.testing et j'ai obtenu l'IP de la VM CRC (dans mon cas 192.168.64.2)
  • ensuite j'ai ajouté ceci dans mon fichier hosts:
192.168.64.2 api.crc.testing oauth-openshift.apps-crc.testing console-openshift-console.apps-crc.testing
  • puis j'ai relancé mon cluster et tout allait beaucoup mieux

# Lancement

C'est simple, il suffit d'utiliser la commance crc start, et de patientez (vous lancez quand même un cluster OpenShift, pas une webapp NodeJS)

La sortie dans votre terminal devrait ressembler à ceci:

INFO Checking if running as non-root              
INFO Checking if oc binary is cached              
INFO Checking if HyperKit is installed            
INFO Checking if crc-driver-hyperkit is installed 
INFO Checking file permissions for /etc/resolver/testing 
INFO Checking file permissions for /etc/hosts     
INFO Starting CodeReady Containers VM for OpenShift 4.2.8... 
INFO Verifying validity of the cluster certificates ... 
INFO Network restart not needed                   
INFO Check internal and public DNS query ...      
INFO Starting OpenShift cluster ... [waiting 3m]  
INFO                                              
INFO To access the cluster, first set up your environment by following 'crc oc-env' instructions 
INFO Then you can access it by running 'oc login -u developer -p developer https://api.crc.testing:6443' 
INFO To login as an admin, username is 'kubeadmin' and password is UMeRe-hBQAi-JJ4Bi-8ynRD 
INFO                                              
INFO You can now run 'crc console' and use these credentials to access the OpenShift web console 

Donc c'est sympa, on vous explique comment vous connecter, on vous donne les credentials, etc... et on vous explique comment paramétrer votre poste pour pouvoir utiliser la CLI oc.

Dans mon cas je vais faire un petit peu autrement, je vais me créer une VM (j'utilise Vagrant et VirtualBox, mais vous pouvez très bien faire autrement) pour simuler l'utilisation de la CLI oc à partir d'une machine distante.

# Préparation de la VM "Cliente"

# Création de la VM

J'ai tout d'abord créé un dossier sandbox-vm-tests (mais appelez le comme vous voulez) et dans ce dossier j'ai créé un sous-dossier projects qui me permettra d'échanger des données entre ma VM et mon MAC (la machine hôte).

Ensuite dans sandbox-vm-tests j'ai créé un fichier Vagrantfile avec le contenu suivant:

SANDBOX_NAME="sandbox-vm-tests"

OPENSHIFT_IP="192.168.64.2"
OPENSHIFT_DOMAIN="api.crc.testing oauth-openshift.apps-crc.testing console-openshift-console.apps-crc.testing"

BOX_IMAGE = "bento/ubuntu-18.04"

Vagrant.configure("2") do |config|
  config.vm.box = BOX_IMAGE

  ENV['LC_ALL']="en_US.UTF-8"

  config.vm.define "#{SANDBOX_NAME}" do |node|
    node.vm.synced_folder "./projects", "/home/vagrant/projects", id:"projects"

    node.vm.hostname = "#{SANDBOX_NAME}"
    
    node.vm.provider "virtualbox" do |vb|
      vb.memory = 512
      vb.cpus = 1
      vb.name = "#{SANDBOX_NAME}"
    end

    node.vm.provision "hosts-file", privileged: true, type: "shell" , inline: <<-SHELL
      # Add entries to hosts file:
      echo "" >> /etc/hosts
      echo '#{OPENSHIFT_IP} #{OPENSHIFT_DOMAIN}' >> /etc/hosts
      echo "" >> /etc/hosts
    SHELL
  end

end

⚠️ Les parties importantes sont:

OPENSHIFT_IP="192.168.64.2"

soyez sûrs de mettre la bone IP

echo '#{OPENSHIFT_IP} #{OPENSHIFT_DOMAIN}' >> /etc/hosts

c'est ce qui permettra à votre VM de "voir" votre cluster sur le réseau

node.vm.synced_folder "./projects", "/home/vagrant/projects", id:"projects"

cela permet de créer un dossier projects partagé entre la VM et la machine hôte

Pour lancer la construction de la VM, dans le dossier sandbox-vm-tests, lancer la commande vagrant up et attendez un petit peu. Au bout de quelques minutes vous avez une VM toute neuve et opérationnelle

# Installation de la CLI dans la VM

remarque: j'aurais pu scripter cette partie dans le Vagrantfile

Connectez vous en SSH à votre VM (vagrant ssh) et tapez les commandes suivantes:

curl -o oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/oc/latest/linux/oc.tar.gz
tar -xf oc.tar.gz
sudo mv oc /usr/local/bin/oc
rm oc.tar.gz 

Maintenant nous allons nous connecter à notre cluster (toujours à partir de la VM):

oc login -u developer -p developer https://api.crc.testing:6443

Vous devriez obtenir ce message:

The server uses a certificate signed by an unknown authority.
You can bypass the certificate check, but any data you send to the server could be intercepted by others.
Use insecure connections? (y/n): 

Repondez y et validez, et vous allez obtenir un Login successful. 👏 🎉

# Déployer sa première webapp

# Créer l'application

Dans le dossier projects créez un sous dossier hello-world qui contiendra notre webapp (faites le à partir de la machine hôte, ce sera plus simple). Notre application sera composée des fichiers suivants (c'est une application nodejs toute simple):

.
├── index.js
└── package.json

Le contenu de package.json est le suivant:

{
  "name": "hello-world",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  }
}

Le contenu de index.js est le suivant:

const http = require('http')
const port = 8080

let index_page = `
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>
    👋 Hello World 🌍
    </h1>
  </body>
</html>  
`

const requestHandler = (request, response) => {
  response.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'})
  response.end(index_page)
}

const server = http.createServer(requestHandler)

server.listen(port, (err) => {
  if (err) {
    return console.log('😡 something bad happened', err)
  }
  console.log(`🌍 server is listening on ${port}`)
})

⚠️ Sauvegardez tout, et "retournez" dans votre VM en SSH.

# Déploiement

Pour créer/déployer une application dans OpenShift, vous devez d'abord créer un projet dans OpenShift. Donc nous allons créer un projet my-project qui pourra "héberger" nos webapps.

cd projects/hello-world
oc login -u developer -p developer https://api.crc.testing:6443
oc new-project my-project

Vous deriez avoir le message suivant:

Now using project "my-project" on server "https://api.crc.testing:6443".

pour se "positionner" sur un projet existant, il suffit d'utiliser la commande oc project nom-du-projet

Et maintenant, utilisez les commandes suivantes pour déployer votre webapp à partir de votre code source:

export APP_NAME="hello-world"
oc new-app . --name=$APP_NAME
oc start-build $APP_NAME --from-dir=. --follow
oc expose service $APP_NAME

Patientez un peu ... Une fois que vous obtenez le message route.route.openshift.io/hello-world exposed, tapez la commande suivante: oc get routes $APP_NAME, et vous allez obtenir ceci:

NAME          HOST/PORT                                 PATH   SERVICES      PORT       TERMINATION   WILDCARD
hello-world   hello-world-my-project.apps-crc.testing          hello-world   8080-tcp                 None

Ce qui signifie que vous pouvez maintenant atteindre votre webapp avec cette url http://hello-world-my-project.apps-crc.testing/ (opens new window)

Ce n'est pas plus compliqué que ça. Encore 👏 à l'équipe de Code Ready Containers!

La suite de ce blog post expliquera comment redéployer "à la main", mais aussi avec GitLab CI. Et je bloguerais à chaque fois que j'avancerais un peu plus dans ma découverte de Code Ready Containers.

Bonne journée à tous 🙂

Last Articles