unixadmin.free.fr Handy Unix Plumbing Tips and Tricks

10nov/19Off

Un blog sur Azure AKS en deux temps trois mouvements

Dans la zérie Fast & Dirty voila les deux commandes et demie permettant de créer un cluster kubernetes à 3 noeuds et un blog wordpress chez Azure, la différence avec K3S sur Raspberry étant le prix, car coté performance on est sensiblement égale... (petit mensonge façon avant-vente Microsoft), enfin bon, j'me comprends. :]

Intalle azure-cli et connecte-toi sur le portail.

sudo apt install azure-cli
az login -u poivrot@libertysurf.com -p ChevalBlanc

Partie Azure

az group create --name RG-KUBI --location francecentral

az aks create --resource-group RG-KUBI --name kubi-de-rouge --node-count 3 --enable-addons monitoring --generate-ssh-keys

sudo az aks install-cli

az aks get-credentials --resource-group RG-KUBI --name kubi-de-rouge

Petit check

kubectl get node
NAME                                STATUS   ROLES   AGE     VERSION
aks-agentpool-24540435-vmss000000   Ready    agent   3h44m   v1.13.12
aks-agentpool-24540435-vmss000001   Ready    agent   3h44m   v1.13.12
aks-agentpool-24540435-vmss000002   Ready    agent   3h44m   v1.13.12

Partie WordPress (by k8s)

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=YOUR_PASSWORD
EOF

curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml

cat <<EOF >>./kustomization.yaml
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml
EOF

kubectl apply -k ./

Récupère l'IP publique de wordpress et ajoute une entrée DNS pour ton blog

alias k=kubectl

k get pod
NAME                               READY   STATUS    RESTARTS   AGE
wordpress-56ccc548c9-wk44f         1/1     Running   0          3h5m
wordpress-mysql-85f5c9d5b5-l5llc   1/1     Running   0          3h5m

k get svc
NAME              TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
kubernetes        ClusterIP      10.0.0.1       <none>         443/TCP        3h57m
wordpress         LoadBalancer   10.0.107.125   40.1.1.160   80:30337/TCP   165m
wordpress-mysql   ClusterIP      None           <none>         3306/TCP       165m

az network dns record-set a add-record -g mc_rg-kubi_kubi-de-rouge_francecentral -z a1d641f62775422fb277.francecentral.aksapp.io  -n mylife -a 40.1.1.160

Installe ton blog via l'url http://mylife.a1d641f62775422fb277.francecentral.aksapp.io/

Pour HTTPS tu peux ajouter un ingress-controller NGINX

A+ !

Remplis sous: AZURE, KUBERNETES Commentaires
24juil/19Off

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.

$ unzip 2019-06-20-raspbian-buster-lite.img.zip
$ sudo dd if=2019-06-20-raspbian-buster-lite.img of=/dev/mmcblk0 bs=4M conv=fsync

Démarrer le Raspberry et activer SSH

pi@one:~ $ sudo raspi-config
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

cgroup_memory=1 cgroup_enable=memory

Mettre à jour la Raspbian puis redémarrer le Pi

pi@one:~ $ sudo apt update
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/

pi@one:~ $ sudo curl -L https://github.com/rancher/k3s/releases/download/v0.7.0/k3s-armhf > /usr/local/bin/k3s

Créer un service

pi@one:~ $ sudo cat >  /lib/systemd/system/k3s.service << EOF
[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 systemctl daemon-reload
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

pi@one:~ $ echo 'alias ks="sudo k3s kubectl"' >> .bashrc

Lister le node , c'est un master. Il existe pas mal d'info sur la toile pour créer des workers

pi@one:~ $ ks get nodes
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.

pi@one:~ $ ks get namespace
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 create namespace wordpress

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

pi@one:~ $ df -h /datas
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

pi@one:~ $ cat >  StorageClass.yaml << EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
pi@one:~ $ ks create -f storageClass.yaml

Créer le volume persistent pour mysql

pi@one:~ $  cat >  mysql-persistentVolume.yaml << EOF
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
pi@one:~ $ ks create -f mysql-persistentVolume.yaml

Créer le Persistent Volume Claim pour mysql

pi@one:~ $  cat >  mysql-persistentVolumeClaim.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-wordpress-mysql
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 10Gi
EOF
pi@one:~ $ ks create -f mysql-persistentVolumeClaim.yaml

Générer le mot de passe root Mysql en base64 et inséré le dans dans le secret mysql-pass

pi@one:~ $ echo -n 'Passw0rd' | base64
UGFzc3cwcmQ=
pi@one:~ $ cat >  mysql-pass.yaml  << EOF  
apiVersion: v1
kind: Secret
metadata:
  name: mysql-pass
type: Opaque
data:
  password: UGFzc3cwcmQ=
EOF
pi@one:~ $ ks create -f mysql-pass.yaml

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

pi@one:~ $ cat >  mysql-Deployment.yaml << EOF
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
pi@one:~ $ ks create -f  mysql-deployment.yaml
pi@one:~ $ ks get pod
NAME                               READY   STATUS    RESTARTS   AGE
wordpress-mysql-648857594c-dttpn   1/1     Running   0          17s
pi@one:~ $ ks get svc
NAME              TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
wordpress-mysql   ClusterIP   None         <none>        3306/TCP   38s

Créer le volume persistent pour apache

pi@one:~ $  cat >  apache-persistentVolume.yaml << EOF
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
pi@one:~ $ ks create -f apache-persistentVolume.yaml

Créer le Persistent Volume Claim pour apache

pi@one:~ $ cat >  apache-persistentVolume.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-wordpress-apache
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 10Gi
EOF
pi@one:~ $ ks create -f apache-persistentVolumeClaim.yaml

Déployer WordPress

pi@one:~ $ cat >  wordpress-deployment.yaml << EOF
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
pi@one:~ $ ks create -f  wordpress-deployment.yaml
pi@one:~ $ ks get pods
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

pi@one:~ $ cat >  wordpress-ingress.yaml << EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: wordpress
spec:
  rules:
  - host: wordpress.local
    http:
      paths:
      - backend:
          serviceName: wordpress
          servicePort: 80
EOF
pi@one:~ $ ks create -f ingress-wordpress.yaml

Récupérer le nodeport qu'utilise traefik ci-dessous 30667

pi@one:~ $ ks get svc  -n kube-system
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)

samir@think:~$ grep one /etc/hosts
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

Un big Up à Rancher Labs pour ce super boulot :) !!!

Remplis sous: KUBERNETES Commentaires