Un monde d'octets

Aller au contenu | Aller au menu | Aller à la recherche

vendredi, février 12 2021

Linux : screen black ... debukking

Parfois, il peut arriver que l'écran soit noir ... Plusieurs problèmes peuvent en être la cause :

  • mauvaise résolution
  • mauvaise fréquence
  • écran désactivé matériellement
  • écran desactivé logiciellement

Pour ca il faut donc avoir un maximum d'information permettant de trouver la cause (comme dans toute root cause analysis)

Lister les écrans hardware

sudo lshw -c display

Extended Display Identification Data

sudo apt install read-edid
sudo get-edid | parse-edid

Informations X11

xrandr --prop

via /sys et Edid

find /sys/devices -name "edid"
cat /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1/edid | edid-decode

Solution

Rien de tout ce que je voyais ne m'expliquait l'écran noir. Surtout que le problème se posait au démarrage de X11 et pas avant. La solution, au final, fut de rajouter "nomodeset" aux options de grub, puis faire un updage-grub. Après tout ça, retour à la normal de l'affichage.

vendredi, janvier 29 2021

Docker : one line killer for all exited container

docker ps --filter status=exited | awk '{if (NR>1) print $1}' | xargs docker rm

mercredi, janvier 27 2021

Microk8s : completer son installation

Pour faire de son microk8s une plateforme de test fonctionnelle, il nous manque quelques éléments :

  • un controleur ingress

Ingress

Traeffik est proposé en installation automatique dans microk8s

microk8S enable traeffik

A partir de la, nous pouvons accéder à notre traeffik en nodeport 8080.

Il restera encore a voir :

  • un système de monitoring/observability
  • un controleur mesh

mercredi, janvier 20 2021

Observality : what tools for what ?

J'ai trouvé sur un site ce graphe qui permet de synthétiser quel outil pour quoi, quand on veut observer les métriques systèmes via la ligne de commande :

Observability Tools

Très pratique !

DevSecOps : more terms and concepts

Suite à une proposition de poste full remote, il m'a été donné un fiche de poste utilisant des termes informatiques de métiers que je ne connaissais pas de prime abord mais dont il me suffisait de lier le terme aux outils fréquents connus :

CSP / Cloud Service Provider

Ce qui m'a débouté ici, c'est l'acronyme CSP, alors qu'il s'agit s'implement d'un acronyme anglais : Cloud Service Provider ...

Quand on parle de CSP Capabilities, c'est donc savoir ce que founit le Cloud Provider comme possibités, niveau de qualité, fonctionnalités (cf : https://www.waferwire.com/blog/how-...)

Datalake

Il s'agit d'un stockage de donnée a structure floue (il peut s'agir de données structurées comme non structurées). Des datalake connus sont Hadoop, Amazon S3, Azure Data Lake (cf https://en.wikipedia.org/wiki/Data_...)

mardi, janvier 19 2021

X11 : manipuler les fenetres avec la ligne de commande

juste un pense bete, la commande wmctrl est un bijou d'ingéniosité montrant encore une fois une petite supériorité de linux sur windows ;)

lundi, janvier 18 2021

Dmesg : permission denied

Depuis un certain temps déjà, il n'est plus possible d'afficher les logs "kernel ring buffer", la commande dmesg nous crachant un joli permission denied.

Pour oublier ce problème :

sudo sysctl kernel.dmesg_restrict=0

Pour oublier définitivement ce problème :

sudo vi /etc/sysctl.d/10-local.conf

et ajouter la ligne :

kernel.dmesg_restrict = 0

bien sur cela à des implications fortes, car maintenant tous les utilisateurs on accès à dmesg, ce qui dans certains cas peut révéler des informations sensibles... Mais pour vous chez vous dans votre cave, alors la ... ça vaaaaaa

vendredi, janvier 15 2021

Kubernetes : more basics ...

Deployment :

mettre en ligne un pod (servant un container) avec des modalités de réplication et d'affectation

DaemonSet :

mettre en ligne un container avec création automatique sur les noeuds (exemple: un agent de monitoring)

Stateful :

mettre en ligne un pod (comme avec deployment) mais en lui affectant une identité fixe (sticky identity)

mercredi, janvier 13 2021

Upnp : recherche de serveur sous linux

pour trouver les serveurs upnp disponibles via ssdp :

sudo apt install gupnp-tools
gssdp-discover -i wlan0 --timeout=3

jeudi, janvier 7 2021

JournalCtl : the quick way to check ssh auth fail

Pour chercher rapidement les échecs de connexion ssh sur les 30 derniers jours :

journalctl _SYSTEMD_UNIT=ssh.service --since "30 days ago" | grep "Fail"

sur certaines distributions l'unité systemd est nommée "sshd.service"

dimanche, janvier 3 2021

Linux, Terminal et longueur de ligne

Pour s'affranchir du retour automatique à la ligne, vous pouvez faire dans votre shell :

setterm -linewrap off

A partir de maintenant, vos lignes n'ont plus de césure automatique, mais cela entraîne une perte de données si le terminal ne propose pas le défilement horizontal (ce qui peut-être le cas suite a une mauvaise détection de largeur induite par un empilement de type : ssh, screen, byobu, curses ...)

En attendant c'est bien pratique pour afficher des fichiers larges sans avoir un pâté illisible à l'écran, car souvent les informations les plus pertinentes sont en début de lignes (oh, simple humains que nous sommes !!)

Bien sur pour revenir en arrière :

setterm -linewrap on

Vim : Changer le charset

Petit pense bête

set encoding=latin1
:w

et voila, votre fichier est maintenant enregistré avec un jeu de caractères latin1

samedi, décembre 26 2020

Python : faire un package

Pour faire un package python, il faut créer un fichier setup.py :

import setuptools

setuptools.setup(
    name="simplanimator", # Replace with your own username
    version="0.0.2",
    author="Me First Name Last Name",
    author_email="me@tlc.com",
    description="SimplAnimator, a class to animate graph based on mathplotlib",
    url="",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

Et nous mettons notre package dans un dossier "simplanimator" juste au même niveau que le "setup.py".

Nous pouvons ensuite installer le package avec :

sudo python3 setup.py install


ou pour une installation mono utilisateur :

python3 setup.py install --user

jeudi, décembre 24 2020

Kubernetes : kube-recon

Un petit tour de plus sur la détection de "mauvaises pratiques"

$ kubectl run kuberecon --tty -i --image octarinesec/kube-recon
If you don't see a command prompt, try pressing enter.
/ # ./kube-recon 

kuberecon procède à des tests divers :

  • état de la sécurité des accès à l'api kubernetes
  • ports ouverts sur les pods et tests de brute force avec nmap
  • test de protection de malware

recon sinifie bien-sur "reconnaissance", ce que ce script fait ;)

A l'issue de ce test sur mon architecture personnelle, j'ai mes level-up à faire :

  • Rbac policies
  • Network policies
  • Malware protection

Rbac et network poliices, je connais les principes, c'est plus un question d'en mettre en place, la ou malware protection c'est à voir tout court :)

jeudi, décembre 17 2020

Memcached : python script pour lister les clefs présentes

Un petit script pour lister les couple clef/valeurs présentes dans notre memcached en python, qui nécessitait une lib python non disponible dans pip ...

#!/usr/bin/env python3

''' 
  pip3 install 'git+git://github.com/dlrust/python-memcached-stats.git'
''' 
                                                                                                        
from memcached_stats import MemcachedStats
from pymemcache.client.base import Client

mem = MemcachedStats()
client = Client(server="localhost")

keys=[]

for key in mem.keys():
  if (not key in keys):
    result = client.get(key)
    print (key,"=>",result)
    keys.append(key)

mercredi, décembre 16 2020

Memcached : python et semaphores

client étant une instance memcached en python, il est possible d'utiliser des semaphores entre lecture/modification et écruture afin d'atomiser l'opération via une boucle dont on ne sort que si le cas d'entrée est bien le cas de sortie :

    while True:
        result, cas = client.gets('visitors')
        if result is None:
            result = 1
        else:
            result += 1
        if client.cas('visitors', result, cas):
            break

Memcached : lister les clefs présentes

$ telnet 127.0.0.1 11211

stats items

STAT items:4:number 1
STAT items:4:number_hot 0
STAT items:4:number_warm 0
STAT items:4:number_cold 1
STAT items:4:age_hot 0
STAT items:4:age_warm 0
STAT items:4:age 38
STAT items:4:mem_requested 164
STAT items:4:evicted 0
STAT items:4:evicted_nonzero 0
STAT items:4:evicted_time 0
STAT items:4:outofmemory 0
STAT items:4:tailrepairs 0
STAT items:4:reclaimed 0
STAT items:4:expired_unfetched 0
STAT items:4:evicted_unfetched 0
STAT items:4:evicted_active 0
STAT items:4:crawler_reclaimed 0
STAT items:4:crawler_items_checked 0
STAT items:4:lrutail_reflocked 0
STAT items:4:moves_to_cold 20
STAT items:4:moves_to_warm 0
STAT items:4:moves_within_lru 0
STAT items:4:direct_reclaims 0
STAT items:4:hits_to_hot 0
STAT items:4:hits_to_warm 0
STAT items:4:hits_to_cold 19
STAT items:4:hits_to_temp 0
END

stats cachedump 4 100

ITEM soma_key [97 b; 0 s]
END

Ca fonctionne aussi simplement que ca en telnet, mais on peut faire plus simple :

pip3 install memcached-search
memcached-search items

memcached-search est un outil d'interrogagtion en ligne de commande simple et utile pour vérifier ce qui est stocké.

lundi, novembre 23 2020

Python : pip et keyring

Il peut arriver lors d'installation via pip (ou pip3) que celui-ci freeze longuement au lancement de la commande.

Pip essaye en fait de contacter un keyring, et celui-ci est terriblement long à répondre. On peut le constater avec un pip3 -v install

$ pip3 install xxxx -v
[...]
Found index url https://pypi.org/simple
Getting credentials from keyring for https://pypi.org/simple

Il m'a fallu interrompre avec ctrl-c

Pour éviter ce problème, il faut indiquer à pip/pip3 d'utiliser un placebo en guise de backend pour les keyring :

export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring

Suite à cette commande, votre pip est beaucoup plus rapide !

lundi, novembre 16 2020

Kubernetes : useful commands

Retrieve the capacity of pods by nodes :

kubectl get nodes -o json | jq '.items[].status.capacity.pods'

Retrieve IPs of all pods in all namespaces :

kubectl get pods -A -o json | jq '.items[].status.podIP'

vendredi, novembre 6 2020

Kubectl : aide en environnement massif

dans les environnement important de clusters, ou beaucoup de contextes et namespaces existent, il est utile de se détacher des "-n namespace" en switchant aisément de namespace actif.

historiquement, cela se fait par la commande "kubectl config" :

kubectl config set-context --current --namespace=gitlab-managed-apps

une fois fait, toutes nos commandes sont lancées pour le namespace gitlab-managed-apps, ce qui nous simplifie la tache.

la cerise sur le gâteau viendra comme toujours de krew, et de ses plugins, en l'occurrence, ceux-ci :

kubectl krew install ctx
kubectl krew install ns

jeudi, novembre 5 2020

Docker and humans

La césure des lignes dans un docker ps m'ennuie toujours. J'aime donc reformater l'output :

docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Names}}\t{{.Ports}}"

Bien sur il existe d'autres formats de sorties (comme json) permettant de "verticaliser" l'output :

docker container ls --format='{{json .}}' | jq

Ce qui est bien pratique, car ca nous donne tous les champs utilisables dans format "table". Bien sur, tout cela est moins puissant que la syntaxe go, mais c'est une autre histoire...

mardi, octobre 27 2020

Kubectl and go-template

Go est un langage assez central dans l'architecturede kubernetes, mais ce qui nous intéresse ici c'est l'output go-templace de kubectl. Celui-ci nous permet de forger notre output, et de faire des choses tricky.

A titre d'exemple, voici un script basique permettant de generer des yamls de tous les pods présent sur votre cluster"

kubectl get pods -A -o go-template='{{range .items}}microk8s kubectl get pod {{.metadata.name}} -n {{.metadata.namespace}} -o yaml >> {{.metadata.namespace}}.{{.metadata.name}}.yaml {{"\n"}}{{end}}' | sh

Bien sur ceci est basé sur une pratique courante de scripting, la construction de commandes à la volée avec un pipe en bout.

En tout cas, voici une façon amusante d'extraire les yaml de kubernetes !

samedi, octobre 24 2020

gitlab.ci: premier résultats probants

Pour m'autoformer sur gitlab et la partie CI, j'ai remonté mon microk8s, installé gitlab en docker, connecté mon gitlab a kubernetes et ajouté un runner en contexte kubernetes.

Il ne restait plus qu'a prendre un projet docker, et a essayer de le builder avec upload dans ma registry privée.

Les tests avec les images docker et docker-dind m'ont posé plus de problèmes qu'autre chose. Je me suis finalement rabbatu sur buildah.



Dans les problèmes rencontrés, il y'a eu le tagging, ou faute d'expérience, il a fallu que je comprenne quoi mettre dans les valeurs pour que ma registry ne rejette pas pour défaut de manifest.

Il a aussi fallu ajouter l'option de tls a la commande buildah pour qu'il n'échoue pas en se plaignant que ma registry ne supporte par https.

voici le .gitlab-ci.yml pour la partie build :

stages:
  - build

build and push to gitlab registry:

  stage: build
  image: fcadeillan/buildah

  variables:
    BUILDAH_FORMAT: "docker"
    IMAGE_NAME: "db2http"
    IMAGE_FQN: "192.168.1.30:5000/db2http"

  before_script:

  script:
    - buildah bud -t ${IMAGE_FQN}:${CI_COMMIT_REF_SLUG} .
    - buildah push --tls-verify=false docker://${IMAGE_FQN}:${CI_COMMIT_REF_SLUG}

Enfin voila une bonne chose de faite. Prochaine fois, on attaquera le déploiement sur kubernetes pour faire bonne figure !

lundi, octobre 19 2020

Lier Gitlab à un cluster Kubernetes

Extraire les informations de votre cluster kubernetes :

Kubernetes cluster name :

MonClusterAMoi

Environment scope :

"*"

API URL :

kubectl cluster-info | grep 'Kubernetes master' | awk '/http/ {print $NF}'

CA Certificate :

export token=`kubectl get secrets | grep service-account-token | awk '{print $1}'`
kubectl get secret $token -o jsonpath="{['data']['ca\.crt']}" | base64 --decode

Service Token :

kubectl describe secrets default-token-vs2rk

RBAC-enabled-cluster : oui

GitLab-managed cluster : oui

A savoir

Si vous rencontrez l'erreur "Requests to the local network are not allowed" :

Dans la partie administration :

  • Clickez "settings" -> "network" -> "Outbound requests"
  • Cochez "Allow requests to the local network from web hooks and services"

samedi, octobre 17 2020

High load, waiting state, debugging

Pour ceux qui l'ignorent, une charge excessive a souvent comme raison des processus en attente de ressource. Un "top" indique un %cpu faible, mais un %wait qui peut dépasser les 40%, et c'est rarement bon ...

Exemple de check avec mpstat :

mpstat 1

Linux 5.8.0-28-generic (teknomage) 	13/12/2020 	_x86_64_	(4 CPU)

00:10:16     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
00:10:17     all    5,68    0,00    1,08    0,54    0,00    2,70    0,00    0,00    0,00   90,00
00:10:18     all    5,43    0,00    2,45    0,27    0,00    2,17    0,00    0,00    0,00   89,67
00:10:19     all    6,49    0,00    3,24    0,00    0,00    1,89    0,00    0,00    0,00   88,38
00:10:20     all    6,20    0,00    1,89    0,00    0,00    2,96    0,00    0,00    0,00   88,95
00:10:21     all    6,09    0,00    1,94    1,94    0,00    1,39    0,00    0,00    0,00   88,64
00:10:22     all   10,78    0,00    4,58    0,00    0,00    2,70    0,00    0,00    0,00   81,94

On voir bien ici les valeurs qui nous intéressent, pour commencer à identifier le noeud dans le système :

  • usr : temps passé dans du code utilisateur
  • sys ; temps passé dans les appel systèmes
  • iowait : temps passé à attendre du event hardware (disque dur, réseau, ...)
  • idle : temps passé à ne rien faire, si c'est haut, votre pc ne travaille pas :)

Si la majeure partie du cpu est consommée par usr+sys, alors votre système souffre d'une surcharge cpu.

Si la majeure partie du cpu est consommée par du iowait, alors votre système attends des ressources lentes, et dans ce cas ...

avec PS

la commande PS nous indique des flags pour chaque processus courant. le flag D indique que le process est en attente d'une ressource.

watch -n 1 "(ps aux | awk '\$8 ~ /D/  { print \$0 }')"

avec iostat, si l'attente est purement de type "block"

nous pouvons voir ainsi si nous avons un disque dur qui est très sollicité et devient donc un bottleneck (vitesse cpu > vitesse dd)

iostat -x 1 3

Tracer les block dump

nous pouvons voir aussi quels process font des opération de manipulation de block

echo 1 > /proc/sys/vm/block_dump
tail -f /var/log/syslog

ne pas oublier de repasser à 0 une fois le debugging fait, car c'est couteux en espace disque ;)

echo 0 > /proc/sys/vm/block_dump

Microk8S et personnal registry docker

Pour faire ses propres travaux (que ce soit autoformation, ou tests de containers/cluster), microk8s est globalement fonctionnel. Mais si on veut faire son propre container docker, il faut l'uploader sur une registry.

Il eiste plusieurs scénarios

docker hub

Si vous avez un compte docker hub, vous pouvez avoir vos cointainer hébergés la bas, mais il vous faudra passer par des secrets pour l'authentification sur le hub pour rappatrier vos paquets

section à rajouter ???

Utilisation d'une registry locale

vous pouvez heberger votre propre registry, pour cela lancez le container docker-registry comme suit :

docker run -d --restart always \
  --cpus 0.1 \
  -p 5000:5000 \
  --name registry \
  -v [path-to-your-permanent-registry]:/var/lib/registry \
  registry:2

l'utilisation d'un volume monter vous permet de conserver vos images en cas de destruction/recréation de container.

A partir de la vous pouvez tagger vos images "localhost:5000/container" puis les pusher sur la registry.

Mais k8s ne pourra pas les puller, car par défaut il veut des registry en https.

Il faut l'aiguiller, pour cela éditer le fichier /var/snap/microk8s/current/args/containerd-template.toml

dans la section des registry :

    [plugins.cri.registry]
      [plugins.cri.registry.mirrors]
        [plugins.cri.registry.mirrors."docker.io"]
          endpoint = ["https://registry-1.docker.io"]
        [plugins.cri.registry.mirrors."localhost:32000"]
          endpoint = ["http://localhost:32000"]

ajoutez :

        [plugins.cri.registry.mirrors."local.insecure-registry.io"]
          endpoint = ["http://192.168.1.30:5000"]

Vous pouvez maintenant utiliser local.insecure-registry.io/container comme image pour vos pods !

mardi, octobre 13 2020

Docker Registry

Pour mes travaux perso, publier sur mon docker hub perso est plutot contraignant. Il était largement temps de faire une simplissime docker registry pour ces besoins ponctuels.

Lancer la registry avec le container docker fourni par le docker hub est trivial :

docker run --restart always \
           -p 5000:5000 \
           --name registry \
           registry:2

Puis pour uploader une image docker ubuntu sur notre registry :

docker pull ubuntu
docker tag ubuntu localhost:5000/ubuntu
docker push localhost:5000/ubuntu

samedi, octobre 10 2020

Grafana : Dashboard of interrest

Node Exporter Full with Node Name (10242)

mardi, octobre 6 2020

Ecran: on/off/wtf ?

pour eteindre son ecran a distance, il suffit de faire :

xset -display :0.0 dpms force off

mais pour savoir si il est éteint ou allumé, on fait :

xset -display :0.0 -q

Keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000002
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    on     02: Scroll Lock: off
    03: Compose:     off    04: Kana:        off    05: Sleep:       off
    06: Suspend:     off    07: Mute:        off    08: Misc:        off
    09: Mail:        off    10: Charging:    off    11: Shift Lock:  off
    12: Group 2:     off    13: Mouse Keys:  off
  auto repeat delay:  500    repeat rate:  33
  auto repeating keys:  00ffffffdffffbbf
                        fadfffefffedffff
                        9fffffffffffffff
                        fff7ffffffffffff
  bell percent:  50    bell pitch:  400    bell duration:  100
Pointer Control:
  acceleration:  2/1    threshold:  4
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  0    cycle:  0
Colors:
  default colormap:  0x20    BlackPixel:  0x0    WhitePixel:  0xffffff
Font Path:
  /usr/share/fonts/X11/misc,/usr/share/fonts/X11/Type1,built-ins
DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Enabled
  Monitor is Off

jeudi, octobre 1 2020

Elasticsearch : monitoring

Voici un container permettant de monitorer notre cluster elasticsearch : elasticsearch-hq

mardi, septembre 29 2020

Docker Security

Docker n'est pas aussi étanche qu'on pourrait le penser, du moins loin d'être exempt de bugs ... cf le CVE-2019-5736. Mais en soit, ce problème d'étanchéité du container n'a d'importance qu'en cas de corruption du container.

Il faut donc ce soucier de la sécurité du container que l'on déploit, car c'est par lui que l'attache sera déclenchée.

En plus du contrôle des ports ouvert, des services actifs, des cve existant pour les logiciels installé, il existe des outils qui peuvent simplifier et surtout compléter ces audits :

Anchore & Clair est l'un de ceux-ci

Voici un article intéressant à ce sujet :

https://towardsdatascience.com/anal...

Outils autour de kubernetes

https://www.abhishek-tiwari.com/10-...

au cas ou cette page disparaisse, elle parlait de : __Kube-ops-view, Cabin, Kubectx, kube-shell, Telepresence, Weave Scope, PowerfulSeal, Marmot, Ark, Sysdig. __ De très bon outils permettant de visualiser son cluster, de l'auditer, ou simplement d'en simplifier l'administration.

Dans la catégorie addons a kubectl, bien sur, n'oublions pas krew et ses modules comme tree, debug, trace, node-shell, capture, graph, ...

mercredi, septembre 16 2020

Docker : erreur de crédentials

Après avoir joué avec gcloud, pour travaux kubernetes, il peut arriver qu'on ai le probleme suivant :

docker.credentials.errors.InitializationError: docker-credential-gcloud not installed or not available in PATH

En fait, il s'agit d'un reliquat de configuration présant dans .docker/config.json :

{
  "credHelpers": {
    "gcr.io": "gcloud", 
    "us.gcr.io": "gcloud", 
    "eu.gcr.io": "gcloud", 
    "asia.gcr.io": "gcloud", 
    "staging-k8s.gcr.io": "gcloud", 
    "marketplace.gcr.io": "gcloud"
  }
}

Il suffit donc de supprimer les références à gcloud, ou plus simplement détruire le fichier si il n'y a rien d'autre.

mercredi, septembre 9 2020

Principaux éléments à intégrer dans un cahier des charges

Extrait de https://cahiersdescharges.com/exemp...

Contexte

Expliquez en quelques mots le fondement de la demande. Il ne suffit pas simplement d’exprimer l’aspect technique d’un projet, une vue générale aidera les prestataires à comprendre mieux et plus rapidement les les tenants et aboutissants du projet.

Exemple : Pour un site web, ne décrivez pas seulement vos attentes, parlez également des ressorts qui vous ont poussé à opérer un changement de site web ou encore la typologie de vos clients par exemple.

Objectif

Expliquez de façon complète les différents objectifs du projet. Quelle seront les finalités du projet pour votre entreprise.

Exemple : Pour un site web, le objectifs commerciaux et/ou marketing du site doivent être clairement rédigés. Ces objectifs ont une influence majeur sur les différents travaux qui seront mis en place pour réaliser le projet.

Périmètre

Expliquez de façon succincte les limites de votre projet. Vous répondrez ainsi aux questions : À qui s’adresse-t-il ? À quel moment ?

Exemple : Le projet implique-t-il tous les partenaires ? Tous les clients sont-ils concernés ? Tous les payss ? ...

Fonctionnement

Décrivez de manière exhaustive les différents leviers du projet à travers une description fonctionnelle qui consiste à expliquer les besoins en terme de fonctionnalités.

Exemple : Expliquez en quelques mots ce que doit faire votre site web : récupérer des contacts, vendre des produits, proposer une inscription à la newsletter…

Ressources

Listez l’ensemble des ressources disponibles ainsi que les contraintes pour la réalisation du projet.

Exemple : Le nombre d’employés qui s’occupera de la gestion du site web ou encore leur faible connaissance des outils informatique.

Budget

Établir un budget est important pour aiguiller les prestataires et éviter une déconvenue lors de la réception des premiers devis.

Exemple : Donnez le budget total d’un projet de création de site avec la rédaction, l’hébergement, le webdesign et le développement.

Délais

Autre variable déterminante, le délais de réalisation et la date de livraison. Elle permet au prestataire d’évaluer la durée de travail et de s’organiser. Pour vous, le délais indiqué sur le cahier des charges sert de preuve.

Exemple : la durée inscrite sur le CDC peut être inscrite sur le devis et la facture du prestataire.

samedi, septembre 5 2020

Ctop

ctop permet devoir l'utilisation des containers en cpu, mem, etc.

il permet de ce faire de vérifier que vos limites positionnées sont respectées.

il peut s'installer avec apt, mais aussi tourner dans un container docker pour ne nécessiter aucune installation locale :

sudo apt install ctop
docker run --rm -ti \
  --name=ctop \
  --volume /var/run/docker.sock:/var/run/docker.sock:ro \
  quay.io/vektorlab/ctop:latest

A vous de choisir !

vendredi, septembre 4 2020

Generating traffic with Locust

Il existe beaucoup de load tester pour les applis web : ab, k6, BlazeMeter...

Mais une à vraiment tester : Locust

pip3 install locust

Nous créons un stript python (non complet) qui contient une classe définissant les test à a effectuer :

from locust import HttpUser, between, task

class WebsiteUser(HttpUser):
    wait_time = between(5, 15)
    
    def on_start(self):
        self.client.post("/login", {
            "username": "test_user",
            "password": ""
        })
    
    @task
    def index(self):
        self.client.get("/")
        self.client.get("/static/assets.js")
        
    @task
    def about(self):
        self.client.get("/about/")

puis nous lancons locust avec ce script :

locust -f locustfile.py

Il y'a beaucoup plus à savoir bien sur, mais pour cela, RTFM

jeudi, septembre 3 2020

Chaos Engineering

Ce post est la pour ce rappeler de ce paradigme permettant une nouvelle approche de la résilience d'un système, introduite par Netflix en 2015.

Pour faire simple :

Si ce n’est pas cassé, ne le répare pas.
    Bert Lance, Nation’s Business, 1977

est complétée par l'approche :

Si ce n’est pas encore cassé, essaye plus fort.
    Philosophie Chaos Engineering, 2015

Liens d’intérêts

samedi, août 22 2020

Kubernetes : un ide gratuit pour manager son cluster K8S

sudo snap install kontena-lens --classic

mercredi, juillet 29 2020

GKE Node Pool Affinity

Si vous avez plusieurs poois sur votre cluster gke afin de segmenter vos usages pour en assurer un niveau de qualité, voici l'affinité à utiliser :

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: cloud.google.com/gke-nodepool
            operator: In
            values: 
            - pool-worker-nlp
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

Python unbuffered output

Il est parfois nécessaire d'avoir une sortie non bufferisée, si nous voulons des output temps réél par exemple.

Pour cela, on peut utiliser une classe qui permettra d'obtenir un objet surchargé :

#!/usr/bin/env python3 

import sys, os

class Unbuffered(object):
    def __init__(self, stream):
        self.stream = stream

    def write(self, data):
        self.stream.write(data)
        self.stream.flush()

    def writelines(self, datas):
        self.stream.writelines(datas)
        self.stream.flush()

    def __getattr__(self, attr):
        return getattr(self.stream, attr)

sys.stdout = Unbuffered(sys.stdout)

Awk, Split, Two many open files

En splitant un log au format yaml, pour couper au "---" séparateur, j'ai atteint le "too many open files".

La solution est simple. Fermer le flux après y avoir écrit :

awk '{if (/---/) cpt++; 
          print $0 >> cpt+".txt"; 
          close (cpt+".txt")}'

mercredi, juillet 22 2020

Gcloud et Toolbox !

Il n'est pas évident en contexte kubernetisé de faire beaucoup de choses classiques d'audit (tcpdump, nmap ...) car les containers sont généralement des boîtes réduites à l'essentiel.

A ça ajoutons que nous sommes en contexte gloud, et la c'est carrément le node qui tourne sur une distribution réduite. Mais heureusement google nous propose sa toolbox

toolbox

Cette toobox est un container debian qui tourne comme si il était l'hôte maître (chapeau pour l'idée et la réalisation), ce qui vous permet d'installe temporairement ce que vous voulez sans polluer votre noeud. ^ Il vous suffit de faire les classiques "apt get update" et "apt get install" et à vous la puissances d'un dieu ... dans un mouchoir de poche !

Backup by plink

Ce script python fait une copie d'un dossier dans le meme filesystem au moyens de plink ;

#!/usr/bin/env python3

import os, sys

try:
  source=sys.argv[1]
  dest=sys.argv[2]
except:
  pass


try: os.mkdir(dest)
except: pass

for root, dirs, files in os.walk(source, topdown=True):

  for name in dirs:
    subpath="/".join(os.path.join(root,name).split("/")[1:])
    try: os.mkdir(os.path.join(dest,subpath))
    except: pass
      

  for name in files:
    subpath="/".join(os.path.join(root,name).split("/")[1:])
    os.link(os.path.join(source,subpath),os.path.join(dest,subpath))

Pourquoi ce script ? c'est parce que maintenant, si vous modifiez la copie, l'original lui ne bougera pas ! ce qui avec un script copiant un serveur distant avec rsync, nous donnera une parfaite copie différentielle entre les deux backups !

lundi, juillet 13 2020

Ramens

Le ration d'humidité pour les ramens est genéralement <= 33%

Soit :

  • 300gr de farine
  • 90gr d'eau
  • 3 gr de sel
  • 3 gr de baked baking soda

Après avoir incorporé l'eau petit à petit en égrainant avec les mains, ce pour bien faire absorber l'eau équitablement, laisser la pâte reposer 30 minutes dans un sac zip, sous forme de bloc.

Une fois reposée, laminer votre pâte jusqu'à 2 ou 1mm, puis tailler en ramens et fariner. Laisser reposer un peu avant cuisson.

jeudi, juillet 9 2020

Kubernetes : Supprimer une protection sur un pv, pour le détruire dans la foulée

Certains PV sont marqués comme "intuables", leur yaml contenant :

  finalizers:
  - kubernetes.io/pv-protection

Rien qu'un bon coup de hache (jq modifie le json à la volée en vue d'une application direct changeant la donne) ne puisse régler :

for f in `kubectl get pv,pvc | grep <volume> | awk '{print $1}' ` 
do 
  kubectl get $f -o=json | jq '.metadata.finalizers = null' | kubectl apply -f - 
  kubectl delete $f ; 
done

Monitoring kubernetes avec prom/graf

Tout est la :

https://github.com/coreos/kube-prom...

Création disques persistants google

Création d'un volume

gcloud compute disks create nextcloud-app-static-pv --zone europe-west1-b --size=500Gb 
gcloud compute disks create nextcloud-db-static-pv --zone europe-west1-b --size=10Gb 

Attacher une instance

gcloud compute instances attach-disk  gke-integration-default-pool-ea501286-hpww --disk nextcloud-app-static-pv 

Initialisation du disque

gcloud compute ssh [INSTANCE_NAME]
lsblk
mkfs.ext4 /dev/sdXXXX

mardi, juillet 7 2020

Kubernetes : Liveness Probe et Hostname

Certains serveur web, comme nextcloud, paramètrent internement des noms d'hôte valide. Quand on crée un liveness probe dans kube, celui-ci contacte http://ip:port/ et peut donc se faire rejeter alors que le site est fonctionnel.

Voici comment spécifier des options d'entêtes dans un liveness probe http de kubernetes :

ports:
- containerPort: 80
readinessProbe:
  httpGet:
    path: /login
    port: 80
    httpHeaders:
    - name: Host
      value:  "localhost"
  initialDelaySeconds: 30
  periodSeconds: 30
livenessProbe:
  httpGet:
    path: /login
    port: 80
    httpHeaders:
    - name: Host
      value:  "localhost"
  initialDelaySeconds: 15
  periodSeconds: 30  

A savoir aussi, qu'ingress prends le premier pod marqué ready comme liveness check pour gke. Si vous modifiez ces test sur pod après création d'une route ingress, il faut détruire et recréer la route ingress.

vendredi, juillet 3 2020

Nextcloud et Kubernetes

Pour utiliser occ dans une version containerisée de nextcloud, il faut passer en tant que www-data.

Seulement voila, la ou docker peut faire un run-as avec l'option "-u" (qu'occ nous rapelle gentilement), pour kube c'est une autre histoire.

En fait, la seule solution c'est d'utiliser sudo, sauf que bien sur, le container est fourni sans sudo, avec un compte www-data que l 'on ne peut pas utiliser avec su, car le compte est désactivé.

Bien sur, il est désactivé comme souvent, avec l'utilisation simple d'un shell ne permettant pas l'interaction.

Pour pouvoir utiliser occ, il faut simplement contourner ce shell comme suit :

su www-data -s /bin/bash

et voila nous pouvons utiliser occ en ligne de commande pour administrer notre nextcloud

php occ app:list 

ce qui permettra de scripter les installation de plugins, et donc de les automatiser avec kubernetes !

Et pour rigoler, en one-shot :

kubectl exec nextcloud-app-686d746495-nzj8s -- bash  -c 'su www-data -s /bin/bash -c "php occ app:list"'

jeudi, juillet 2 2020

Kubernetes : Patcher un container

Il arrive que certains PV soient protégés contre la destruction. Pour le vérifier :

kubectl describe pvc PVC_NAME | grep Finalizers

on voit alors :

Finalizers:    [kubernetes.io/pvc-protection]
kubectl patch pvc PVC_NAME -p '{"metadata":{"finalizers": []}}' --type=merge

le pv est maintenant destructible. D'ailleurs, si vous n'arriviez pas à le detruire, et que la commande de destruction restait en plan, celle-ci prendra effet dès le patch appliqué.

- page 3 de 12 -