<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SDS on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/sds/</link><description>Recent content in SDS on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 24 Oct 2017 11:30:52 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/sds/index.xml" rel="self" type="application/rss+xml"/><item><title>[Tutoriel] XWiki, ma premier appli Statefull sur Kubernetes</title><link>https://blog.zwindler.fr/2017/10/24/tutoriel-xwiki-ma-premier-appli-stateful-sur-kubernetes/</link><pubDate>Tue, 24 Oct 2017 11:30:52 +0000</pubDate><guid>https://blog.zwindler.fr/2017/10/24/tutoriel-xwiki-ma-premier-appli-stateful-sur-kubernetes/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/10/xwiki_kubernetes.webp" alt="Featured image of post [Tutoriel] XWiki, ma premier appli Statefull sur Kubernetes" /&gt;&lt;h2 id="pourquoi-déployer-xwiki-sur-kubernetes-"&gt;Pourquoi déployer XWiki sur Kubernetes ?
&lt;/h2&gt;&lt;p&gt;Vous le savez surement maintenant vu le nombre d’article que j’ai écrit sur le sujet, j’aime bien &lt;a class="link" href="http://www.xwiki.org/xwiki/bin/view/Main/WebHome" target="_blank" rel="noopener"
&gt;XWiki&lt;/a&gt;. C’est un super projet mené par des gens passionnés, réactifs et surtout, c’est cet outil qui a permis à mon entreprise d’adopter ENFIN le wiki comme outil de documentation, que ce soit pour documenter les procédures, mais aussi documenter entièrement les concepts de l’outil que nous développons.&lt;/p&gt;
&lt;p&gt;D’un outil quasi-confidentiel utilisés par quelques admins peu motivés (sous Mediawiki), nous sommes donc progressivement passés à un outil utilisé par toutes les équipes, du dev. au support en passant par les ergo. et les CPs, utilisés par plusieurs entités internes et même accepté comme document contractuel par nos prestataires. J’ai d’ailleurs &lt;a class="link" href="https://blog.zwindler.fr/2016/12/12/migration-mediawiki-vers-xwiki/" &gt;documenté la migration sur cet article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/12/mediawiki_to_xwiki_logo.png"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Mais j’aime aussi XWiki car c’est selon moi l’exemple parfait d’une appli 2 ou 3 tiers relativement simple pour explorer l’écosystème Docker (construction des images, les problématiques réseau et stockage, …). Je joue régulièrement avec &lt;a class="link" href="https://hub.docker.com/r/zwindler/xwiki-tomcat8/" target="_blank" rel="noopener"
&gt;ma propre image sur le Dockerhub&lt;/a&gt; pour explorer un peu plus cet écosystème riche (c’est rien de le dire).&lt;/p&gt;
&lt;p&gt;Quelle meilleure application donc pour réellement tester mon tout nouveau cluster Kubernetes (je ne compte pas nginx ou helloworld) ?&lt;/p&gt;
&lt;h2 id="kubernetes-"&gt;Kubernetes ?
&lt;/h2&gt;&lt;p&gt;Pour ceux qui ont besoin d’un rappel sur Kubernetes ou des premiers concepts et/ou comment l’installer, &lt;a class="link" href="https://blog.zwindler.fr/2017/06/07/installer-cluster-kubernetes-vm-centos/" &gt;je vous invite à lire/relire mon article précédent sur le sujet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A noter également (j’ai pas mal communiqué là-dessus sur les réseaux sociaux), la Linux Foundation, qui gère également la Cloud Native Computing Foundation (et qui elle-même gère Kubernetes), a mis à disposition gratuitement un cour en ligne de type MOOC sur edX. Vous pouvez même vous « certifier » à la fin si vous réussissez le QCM, moyennant 100$.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/kubernetes_edx.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A l’issue de ces lectures, vous devriez donc avoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la connaissance des différents concepts de Kubernetes&lt;/li&gt;
&lt;li&gt;un cluster Kubernetes opérationnel (une ou plusieurs machines, ou simplement un minikube en local)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce sont les prérequis pour la suite de cet article, même si je vais essayer de détailler tout ce qui va suivre.&lt;/p&gt;
&lt;h2 id="plan-de-bataille"&gt;Plan de bataille
&lt;/h2&gt;&lt;p&gt;Je ne vais pas vous le cacher, si on veut tout faire soit même, ce n’est pas « trivial ». Mais en décomposant toutes les étapes, vous allez voir que c’est logique.&lt;/p&gt;
&lt;p&gt;Pour faire tourner mon image Docker &lt;a class="link" href="https://hub.docker.com/r/zwindler/xwiki-tomcat8/" target="_blank" rel="noopener"
&gt;zwindler/xwiki-tomcat8&lt;/a&gt;, j’ai besoin, sur mon cluster Kubernetes, des choses suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;Deployment&lt;/strong&gt; qui exécute la partie PostgreSQL. Ce &lt;strong&gt;Deployment&lt;/strong&gt; contiendra :
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;ReplicaSet&lt;/strong&gt; avec une seule instance car on ne souhaite avoir qu’un seul &lt;strong&gt;Pod&lt;/strong&gt; avec l’image postgresql officielle&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;Service&lt;/strong&gt; de type &lt;strong&gt;ClusterIP&lt;/strong&gt; pour lui permettre de communiquer avec le XWiki mais pas avec le monde extérieur&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;PersistantVolumeClaim&lt;/strong&gt; et son &lt;strong&gt;PersistentVolume&lt;/strong&gt; associé pour stocker les données de la base&lt;/li&gt;
&lt;li&gt;Des &lt;strong&gt;Secrets&lt;/strong&gt; pour permet de configurer les mots de passes de postgres et de l’utilisateur XWiki&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;Deployment&lt;/strong&gt; qui exécute la partie XWiki. Ce &lt;strong&gt;Deployment&lt;/strong&gt; contiendra :
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;ReplicaSet&lt;/strong&gt; avec une seule instance car on ne fait tourner qu’un seul &lt;strong&gt;Pod&lt;/strong&gt; avec l’image zwindler/xwiki-tomcat8, car on n’utilise qu’un tomcat à la fois pour exécuter XWiki&lt;/li&gt;
&lt;li&gt;Un Service de type &lt;strong&gt;NodePort&lt;/strong&gt; (ou mieux si vous avez des LoadBalancers ou des Ingress à dispo.) qui permettra d’exposer le port interne au cluster Kubernetes vers le monde extérieur&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;PersistantVolumeClaim&lt;/strong&gt; avec le &lt;strong&gt;PersistentVolume&lt;/strong&gt; pour stocker les pièces jointes car mon image Docker utilise l’option filesystem_store pour éviter de surcharger la base pour les PJ&lt;/li&gt;
&lt;li&gt;et aussi le &lt;strong&gt;Secret&lt;/strong&gt; défini précédemment pour accéder à la BDD.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OK.&lt;/p&gt;
&lt;p&gt;Voir ça posé dans une liste comme ça, ça peut faire peur.&lt;/p&gt;
&lt;p&gt;Alors vous allez me dire : « c’est plus facile de lancer ton DockerCompose » (&lt;a class="link" href="https://blog.zwindler.fr/2016/09/15/installer-xwiki-8-2-1-avec-docker-compose-en-2-lignes-de-commandes/" &gt;car j’ai montré qu’avec DockerCompose on peut démarrer une instance XWiki en 2 ou 3 lignes de commandes&lt;/a&gt;). Mais au final, tout ce que j’ai écris ici peut être concaténé dans un seul et même fichier YAML et le résultat est aussi simple dans l’absolu.&lt;/p&gt;
&lt;h2 id="créer-les-secrets"&gt;Créer les Secrets
&lt;/h2&gt;&lt;p&gt;Clairement, c’est un des gros points forts par rapport à la solution plus simple avec juste Docker / DockerCompose : la gestion des Secrets (et des configurations, dans une moindre mesure).&lt;/p&gt;
&lt;p&gt;Ici, plutôt que d’avoir un mot de passe en clair dans mon fichier compose, le mot de passe est renseigné à part, soit via un fichier, soit via l’API. Et ces mots de passes ne pourront plus être consultés via la CLI, mais pourront être utilisés.&lt;/p&gt;
&lt;p&gt;Pour créer un secret dans Kubernetes en CLI, il existe plusieurs méthodes. Soit on utilise la CLI directement depuis le prompt ou depuis un fichier plat (qui va se charger d’encoder le secret en base64 et de générer le YAML pour nous), soit on décide de créer le YAML nous-même. Je vous met les deux méthodes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo -n &amp;#34;xwikidb&amp;#34; &amp;gt; ./POSTGRES_USER.txt
echo -n &amp;#34;xwikipwd&amp;#34; &amp;gt; ./POSTGRES_PASSWORD.txt
kubectl create secret generic postgresql-xwiki-user-password --from-file=POSTGRES_USER.txt --from-file=POSTGRES_PASSWORD.txt
secret &amp;#34;postgresql-xwiki-user-password&amp;#34; created
#ou
cat &amp;gt; postgresql_xwiki_user_password.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: Secret
metadata:
name: postgresql-xwiki-user-password
type: Opaque
data:
username: $(cat POSTGRES_USER.txt| base64 -w 0)
password: $(cat POSTGRES_PASSWORD.txt| base64 -w 0)
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Au final, pour un déploiement unitaire pour vous même, ça ne change pas grand-chose bien sûr. Vous avez renseigné en clair le mot de passe (ou en base64 mais c’est pareil) à un moment donné.&lt;/p&gt;
&lt;p&gt;Cependant, dans le cadre d’un gros projet avec des développeurs qui poussent du code régulièrement d’un côté et des admins qui gèrent de l’autre les utilisateurs et les mots de passes, on peut permettre aux développeurs consommer les mots de passe sans jamais avoir à les connaitre (&lt;strong&gt;et laisser trainer sur Gitlab, ou pire, Github !&lt;/strong&gt;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl describe secret postgresql-xwiki-user-password
Name: postgresql-xwiki-user-password
Namespace: default
Labels: &amp;lt;none&amp;gt;
Annotations:
Type: Opaque
Data
====
password: 8 bytes
username: 7 bytes
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="créer-les-persistent-volumes"&gt;Créer les Persistent Volumes
&lt;/h2&gt;&lt;p&gt;Dans mon infrastructure, j’ai déjà un cluster GlusterFS. GlusterFS étant un SDS, il est particulièrement indiqué comme stockage persistant dans le cadre d’un cluster Kubernetes (comme Ceph, Cinder, S3 ou autre). Ces types de méthodes de stockage peuvent facilement se piloter par API et sont hautement disponibles.&lt;/p&gt;
&lt;p&gt;Création de l’endpoint GlusterFS&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; gluster-endpoints.yaml &amp;lt;&amp;lt;EOF
apiVersion: v1
kind: Endpoints
metadata:
name: gluster-cluster
subsets:
- addresses:
- ip: 10.0.0.1
ports:
- port: 1
protocol: TCP
- addresses:
- ip: 10.0.0.2
ports:
- port: 1
protocol: TCP
EOF
kubectl apply -f gluster-endpoints.yaml
endpoints &amp;#34;gluster-cluster&amp;#34; created
kubectl get endpoints gluster-cluster
NAME ENDPOINTS AGE
gluster-cluster 10.0.0.1:1,10.0.0.2:1 39s
cat &amp;gt; gluster-service.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: Service
metadata:
name: gluster-cluster
spec:
ports:
- port: 1
EOF
kubectl apply -f gluster-service.yaml
service &amp;#34;gluster-cluster&amp;#34; created
kubectl get service gluster-cluster
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gluster-cluster 10.96.114.181 &amp;lt;none&amp;gt; 1/TCP 1m
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La partie GlusterFS a été configurée côté Kubernetes. On peut maintenant s’atteler à la création des PV et PVC associés. D’abord la base de données :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; gluster-pv-xwiki-pg.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-pv-xwiki-pg
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: gluster-cluster
path: /xwiki-pg-storage
readOnly: false
persistentVolumeReclaimPolicy: Retain
EOF
kubectl create -f gluster-pv-xwiki-pg.yaml
persistentvolume &amp;#34;gluster-pv-xwiki-pg&amp;#34; created
cat &amp;gt; gluster-pvc-xwiki-pg.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-pvc-xwiki-pg
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
EOF
kubectl create -f gluster-pvc-xwiki-pg.yaml
persistentvolumeclaim &amp;#34;gluster-pvc-xwiki-pg&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et maintenant l’application XWiki&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; gluster-pv-xwiki-app.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-pv-xwiki-app
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: gluster-cluster
path: /xwiki-app-storage
readOnly: false
persistentVolumeReclaimPolicy: Retain
EOF
kubectl create -f gluster-pv-xwiki-app.yaml
persistentvolume &amp;#34;gluster-pv-xwiki-app&amp;#34; created
cat &amp;gt; gluster-pvc-xwiki-app.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-pvc-xwiki-app
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
EOF
kubectl create -f gluster-pvc-xwiki-app.yaml
persistentvolumeclaim &amp;#34;gluster-pvc-xwiki-app&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cadre d’un test, vous pouvez vous contenter de faire simplement appel à un partage NFS ou même à du stockage local (si vous n’avez qu’un worker) mais sachez que vous n’aurez pas le même niveau de résilience ni les même facilités d’administration.&lt;/p&gt;
&lt;p&gt;Si vous voulez un exemple de &lt;strong&gt;PersistentVolume&lt;/strong&gt; utilisant NFS, je vous conseille cet article qui traite d’un sujet peu plus complexe mais qui donne les étapes de base pour mettre en place le PV et PVC : &lt;a class="link" href="http://blog.kubernetes.io/2017/02/postgresql-clusters-kubernetes-statefulsets.html" target="_blank" rel="noopener"
&gt;Créer un cluster PostgreSQL avec un seul et même Deployment en utilisant les StatefulSets&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="créer-le-deployment-postgresql"&gt;Créer le Deployment postgreSQL
&lt;/h2&gt;&lt;p&gt;Voilà, on a tous les prérequis ! Il ne reste plus qu’à créer dans un premier temps notre base de données, puis notre XWiki. Comme indiqué au début, le &lt;strong&gt;Deployment&lt;/strong&gt; contiendra tous les éléments qu’on a créé plus tôt, dont les &lt;strong&gt;Secrets&lt;/strong&gt; et le &lt;strong&gt;Persistent Volume&lt;/strong&gt;. Il manquera aussi un &lt;strong&gt;Service&lt;/strong&gt;, que nous verrons plus tard.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; xwiki-pg.yaml &amp;lt;&amp;lt; EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: xwiki-pg
labels:
app: xwiki-pg
application: xwiki
spec:
replicas: 1
selector:
matchLabels:
app: xwiki-pg
application: xwiki
template:
metadata:
labels:
app: xwiki-pg
application: xwiki
name: xwiki-pg
spec:
containers:
- image: postgres:9.6
name: xwiki-pg
env:
- name: POSTGRES_DB
value: xwiki
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgresql-xwiki-user-password
key: username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgresql-xwiki-user-password
key: password
ports:
- containerPort: 5432
name: xwiki-pg
volumeMounts:
- name: xwiki-pg-storage
mountPath: /var/lib/postgresql/data/pgdata
volumes:
- name: xwiki-pg-storage
persistentVolumeClaim:
claimName: gluster-pvc-xwiki-pg
EOF
kubectl create -f xwiki-pg.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement, un &lt;strong&gt;Pod&lt;/strong&gt; devrait se créer et monter le disque Gluster, puis s’initialiser avec les variables d’environnement qu’on lui a donné.&lt;/p&gt;
&lt;p&gt;A partir de là, on ne peut cependant pas accéder à la base de données car on a pas encore créé le Service associé au &lt;strong&gt;Deployment&lt;/strong&gt;. Par défaut, on ne donne pas de type, c’est donc un &lt;strong&gt;ClusterIP&lt;/strong&gt;. Pour « savoir » vers quoi le Service doit rediriger, on a ajouté un &lt;strong&gt;Selector&lt;/strong&gt;, qui pointe sur le tag « app » avec la valeur « xwiki-pg » définie plus haut.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; xwiki-pg-svc.yaml &amp;lt;&amp;lt; EOF
apiVersion: v1
kind: Service
metadata:
name: xwiki-pg-svc
labels:
app: xwiki-pg
spec:
ports:
- port: 5432
protocol: TCP
selector:
app: xwiki-pg
EOF
kubectl create -f xwiki-pg-svc.yaml
service &amp;#34;xwiki-pg-svc&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="créer-le-deployment-xwiki"&gt;Créer le Deployment XWiki
&lt;/h2&gt;&lt;p&gt;Youhou ! Plus qu’un ! Ici pas de grosses différences, le principe est le même. On doit créer un &lt;strong&gt;Deployment&lt;/strong&gt; puis un &lt;strong&gt;Service&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat xwiki-tomcat.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: xwiki-app
labels:
app: xwiki-app
application: xwiki
spec:
replicas: 1
selector:
matchLabels:
app: xwiki-app
application: xwiki
template:
metadata:
labels:
app: xwiki-app
application: xwiki
name: xwiki-app
spec:
containers:
- image: zwindler/xwiki-tomcat8
name: xwiki-app
env:
- name: POSTGRES_INSTANCE
value: xwiki-pg
- name: POSTGRES_DB
value: xwiki
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgresql-xwiki-user-password
key: username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgresql-xwiki-user-password
key: password
ports:
- containerPort: 8080
name: tomcat-port
volumeMounts:
- name: xwiki-app-storage
mountPath: /usr/local/tomcat/work/xwiki
volumes:
- name: xwiki-app-storage
persistentVolumeClaim:
claimName: gluster-pvc-xwiki-app
kubectl apply -f xwiki-tomcat.yaml
deployment &amp;#34;xwiki-app&amp;#34; created
cat xwiki-tomcat-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: xwiki-app-svc
labels:
apps: xwiki-app
spec:
type: NodePort
ports:
- port: 8080
targetPort: tomcat-port
protocol: TCP
selector:
app: xwiki-app
kubectl apply -f xwiki-tomcat-svc.yaml
service &amp;#34;xwiki-app-svc&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="est-ce-que-ça-marche-"&gt;Est-ce que ça marche ?
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gluster-cluster 10.96.114.181 &amp;lt;none&amp;gt; 1/TCP 4h
kubernetes 10.96.0.1 &amp;lt;none&amp;gt; 443/TCP 10d
xwiki-app-svc 10.103.218.140 &amp;lt;nodes&amp;gt; 8080:31484/TCP 4m
xwiki-pg-svc 10.108.219.88 &amp;lt;none&amp;gt; 5432/TCP 16m
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="tout-dun-coup"&gt;Tout d’un coup
&lt;/h2&gt;&lt;p&gt;Chose promise chose due ! Je vous ai dit en début d’article que vous pouviez tout déployer en quelques lignes de commandes. Dans l’absolu, vous pourriez tout déployer via un seul fichier. Je préfère découpler la partie stockage (qui va dépendre du stockage que vous allez utiliser) et la partie secret du reste pour les raisons que j’ai énoncé plus haut. Voilà ce que ça donne :&lt;/p&gt;
&lt;p&gt;On récupère les sources sur github&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git clone https://github.com/zwindler/docker-xwiki
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A adapter en fonction de votre contexte, à minima les adresses IP si vous avez du gluster, et carrément à réécrire si vous utilisez autre chose (NFS ou CEPH par exemple) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f docker-xwiki/kubernetes/gluster-endpoints-service.yaml
endpoints &amp;#34;gluster-cluster&amp;#34; created
service &amp;#34;gluster-cluster&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On injecte ensuite les secrets. A vous de les changer comme on a vu plus haut.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f docker-xwiki/kubernetes/postgresql_xwiki_user_password.yaml
secret &amp;#34;postgresql-xwiki-user-password&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et on fini par&amp;hellip; tout le reste ! Là normalement il n’y a rien à changer à part éventuellement des ports, les seules « variables » dans ce déploiement étant le stockage et les mots de passes (qu’on vient de gérer).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f docker-xwiki/kubernetes/xwiki-tomcat-pg-allinone.yaml
persistentvolume &amp;#34;gluster-pv-xwiki-pg&amp;#34; created
persistentvolume &amp;#34;gluster-pv-xwiki-app&amp;#34; created
deployment &amp;#34;xwiki-pg&amp;#34; created
persistentvolumeclaim &amp;#34;gluster-pvc-xwiki-pg&amp;#34; created
service &amp;#34;xwiki-pg-svc&amp;#34; created
deployment &amp;#34;xwiki-app&amp;#34; created
persistentvolumeclaim &amp;#34;gluster-pvc-xwiki-app&amp;#34; created
service &amp;#34;xwiki-app-svc&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="le-mot-de-la-fin"&gt;Le mot de la fin
&lt;/h2&gt;&lt;p&gt;Voilà, avec ce tutoriel vous avez maintenant une vue détaillée, étape par étape, de ce qu’il faut mettre en place pour gérer « proprement » le déploiement d’une application java + postgreSQL via Kubernetes.&lt;/p&gt;
&lt;p&gt;Clairement, c’est bien plus complexe qu’un simple Docker compose comme j’ai pu le présenté dans l’article sur ce sujet. Pour autant, il faut comparer ce qui est comparable, les deux installations n’ont rien à voir !&lt;/p&gt;
&lt;p&gt;D’un côté, vous avez une application déployée sur un nœud docker simple (éventuellement avec Swarm maintenant que les deux sont compatibles).&lt;/p&gt;
&lt;p&gt;De l’autre, vous avez une application qui est déployée sur un cluster de machines :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si l’une tombe en panne, la haute disponibilité est gérée : pas seulement sur le runtime, mais aussi sur le stockage !&lt;/li&gt;
&lt;li&gt;Vous pouvez segmenter votre cluster en namespaces, et donner des droits à certains namespace à certains utilisateurs avec un gestion fine des autorisations (RBAC)&lt;/li&gt;
&lt;li&gt;Vous disposez d’un dashboard et d’une API pour automatiser tous les déploiements (via Jenkins par exemple). Si vous voulez faire une mise à jour ou besoin de modifier un paramètre, c’est une simple commande ou un fichier de conf à appliquer à nouveau.&lt;/li&gt;
&lt;li&gt;Vous avez la possibilité de faire du scaling up/down, voire de l’autoscaling.&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La liste est longue ! En bref, vous passez d’une bidouille à la production.&lt;/p&gt;
&lt;h2 id="sources-additionnelles"&gt;Sources additionnelles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;docs.openshift.org/latest/install_config/storage_examples/gluster_example.html (lien mort, pas dispo sur Internet Archive)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://coderjourney.com/using-kubernetes-persistent-volumes/" target="_blank" rel="noopener"
&gt;coderjourney.com/using-kubernetes-persistent-volumes/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.xenonstack.com/blog/how-to-deploy-postgresql-on-kubernetes" target="_blank" rel="noopener"
&gt;www.xenonstack.com/blog/how-to-deploy-postgresql-on-kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>