Déploiement d’un cluster OKD 3.10 dans Alibaba Cloud : application à React avec le framework Next.js …

Image for post
Image for post
Image for post
Image for post

Je repars une nouvelle fois du fournisseur Alibaba Cloud pour déployer un cluster OKD 3.10 via des playbooks Ansible (on a vu précedemment une méthode manuelle dans Outscale ou via les binaires proposés sur le dépôt github pour un seul hôte en mode développement). Je lance ici trois instances CentOS 7 en mode Pay-As-You-Go via la console d’Alibaba Cloud :

Image for post
Image for post

Voici la vue globale du cluster OKD telle qu’elle est mise en oeuvre dans ce cas :

Image for post
Image for post

Après un upgrade elles passent en CentOS 7.5 :

Image for post
Image for post

J’ajoute le compte utilisateur origin depuis l’instance qui va servir de noeud maître dans le cluster OKD :

# useradd origin 
# passwd origin
# echo -e ‘Defaults:origin !requiretty\norigin ALL = (root) NOPASSWD:ALL’ | tee /etc/sudoers.d/openshift
# chmod 440 /etc/sudoers.d/openshift
Image for post
Image for post

Le moteur Docker est présent sur les instances :

# yum -y install centos-release-openshift-origin310 epel-release docker git pyOpenSSL
# systemctl start docker
# systemctl enable docker
Image for post
Image for post

Je définis la configuration de la connexion SSH depuis l’instance maître vers les noeuds du cluster :

[origin ~]$ ssh-keygen -q -N ""Enter file in which to save the key (/home/origin/.ssh/id_rsa):[origin ~]$ vim ~/.ssh/config[origin ~]$ chmod 600 ~/.ssh/config[origin ~]$ ssh-copy-id okd00{1..3}
Image for post
Image for post
Image for post
Image for post

J’installe les playbooks Ansible pour OKD et je configure l’inventaire :

[origin ~]$ sudo yum -y install openshift-ansible[origin ~]$ sudo vi /etc/ansible/hosts[origin ~]$ sudo cat /etc/ansible/hosts[OSEv3:vars]
ansible_ssh_user=origin
ansible_become=true
openshift_deployment_type=origin
openshift_disable_check=disk_availability,memory_availability,docker_storage,docker_image_availability
# use HTPasswd for authentication
openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider'}]
# define default sub-domain for Master node
openshift_master_default_subdomain=apps.47.89.176.91.xip.io
# allow unencrypted connection within cluster
openshift_docker_insecure_registries=172.30.0.0/16
[masters]
47.89.176.91.xip.io openshift_ip=172.22.248.130 openshift_public_ip=47.89.176.91 openshift_hostname=okd001 openshift_public_hostname=47.89.176.91.xip.io openshift_schedulable=true containerized=false
[etcd]
47.89.176.91.xip.io openshift_ip=172.22.248.130 openshift_public_ip=47.89.176.91 openshift_hostname=okd001 openshift_public_hostname=47.89.176.91.xip.io
[nodes]
47.89.176.91.xip.io openshift_ip=172.22.248.130 openshift_public_ip=47.89.176.91 openshift_hostname=okd001 openshift_public_hostname=47.89.176.91.xip.io openshift_node_group_name='node-config-master-infra'
47.89.186.173.xip.io openshift_ip=172.22.248.131 openshift_public_ip=47.89.186.173 openshift_hostname=okd002 openshift_public_hostname=47.89.186.173.xip.io openshift_node_group_name='node-config-compute'
47.90.205.199.xip.io openshift_ip=172.22.248.132 openshift_public_ip=47.90.205.199 openshift_hostname=okd003 openshift_public_hostname=47.90.205.199.xip.io openshift_node_group_name='node-config-compute'
Image for post
Image for post

Je lance les deux séries de playblook Ansible nécessaires à l’installation du cluster OKD:

[origin ~]$ ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml[origin ~]$ ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
Image for post
Image for post
Image for post
Image for post

Je vérifie l’état du cluster avec le client OKD :

Image for post
Image for post

avec un accès à la console via l’adresse IP publique de l’instance maîtresse du cluster :

Image for post
Image for post

la définition d’un mot de passe pour un utilisateur est nécessaire pour se connecter à la console web :

Image for post
Image for post
Image for post
Image for post

Je vais utilisr en projet test le portail de la start-up d’Etat OpenAcademie qui se base sur le framework Next.js pour React :

Résultat de recherche d'images pour "next.js"
Image for post
Image for post

Pour cela je définis un Dockerfile qui me sert à construire une image à utiliser dans le cluster OKD :

Image for post
Image for post
# docker build -t <repository>/openacademie .
# oc new-project openacademie --display-name="OpenAcademie" --description="site de la communauté OpenAcadémie"
# oc new-app <repository>/openacademie
# oc expose svc/openacademie
Image for post
Image for post

Le service est actif et accessible depuis l’adresse en wild card DNS préconfigurée dans OKD :

Image for post
Image for post

J’en profite pour finir pour tester les fonctions à la demande (FaaS) dans OKD via Apache OpenWhisk :

Image for post
Image for post

Pour rappel, Apache OpenWhisk (Incubating) est une plate-forme open source distribuée “serverless” qui exécute des fonctions (fx) en réponse à des événements. La plate-forme OpenWhisk supporte un modèle de programmation dans lequel les développeurs écrivent une logique fonctionnelle (appelée Actions), dans n’importe quel langage de programmation supporté, qui peut être planifiée dynamiquement et exécutée en réponse à des événements associés (via les Triggers) provenant de sources externes (Feeds) ou de requêtes HTTP. Le projet comprend une interface de ligne de commande (CLI) basée sur l’API REST. Comme Apache OpenWhisk construit ses composants en utilisant des containers, il supporte facilement de nombreuses options de déploiement tant localement qu’au sein des infrastructures Cloud. Les contributions récentes incluent des options de déploiement pour Kubernetes et OpenShift. Application ici avec le déploiement de fonctions dans le cluster OKD :

oc process -f https://git.io/openwhisk-template | oc create -f -
Image for post
Image for post

Il faut attendre que tous les PODs soient provisionnés : on peut le vérifier dans la console au sein du projet dédié ici …

Image for post
Image for post

Je configure wsk pour utiliser OpenWhisk. Il faut utiliser l’option -i pour éviter l’erreur de validation déclenchée par le certificat auto-signé dans le service nginx :

# AUTH_SECRET=$(oc get secret whisk.auth -o yaml | grep "system:" | awk '{print $2}' | base64 --decode)
# wsk property set --auth $AUTH_SECRET --apihost $(oc get route/openwhisk --template="{{.spec.host}}")
# wsk -i list
Image for post
Image for post

Je teste la réponse d’une fonction fournie en exemple :

wsk -i action invoke /whisk.system/utils/echo -p message hello -b
Image for post
Image for post

Test d’une fonction simple :

Image for post
Image for post

Le package alarmes ne fait pas techniquement partie du catalogue OpenWhisk par défaut, mais c’est un moyen simple d’expérimenter des déclencheurs et des règles comme dans ce cas :

# wsk -i trigger create every-5-seconds \
--feed /whisk.system/alarms/alarm \
--param cron '*/5 * * * * *' \
--param maxTriggers 25 \
--param trigger_payload "{\"name\":\"Odin\",\"place\":\"Asgard\"}"
# wsk -i rule create \
invoke-periodically \
every-5-seconds \
/whisk.system/samples/greeting
# wsk -i activation poll
Image for post
Image for post

et effectivement, on a une réponse toutes les 5 secondes :

Image for post
Image for post

Un usage des fonctions qui est amené à se développer notamment dans OKD …

Image associée

Above the clouds, the sky is always blue ...

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store