deployer un blog wordpress sur k3s (Rancher Labs) & Raspberry Pi3
Le Linux Magazine N°227 de juin 2019 nous offre un article super sympa sur k3s la mini version de kubernetes dévelopée par Rancher Labs pour l'edge computing et l'IoT. Une belle découverte, Merci David
Contrairement à son article qui aborde des expériences en mode savant fou, je me contenterai d'un quickstart: déployer un blog wordpress sur k3s et mon bon vieux raspberry Pi3 "one". The only one.
Télécharger et Installer Raspbian Buster Lite sur votre Raspberry Pi3
Insérer la carte flash sur votre distib préférée et copier l'image Raspbian.
$ sudo dd if=2019-06-20-raspbian-buster-lite.img of=/dev/mmcblk0 bs=4M conv=fsync
Démarrer le Raspberry et activer SSH
Interfacing Options
P2 SSH
Would you like the SSH server to be enabled? Yes
Ajouter les options kernel suivantes à la fin de la ligne du fichier /boot/cmdline.txt
Mettre à jour la Raspbian puis redémarrer le Pi
pi@one:~ $ sudo apt upgrade
pi@one:~ $ sudo reboot
Installer k3s
Copier le lien du binaire k3s-armhf (pour Pi3) à partir du projet https://github.com/rancher/k3s/releases/
Créer un service
[Unit]
Description=K3S by Rancher
Documentation=https://k3s.io
After=network.target
[Service]
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s server
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TaskMax=infinity
[Install]
WantedBy=multi-user.target
EOF
Démarrer le service k3s-server
pi@one:~ $ sudo enable k3s.service
pi@one:~ $ sudo systemctl start k3s.service
Afin d'éviter de taper "ks3 kubectl" à chaque fois, créer un alias ks comme ci-dessous et reconnectez vous
Lister le node , c'est un master. Il existe pas mal d'info sur la toile pour créer des workers
NAME STATUS ROLES AGE VERSION
one Ready master 15d v1.14.3-k3s.1
Lister les namespaces et les pods livré avec k3s, on voit que Rancher Labs à choisi Traefik comme Ingress controller un dévellopement français et ça c'est plutôt cool.
NAME STATUS AGE
default Active 15d
kube-node-lease Active 15d
kube-public Active 15d
kube-system Active 15d
pi@one:~ $ ks get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-695688789-4jxpd 1/1 Running 9 15d
helm-install-traefik-4swmb 0/1 Completed 0 15d
svclb-traefik-9hqgl 2/2 Running 18 15d
traefik-56688c4464-tqlkv 1/1 Running 12 15d
Créer un namespace wordpress et le définir par defaut
pi@one:~ $ ks config set-context --current --namespace=wordpress
Context "default" modified.
pi@one:~ $ ks config view | grep namespace:
namespace: wordpress
Configurer le Stockage persistent local
chez moi j'utilise un disque 2.5" USB et LVM. Créer les répertoires pour apache et mysql
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/datavg-lv_datas 30G 29G 29G 3% /datas
pi@one:~ $ sudo mkdir -p /datas/k3s/wordpress/apache
pi@one:~ $ sudo mkdir -p /datas/k3s/wordpress/mysql
pi@one:~ $ sudo chmod -R 777 /datas/k3s/wordpress
Configurer une storage Class Locale
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
Créer le volume persistent pour mysql
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-wordpress-mysql
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /datas/k3s/wordpress/mysql
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- one
EOF
Créer le Persistent Volume Claim pour mysql
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-wordpress-mysql
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-storage
resources:
requests:
storage: 10Gi
EOF
Générer le mot de passe root Mysql en base64 et inséré le dans dans le secret mysql-pass
UGFzc3cwcmQ=
apiVersion: v1
kind: Secret
metadata:
name: mysql-pass
type: Opaque
data:
password: UGFzc3cwcmQ=
EOF
pi@one:~ $ ks get secret
NAME TYPE DATA AGE
default-token-95qqg kubernetes.io/service-account-token 3 99m
mysql-pass Opaque 1 59m
Déployer Mysql
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: x11tete11x/arm32v7-mysql
imagePullPolicy: Always
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: pv-wordpress-mysql
mountPath: /var/lib/mysql
volumes:
- name: pv-wordpress-mysql
persistentVolumeClaim:
claimName: pvc-wordpress-mysql
EOF
NAME READY STATUS RESTARTS AGE
wordpress-mysql-648857594c-dttpn 1/1 Running 0 17s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress-mysql ClusterIP None <none> 3306/TCP 38s
Créer le volume persistent pour apache
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-wordpress-apache
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /datas/k3s/wordpress/apache
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- one
EOF
Créer le Persistent Volume Claim pour apache
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-wordpress-apache
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-storage
resources:
requests:
storage: 10Gi
EOF
Déployer WordPress
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: arm32v7/wordpress
imagePullPolicy: Always
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: pv-wordpress-apache
mountPath: /var/www/html
volumes:
- name: pv-wordpress-apache
persistentVolumeClaim:
claimName: pvc-wordpress-apache
EOF
NAME READY STATUS RESTARTS AGE
wordpress-5d7d9db9c7-s9f6p 1/1 Running 0 50s
wordpress-mysql-648857594c-dttpn 1/1 Running 0 10m
pi@one:~ $ ks get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress ClusterIP 10.43.204.39 <none> 80/TCP 61s
wordpress-mysql ClusterIP None <none> 3306/TCP 10m
Configurer une Ingress pour wordpress. la règle host signifie que le header http devra être wordpress.local
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: wordpress
spec:
rules:
- host: wordpress.local
http:
paths:
- backend:
serviceName: wordpress
servicePort: 80
EOF
Récupérer le nodeport qu'utilise traefik ci-dessous 30667
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 16d
traefik LoadBalancer 10.43.70.162 192.168.1.1 80:30667/TCP,443:32682/TCP 16d
Modifier votre fichier /etc/hosts ou votre DNS afin que wordpress.local pointe vers l'IP du Raspberry (one)
192.168.1.1 one wordpress.local
Connectez vous sur http://wordpress.local:30667 et lancer l'installer WordPress
Et voila une Raspbian, un Master kubernetes et un blog wordpress pour 350Mo de RAM.
Plus d'information et d'inspiration améliorer votre respiration et faites de la méditation :
Linux Magazine N°227
Kubernetes Local StorageClass
Deploying WordPress and MySQL with Persistent Volumes