vendredi, février 12 2021
Par pepin le vendredi, février 12 2021, 11:02 - Linux
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
Par pepin le vendredi, janvier 29 2021, 03:40 - Docker
docker ps --filter status=exited | awk '{if (NR>1) print $1}' | xargs docker rm
mercredi, janvier 27 2021
Par pepin le mercredi, janvier 27 2021, 14:07
Pour faire de son microk8s une plateforme de test fonctionnelle, il nous manque quelques éléments :
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
Par pepin le mercredi, janvier 20 2021, 13:45 - Linux
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 !
Par pepin le mercredi, janvier 20 2021, 05:31 - Cloud
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
Par pepin le mardi, janvier 19 2021, 21:39 - Linux
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
Par pepin le lundi, janvier 18 2021, 21:57 - Linux
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
Par pepin le vendredi, janvier 15 2021, 10:34 - Kubernetes
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
Par pepin le mercredi, janvier 13 2021, 09:46 - Linux
pour trouver les serveurs upnp disponibles via ssdp :
sudo apt install gupnp-tools
gssdp-discover -i wlan0 --timeout=3
jeudi, janvier 7 2021
Par pepin le jeudi, janvier 7 2021, 05:50 - Audit
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
Par pepin le dimanche, janvier 3 2021, 10:53 - Linux
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
Par pepin le dimanche, janvier 3 2021, 10:49 - Linux
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
Par pepin le samedi, décembre 26 2020, 19:35 - Python
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
Par pepin le jeudi, décembre 24 2020, 04:39 - Kubernetes
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
Par pepin le jeudi, décembre 17 2020, 10:45 - Python
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
Par pepin le mercredi, décembre 16 2020, 23:39 - Linux
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
Par pepin le mercredi, décembre 16 2020, 22:31 - Linux
$ 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
Par pepin le lundi, novembre 23 2020, 09:49 - Python
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
Par pepin le lundi, novembre 16 2020, 02:39 - Kubernetes
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
Par pepin le vendredi, novembre 6 2020, 09:14 - Kubernetes
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
Par pepin le jeudi, novembre 5 2020, 00:22 - Docker
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
Par pepin le mardi, octobre 27 2020, 09:50 - Kubernetes
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
Par pepin le samedi, octobre 24 2020, 04:50 - Git/Gitlab
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
Par pepin le lundi, octobre 19 2020, 21:07 - Git/Gitlab
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
Par pepin le samedi, octobre 17 2020, 18:26 - Linux
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
Par pepin le samedi, octobre 17 2020, 12:17 - Kubernetes
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
Par pepin le mardi, octobre 13 2020, 20:14 - Docker
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
Par pepin le samedi, octobre 10 2020, 22:51 - Ingénierie Système
Node Exporter Full with Node Name (10242)
mardi, octobre 6 2020
Par pepin le mardi, octobre 6 2020, 00:51 - Linux
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
Par pepin le jeudi, octobre 1 2020, 18:36 - Elasticsearch
Voici un container permettant de monitorer notre cluster elasticsearch :
elasticsearch-hq
mardi, septembre 29 2020
Par pepin le mardi, septembre 29 2020, 21:41 - Kubernetes
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...
Par pepin le mardi, septembre 29 2020, 21:17 - 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
Par pepin le mercredi, septembre 16 2020, 20:49 - Docker
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
Par pepin le mercredi, septembre 9 2020, 17:26 - Ingénierie Système
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
Par pepin le samedi, septembre 5 2020, 18:36 - Docker
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
Par pepin le vendredi, septembre 4 2020, 10:56 - Kubernetes
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
Par pepin le jeudi, septembre 3 2020, 18:13 - Kubernetes
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
Par pepin le samedi, août 22 2020, 08:41 - Kubernetes
sudo snap install kontena-lens --classic
mercredi, juillet 29 2020
Par pepin le mercredi, juillet 29 2020, 16:59 - Kubernetes
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
Par pepin le mercredi, juillet 29 2020, 14:09 - Python
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)
Par pepin le mercredi, juillet 29 2020, 12:04 - Linux
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
Par pepin le mercredi, juillet 22 2020, 11:02 - Cloud
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 !
Par pepin le mercredi, juillet 22 2020, 09:31 - Linux
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
Par pepin le lundi, juillet 13 2020, 23:27 - Cuisine
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
Par pepin le jeudi, juillet 9 2020, 18:35 - Kubernetes
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
Par pepin le jeudi, juillet 9 2020, 15:47 - Kubernetes
Par pepin le jeudi, juillet 9 2020, 15:24 - Cloud
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
Par pepin le mardi, juillet 7 2020, 15:10 - Kubernetes
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
Par pepin le vendredi, juillet 3 2020, 14:52 - 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
Par pepin le jeudi, juillet 2 2020, 23:46 - Kubernetes
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é.