Dans ce tutoriel, nous allons installer OpenShift dans un conteneur en utilisant un outil appelé footloose par Weaveworks.  Footloose est un outil construit par Weaveworks qui construit et exécute un conteneur avec systemd installé. Il peut être créé d'une manière similaire à une machine virtuelle mais plus facilement.  

J'ai écrit ce tutoriel parce que je voulais un environnement léger pour tester OpenShift Origin 3.10. Minishift est une autre distribution pour les tests, qui vous permet également d'exécuter OpenShift localement, mais dans une machine virtuelle beaucoup plus lourde.

OpenShift : Le monde du « Container-as-a-service » (CaaS)

OpenShift propose pour sa part une approche « Container-as-a-service ». L’intérêt des plateformes de conteneurs est d’éviter l’interférence de services, en utilisant l’isolation proposée par ces technologies.

Encapsulation des technologies de Docker à OpenShift en passant par Kubernetes

OpenShift est une plateforme de conteneurs d’applications open source, principalement basée sur Docker et orchestrée à l’aide de la gestion des clusters de conteneurs Kubernetes, qui est en charge du démarrage et du « scaling » des conteneurs.OpenShift propose également des objets de configuration plus poussés comme :

  • Construire des images
  • Intégrer un registre privé paramétrable pour séparer les images par projet
  • Proposer une interface utilisable par un « non-administrateur »
  • Proposer des routeurs vers les applications
  • Gérer les droits, restriction, authentification, etc…
  • Et bien d’autres...

De nouvelles fonctionnalités améliorent ou accélèrent une stratégie DevTestOps :

  • la gestion d’environnements cloisonnés (Dev/Test/Pré-Prod/Prod) & provisioningle
  • templating d’applications pour démarrer plusieurs applications (reliées entre elles ou non) en passant par un formulaire afin de configurer différentes options. Par exemple, le nom des services, les ressources à allouer, l’authentification, la localisation des sources, etc…

Installer Footloose

Vous pouvez utiliser une machine Linux ou un hôte MacOS pour ce didacticiel. ARM et Raspberry Pi ne sont pas pris en charge.  

Suivez les instructions sur le site officiel: https://github.com/weaveworks/footloose  

Créer une config :

cluster:
  name: cluster
  privateKey: cluster-key
machines:
- count: 1
  spec:
    image: quay.io/footloose/centos7:0.3.0
    name: os%d
    privileged: true
    portMappings:
    - containerPort: 22
    - containerPort: 8443
      hostPort: 8443
    - containerPort: 53
      hostPort: 53
    - containerPort: 443
      hostPort: 443
    - containerPort: 80
      hostPort: 80
    volumes:
    - type: volume
      destination: /var/lib/docker

footloose.yaml

Notez les ports supplémentaires 8443 et 53 utilisés par OpenShift Origin, puis 80 et 443 sont destinés à exposer vos projets.  Si vous avez déjà des services liés à 80/443, vous pouvez commenter ces lignes.  

Démarrez le conteneur CentOS :

footloose create

Démarrer un root shell :

footloose ssh root@os0

Configurer Docker

  • Installer et démarrer Docker mise à jour  :
yum check-update ; \
  curl -fsSL https://get.docker.com/ | sh
  • Ajouter un registre non-sécurisé

Trouvez le sous-réseau:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 92550  bytes 135424927 (129.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 43641  bytes 2425139 (2.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • Créer /etc/docker/daemon.json
mkdir -p /etc/docker

cat > /etc/docker/daemon.json <<EOF
{
   "insecure-registries": [
     "172.17.0.0/16"
   ]
}
EOF
  • Maintenant enable/start Docker
systemctl daemon-reload \
 && systemctl enable docker \
 && systemctl start docker

Installer OpenShift

Chopez les outils OpenShift

wget https://github.com/openshift/origin/releases/download/v3.11.0/openshift-origin-client-tools-v3.11.0-0cbc58b-linux-64bit.tar.gz \
  && tar -xvf openshift-origin-client-tools-v3.11.0-0cbc58b-linux-64bit.tar.gz \
  && rm -rf openshift-origin-client-tools-v3.11.0-0cbc58b-linux-64bit.tar.gz \
  && mv open* openshift
  • Rendre oc disponible via PATH
export PATH=$PATH:`pwd`/openshift
  • Authentification sur le hub Docker
docker login
  • Installer OpenShift
oc cluster up --skip-registry-check=true

Cela prendra quelques minutes.

Si vous voyez une erreur/un délai d'expiration sur run_self_hosted.go: 181] En attendant que le kube-apiserver soit prêt, exécutez à nouveau la commande jusqu'à ce qu'elle passe.  

Si cela ne fonctionne toujours pas comme pour moi, j'obtient ce message sur le terminal de mon Mac dans la VM CentOS Footloose :

Getting a Docker client ...
Checking if image openshift/origin-control-plane:v3.11 is available ...
Pulling image openshift/origin-control-plane:v3.11
Pulled 1/5 layers, 21% complete
Pulled 2/5 layers, 45% complete
Pulled 2/5 layers, 53% complete
Pulled 2/5 layers, 61% complete
Pulled 3/5 layers, 76% complete
Pulled 3/5 layers, 85% complete
Pulled 3/5 layers, 90% complete
Pulled 4/5 layers, 93% complete
Pulled 4/5 layers, 99% complete
Pulled 5/5 layers, 100% complete
Extracting
Image pull complete
Pulling image openshift/origin-cli:v3.11
Image pull complete
Pulling image openshift/origin-node:v3.11
Pulled 5/6 layers, 84% complete
Pulled 5/6 layers, 92% complete
Pulled 5/6 layers, 97% complete
Pulled 6/6 layers, 100% complete
Extracting
Image pull complete
Creating shared mount directory on the remote host ...
Determining server IP ...
Checking if OpenShift is already running ...
Checking for supported Docker version (=>1.22) ...
Checking if required ports are available ...
Checking if OpenShift client is configured properly ...
Checking if image openshift/origin-control-plane:v3.11 is available ...
Starting OpenShift using openshift/origin-control-plane:v3.11 ...
I0111 16:27:39.942105     412 config.go:40] Running "create-master-config"
I0111 16:27:43.148996     412 config.go:46] Running "create-node-config"
I0111 16:27:44.578463     412 flags.go:30] Running "create-kubelet-flags"
I0111 16:27:45.241205     412 run_kubelet.go:49] Running "start-kubelet"
I0111 16:27:45.487324     412 run_self_hosted.go:181] Waiting for the kube-apiserver to be ready ...
I0111 16:29:04.439770     412 interface.go:26] Installing "kube-proxy" ...
I0111 16:29:04.439833     412 interface.go:26] Installing "kube-dns" ...
I0111 16:29:04.439864     412 interface.go:26] Installing "openshift-service-cert-signer-operator" ...
I0111 16:29:04.439889     412 interface.go:26] Installing "openshift-apiserver" ...
I0111 16:29:04.439939     412 apply_template.go:81] Installing "kube-proxy"
I0111 16:29:04.440007     412 apply_template.go:81] Installing "openshift-apiserver"
I0111 16:29:04.440187     412 apply_template.go:81] Installing "kube-dns"
I0111 16:29:04.440388     412 apply_template.go:81] Installing "openshift-service-cert-signer-operator"
I0111 16:29:08.752025     412 interface.go:41] Finished installing "kube-proxy" "kube-dns" "openshift-service-cert-signer-operator" "openshift-apiserver"
Error: timed out waiting for the condition

"Error : timed out waiting for the condition" - voici comment résoudre le problème.

Sur Github la solution est trouvée en appliquant cette modification :

Configure the Docker daemon with an insecure registry parameter of 172.30.0.0/16
or edit the /etc/docker/daemon.json file and add the following:{    "insecure-registries": [ "172.30.0.0/16" ] }
After editing the config, reload systemd and restart the Docker daemon.
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Soit en français, éditer le fichier /etc/docker/daemon.json vu tout à l'heure, et au lieu de :

   "172.17.0.0/16"

Ajoutez plutôt :

 "172.30.0.0/16"

Puis redémarrer Docker.

Une fois terminé, vous verrez :

Login to server ...
Creating initial project "myproject" ...

Server Information ...
OpenShift server started.

The server is accessible via web console at:
    https://127.0.0.1:8443

You are logged in as:
    User:     developer
    Password: <any value>

To login as administrator:
    oc login -u system:admin

Si docker ps :

[root@os0 ~]# docker ps
CONTAINER ID        IMAGE                                          COMMAND                  CREATED             STATUS              PORTS               NAMES
b3b41ddb0a15        openshift/origin-hyperkube                     "hyperkube kube-sche…"   2 minutes ago       Up 2 minutes                            k8s_scheduler_kube-scheduler-localhost_kube-system_4ef8f106363f096042914d25f095c7f5_2
25953cd85cba        openshift/origin-hyperkube                     "hyperkube kube-cont…"   3 minutes ago       Up 3 minutes                            k8s_controllers_kube-controller-manager-localhost_kube-system_9d8ef32be31e9a6172eb7ab20224f293_3
60fba272b485        openshift/origin-service-serving-cert-signer   "service-serving-cer…"   5 minutes ago       Up 5 minutes                            k8s_operator_openshift-service-cert-signer-operator-6d477f986b-jh5zl_openshift-core-operators_a13c5355-348f-11ea-8ebc-0242f2ba64cf_2
2847a872d436        openshift/origin-hypershift                    "hypershift openshif…"   6 minutes ago       Up 5 minutes                            k8s_c_openshift-controller-manager-m7lzd_openshift-controller-manager_2b551c5c-3492-11ea-96b4-0242f2ba64cf_1
62d6e7a03854        openshift/origin-hypershift                    "hypershift experime…"   6 minutes ago       Up 5 minutes                            k8s_operator_openshift-web-console-operator-664b974ff5-n72vz_openshift-core-operators_37e7992c-3492-11ea-96b4-0242f2ba64cf_1
13b045796f81        openshift/origin-docker-registry               "/bin/sh -c '/usr/bi…"   19 hours ago        Up 19 hours                             k8s_registry_docker-registry-1-9dxql_default_45a12835-3492-11ea-96b4-0242f2ba64cf_0
d8b08806f503        be30b6cce5fa                                   "/usr/bin/origin-web…"   19 hours ago        Up 19 hours                             k8s_webconsole_webconsole-8496965cf8-c8qdg_openshift-web-console_675c23e0-3492-11ea-96b4-0242f2ba64cf_0
e2838f46994e        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_webconsole-8496965cf8-c8qdg_openshift-web-console_675c23e0-3492-11ea-96b4-0242f2ba64cf_0
c66e1cba73fb        openshift/origin-haproxy-router                "/usr/bin/openshift-…"   19 hours ago        Up 19 hours                             k8s_router_router-1-nq4jm_default_425e7513-3492-11ea-96b4-0242f2ba64cf_0
76ce0bb11664        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_docker-registry-1-9dxql_default_45a12835-3492-11ea-96b4-0242f2ba64cf_0
c36e55b2e29b        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_router-1-nq4jm_default_425e7513-3492-11ea-96b4-0242f2ba64cf_0
9f801747c522        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_openshift-web-console-operator-664b974ff5-n72vz_openshift-core-operators_37e7992c-3492-11ea-96b4-0242f2ba64cf_0
ea69cbe90cd4        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_openshift-controller-manager-m7lzd_openshift-controller-manager_2b551c5c-3492-11ea-96b4-0242f2ba64cf_0
d7be7d977db8        openshift/origin-control-plane                 "openshift start net…"   19 hours ago        Up 19 hours                             k8s_kube-dns_kube-dns-bvrhs_kube-dns_a14b1137-348f-11ea-8ebc-0242f2ba64cf_1
a0cf3571910b        openshift/origin-hypershift                    "hypershift openshif…"   19 hours ago        Up 19 hours                             k8s_apiserver_openshift-apiserver-rbvcn_openshift-apiserver_a152308e-348f-11ea-8ebc-0242f2ba64cf_1
cc4b59c0d0e1        47dadf9d43b6                                   "service-serving-cer…"   19 hours ago        Up 19 hours                             k8s_service-serving-cert-signer-controller_service-serving-cert-signer-668c45d5f-ksk7k_openshift-service-cert-signer_1cfecdbf-3490-11ea-8ebc-0242f2ba64cf_1
f18449730d6c        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_openshift-service-cert-signer-operator-6d477f986b-jh5zl_openshift-core-operators_a13c5355-348f-11ea-8ebc-0242f2ba64cf_1
944cfc78057e        openshift/origin-control-plane                 "openshift start net…"   19 hours ago        Up 19 hours                             k8s_kube-proxy_kube-proxy-pzcft_kube-proxy_a145ac27-348f-11ea-8ebc-0242f2ba64cf_1
fe80d4f25359        47dadf9d43b6                                   "service-serving-cer…"   19 hours ago        Up 19 hours                             k8s_apiservice-cabundle-injector-controller_apiservice-cabundle-injector-8ffbbb6dc-86qc6_openshift-service-cert-signer_1e4b4396-3490-11ea-8ebc-0242f2ba64cf_1
bceaa2ebbb28        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_service-serving-cert-signer-668c45d5f-ksk7k_openshift-service-cert-signer_1cfecdbf-3490-11ea-8ebc-0242f2ba64cf_1
80f2dcfc3c22        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_kube-dns-bvrhs_kube-dns_a14b1137-348f-11ea-8ebc-0242f2ba64cf_1
f613158cb93a        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_openshift-apiserver-rbvcn_openshift-apiserver_a152308e-348f-11ea-8ebc-0242f2ba64cf_1
3c6d5cc20d7f        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_apiservice-cabundle-injector-8ffbbb6dc-86qc6_openshift-service-cert-signer_1e4b4396-3490-11ea-8ebc-0242f2ba64cf_1
2ef6385a7a42        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_kube-proxy-pzcft_kube-proxy_a145ac27-348f-11ea-8ebc-0242f2ba64cf_1
d901e42f4dd7        openshift/origin-control-plane                 "/bin/bash -c '#!/bi…"   19 hours ago        Up 19 hours                             k8s_etcd_master-etcd-localhost_kube-system_ba9cb7def03e8999d29d4865e7f5f36d_1
6a7718df851f        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_kube-scheduler-localhost_kube-system_4ef8f106363f096042914d25f095c7f5_1
b0ff3d0d89d7        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_kube-controller-manager-localhost_kube-system_9d8ef32be31e9a6172eb7ab20224f293_1
e79bcce794b4        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_master-etcd-localhost_kube-system_ba9cb7def03e8999d29d4865e7f5f36d_1
5f130f40975a        openshift/origin-pod:v3.11                     "/usr/bin/pod"           19 hours ago        Up 19 hours                             k8s_POD_master-api-localhost_kube-system_8cda1a8c2c68f3ba79679f97a0b11d4f_1
2a6926abd5e5        openshift/origin-node:v3.11                    "hyperkube kubelet -…"   19 hours ago        Up 19 hours                             origin

Vous pouvez maintenant installer l'outil oc sur votre machine hôte ou accéder au portail via https://127.0.0.1:8443 sur l'hôte.

Testez votre cluster OpenShift

Installons une image Docker compatible K8s évidemment. OpenShift est en fait une distribution de Kubernetes, donc avec quelques tests et ajustements, tout devrait fonctionner presque immédiatement.  

Démarrez un projet :

[root@os0 ~]# oc new-project my-project
Now using project "my-project" on server "https://127.0.0.1:8443".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app centos/ruby-25-centos7~https://github.com/sclorg/ruby-ex.git

to build a new example application in Ruby.

Vous pouvez essayer de créer un nouveau projet, en exécutant      

oc new-project <nomprojet> 

Pour créer un nouveau projet appelé myproject, exécutez la commande:  

oc new-project myproject  

Vous devriez voir un résultat similaire à:

Now using project "myproject" on server "https://openshift:6443".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app django-psql-example

to build a new example application in Python. Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

Basculez vers la console et connectez-vous à la console Web OpenShift en utilisant les mêmes informations d'identification que vous avez utilisées ci-dessus.

Cliquez sur monprojet et vous devriez alors être sur la page Présentation du projet. Sélectionnez la perspective Développeur pour le projet au lieu de la perspective Administrateur dans le menu de gauche. Si nécessaire, cliquez sur l'icône du menu hamburger en haut à gauche de la console Web pour afficher le menu de gauche.

Étant donné que le projet est actuellement vide, aucune charge de travail ne doit être trouvée et différentes options vous seront présentées pour déployer une application.

Dans la vue Topologie, sélectionnez Image conteneur. Cela devrait présenter la possibilité de déployer une image en effectuant une recherche de l'image sur un registre d'images.

Pour cet exemple, l'image d'application que nous allons déployer est hébergée sur le Docker Hub Registry.  Dans le champ Nom de l'image, entrez:  openshiftkatacoda/blog-django-py  Appuyez sur Entrée ou cliquez sur la loupe à droite du champ. Cela devrait déclencher une requête pour extraire les détails de l'image du Docker Hub Registry, y compris des informations sur la dernière mise à jour de l'image, la taille de l'image et le nombre de couches.

À partir du nom de l'image, les champs Nom de l'application et Nom du déploiement seront automatiquement remplis.  Le nom de déploiement est utilisé dans OpenShift pour identifier les ressources créées lors du déploiement de l'application. Cela inclura le nom de service interne utilisé par d'autres applications du même projet pour communiquer avec lui, ainsi que le nom d'hôte par défaut de l'application lorsqu'elle est exposée en externe au cluster via une route.  Le champ Nom de l'application est utilisé pour regrouper plusieurs déploiements sous le même nom dans le cadre d'une application globale.  

Dans cet exemple, laissez les deux champs comme valeurs par défaut. Pour votre propre application, vous pourriez envisager de les remplacer par quelque chose de plus approprié.  Au bas de cette page, vous verrez que la case à cocher pour créer un itinéraire vers l'application est cochée. Cela indique que l'application recevra automatiquement une URL publique pour y accéder. Si vous ne souhaitez pas que le déploiement soit accessible en dehors du cluster, ou s'il ne s'agit pas d'un service Web, vous devez désélectionner l'option.  Lorsque vous êtes prêt, cliquez en bas de la page sur Créer. Cela vous ramènera à la vue Topologie, mais cette fois, vous verrez une représentation du déploiement, plutôt que les options de déploiement d'une application.

Pour explorer et obtenir plus de détails sur le déploiement, cliquez au milieu de l'anneau. Cela entraînera un panneau coulissant du côté droit donnant accès à la fois à un aperçu:

Dans la vue d'ensemble du déploiement, vous pouvez ajuster le nombre de répliques ou de pods en cliquant sur les flèches haut et bas à droite de l'anneau.  L'URL publique pour accéder à l'application se trouve sous Ressources.  Si vous fermez le panneau, vous pouvez également accéder à l'application via son URL publique, en cliquant sur l'icône de raccourci URL sur la visualisation du déploiement.

Et voilà !