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


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 :


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

Après un upgrade elles passent en CentOS 7.5 :

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

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

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}


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'

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


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

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

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


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 :


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

# 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


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



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

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 -

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 …

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

Je teste la réponse d’une fonction fournie en exemple :
wsk -i action invoke /whisk.system/utils/echo -p message hello -b

Test d’une fonction simple :

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

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

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