Un monde d'octets

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

jeudi, février 1 2024

Kubernetes Architecture in One Liners

𝐂𝐨𝐧𝐭𝐫𝐨𝐥 𝐏𝐥𝐚𝐧𝐞

  • 𝐀𝐏𝐈 𝐒𝐞𝐫𝐯𝐞𝐫: Brain exposed, takes orders and dispatches work.
  • 𝐒𝐜𝐡𝐞𝐝𝐮𝐥𝐞𝐫: Decides where container parties crash on worker nodes.
  • 𝐂𝐨𝐧𝐭𝐫𝐨𝐥𝐥𝐞𝐫 𝐌𝐚𝐧𝐚𝐠𝐞𝐫: Ensures the cluster state reflects your desires (like a control freak boss).
  • 𝐄𝐭𝐜𝐝: Cluster's memory palace, remembers everything important.

𝐖𝐨𝐫𝐤𝐞𝐫 𝐍𝐨𝐝𝐞𝐬

  • 𝐊𝐮𝐛𝐞𝐥𝐞𝐭: Manages containers on the node, the local foreman.
  • 𝐏𝐨𝐝𝐬: Groups of containers sharing resources, like work buddies.
  • 𝐂𝐨𝐧𝐭𝐚𝐢𝐧𝐞𝐫𝐬: The actual workers, isolated and focused on their tasks.

𝐁𝐨𝐧𝐮𝐬

  • 𝐃𝐚𝐭𝐚 𝐏𝐥𝐚𝐧𝐞: Where the work actually happens (worker nodes + pods + containers).
  • 𝐃𝐞𝐩𝐥𝐨𝐲𝐦𝐞𝐧𝐭: Blueprint for creating pods, like a recipe for your container crew.

samedi, janvier 20 2024

Récupérer le mot de passe admin d'argocd

kubectl -n default get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

mercredi, août 23 2023

Trier les events kubernetes par date

kubectl get events --sort-by='.metadata.creationTimestamp' -A

lundi, août 21 2023

Openshift et unsecure registries

oc get image.config.openshift.io/cluster -o yaml

apiVersion: config.openshift.io/v1
kind: Image
metadata:
  annotations:
    include.release.openshift.io/ibm-cloud-managed: "true"
    include.release.openshift.io/self-managed-high-availability: "true"
    include.release.openshift.io/single-node-developer: "true"
    release.openshift.io/create-only: "true"
  creationTimestamp: "..."
  generation: 3
  name: cluster
  ownerReferences:
  - apiVersion: config.openshift.io/v1
    kind: ClusterVersion
    name: version
    uid: ...
  resourceVersion: "..."
  uid: ...
spec:
  registrySources:
    insecureRegistries:
    - harbor.mydomain.tld
    - harbor.otherdomain.tld

Mêttre à jour et appliquer !

mercredi, août 16 2023

Openshift : Ajouter les metriques de kyverno a prometheus

Cela ce fait en injectant le yaml suivant :

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: prometheus-service-monitor
  name: prometheus-service-monitor
  namespace: infra-kyverno
spec:
  endpoints:
  - interval: 30s
    port: metrics
    scheme: http
  selector:
    matchLabel:
      app.kubernetes.io/part-of: kyverno

celu-ci, éant dans le même namespace que kyverno, précise les modalités de scrapping et le selecteur pourles pods conernés

jeudi, août 3 2023

Debugger son cluster Openshift

Pour extraire toute une cartographie de son cluster et de ses problèmes, nous pouvons utiliser un pod particulier qui s'invoque par une commande spécifique:

oc adm must-gather --image=registry.redhat.io/ocs4/ocs-must-gather-rhel8:v4.6 --dest-dir=.

Ces données peuvent être envoyées à RedHat pour debugging, ou utilisé localement.

vendredi, juin 23 2023

Kubernetes : Labels, play 101

Ajouter ou supprimer un label

kubectl label ns infra-pvalois --overwrite "save-by-velero=true"
kubectl label ns infra-pvalois --overwrite "save-by-velero-"

Chercher qui a, ou n'as pas un label

kubectl get ns --selector='save-by-velero=true'
kubectl get ns --selector='save-by-velero!=true'

lundi, juin 5 2023

Check des logins kube/oc vers les vmwares

oc logs -n openshift-cluster-storage-operator  $(oc get pods -A | grep detector-operator  | awk '{print $2}')

jeudi, mars 23 2023

Récuperer les infos d'unseal de token d'un vault

oc get secret vault-keys -n openshift-infra -o yaml | yq '.data.key1 | @base64d , .data.key2 | @base64d , .data.key3 | @base64d , .data.root_token | @base64d'

mardi, mars 21 2023

Openshift: Rapport backup velero

 
oc exec velero-664f99d459-98rxh -it -- ./velero backup describe backup --details

Fsck sur un pvc d'un Ceph RDB ...

Voici ce que ChatGPT répond :

Si votre PVC est utilisé sur un serveur Ceph RBD (RADOS Block Device), vous pouvez effectuer un fsck de la même manière que décrit précédemment en utilisant la commande rados -p <nom-du-pool> check <nom-de-l'objet>.

Voici les étapes à suivre pour effectuer un fsck sur un PVC utilisé sur un serveur Ceph RBD :

    Vérifiez que le pod associé au PVC est en état "Terminé" ou "En cours d'exécution".

    Utilisez la commande kubectl describe pv <nom-du-pvc> pour obtenir les informations du volume persistant.

    À partir des informations précédentes, récupérez le nom de l'image RBD correspondant au volume persistant.

    Utilisez la commande rbd ls <nom-du-pool> pour lister les images RBD disponibles dans le pool Ceph.

    Exécutez la commande rados -p <nom-du-pool> check <nom-de-l'objet> pour vérifier la cohérence du système de fichiers de l'image RBD correspondante. Remplacez <nom-du-pool> par le nom du pool Ceph utilisé par le PVC et <nom-de-l'objet> par le nom de l'image RBD correspondante.

    Attendez que la vérification soit terminée. Le temps nécessaire dépend de la taille de l'image et de l'état de cohérence du système de fichiers.

Notez que le fsck peut être un processus long et potentiellement destructeur pour les données, il est donc recommandé de sauvegarder les données importantes avant de l'exécuter. De plus, si vous détectez des erreurs lors de la vérification, il est recommandé de contacter l'administrateur de votre cluster Ceph pour obtenir de l'aide sur la façon de les 

Celle-la, parait intéressante, mais j'ai pas encore les clef pour la tester ....

mardi, mars 7 2023

Lancer tcpdump dans un noeud OC pour sniffer le traffic d'un pod

Trouvez sur quel noeud tourne votre pod :

oc get pod -o wide
oc debug -t --image registry.redhat.io/rhel8/support-tools:latest node/${NODE_NAME}

Trouver maintenant l'interface d'écoute et filtrez par ip ou port :

tcpdump -nn -s 0 -i ${INTERFACE} -w ${FILENAME} ${TCPDUMP_EXTRA_PARAMS}

jeudi, novembre 17 2022

Kubernetes : enable metrics-server

Do so :

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

dimanche, octobre 9 2022

Kubernetes et Jq

Tout programme qui exporte ses données en json à pour compagnon JQ, cet outil java, dont l'interêt n'est plus à démontrer

exemple : destruction de tous les pods d'un cluster


kubectl get pods -o json | jq  ".items[].metadata.name"   | sed 's,.*,kubectl delete pod &,' | sh

vendredi, septembre 30 2022

Simulateur de certification CKA CKAD CKAS

https://killer.sh/

dimanche, août 7 2022

Preparation CKA

Creation de pod

  
kubectl run  my-nginx --image=nginx --dry-run=client -o yaml > nginx.yaml
kubectl apply -f nginx.yaml

Exposition de pod

 
kubectl expose pod my-nginx --port=80 --name=my-frontend

Create (le createur de tout ...)

kubectl create deployment nginx --image=nginx/1.7.1 --port 80 --replicas 2 --dry-run -o yaml > deploy-nginx.yaml

C'est ce genre de réponses qu'il faudra utiliser plutot que d'écrire des yaml intégralement manuellement.

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)

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 :)

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

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 17 2020

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, 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, ...

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

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...

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é.

lundi, juin 29 2020

Kubernetes : Doc

Une documentation non officielle de kubernetes : Unofficial Kubernetes

On y trouve par exemple, une transposition des commandes docker vers leur équivalent kubernetes, ce qui est une bonne approche initiatrice (pour passer par exemple d'un contexte full docker, comme mesos/marathon, à un contexte kubernetes)

Kubernetes : récuperer son token d'authentification

Pour accéder au dashboard (et d'autres applications), il vous faut le token admin

Export de la config kubenertes

Vos identifiants et/ou votre token y sont :

kubectl config view 

Extraction par secret (kube self hosted ou microk8s)

Sans namespace :

microk8s kubectl get secret | awk '{if (/token/) system ("microk8s kubectl describe secret " $1)}'

Avec namespace :

kubectl -n kube-system get secret | awk '{if (/admin-user/) system ("kubectl -n kube-system describe secret " $1)}'

Vous pouvez aussi changer de namespace avant d'exécuter les commandes pour vous affranchir des "-n".

Google Kubernetes Engine

gcloud config config-helper --format=json | jq -r '.credential.access_token'

samedi, juin 27 2020

Kubernetes : namespaces

Travailler sur différents namespaces c'est pratique pour ne pas mélanger tous ces pods et services et autres. En plus des intérêts esthétiques, il s'agit aussi de rentre les containers un peu plus faciles à suivre quand nous en avons beaucoup.

Beaucoup de yaml liés a certains services utilisent naturellement des namespaces spécifiques (kube-system, monitoring, ...).



Nextcloud, un système collaboratif opensource s'installe avec un kustomization et cherche à se placer dans un namespace "nextcloud".

Bon, tout ca c'est joli, mais taper 200 fois "-n nextcloud", ca devient penible.

Il suffit de changer notre config de contexte :

kubectl config set-context --current --namespace=nextcloud
kubectl config view --minify | grep namespace

mercredi, juin 24 2020

Kubernetes : générer un skelette de déploiement

Kubernetes peut nous aider à la génération d'un déploiement :

comme on peut déployer avec la commande :

kubectl create deployment fancyapp --image test

on peut alors faire un dry-run et faire un output en yaml comme suit :

kubectl create deployment fancyapp --image test -o yaml --dry-run

Et voila notre squelette !

vendredi, juin 19 2020

Kubernetes : Objets

Il existe beaucoup d'objets dans kubernetes, permettant de créer des roles bien écrite, évitant les informations sensibles, ou permettant la ré-utilisabilité de paramêtres

Les plus basiques

  • pods : définition d'un pod (image de container, nommage du pod, environement du container ...)
  • service : exposition d'un service (port, mode d'exposition, translation de ports ...)
  • replicaset : définition d'un ensemble de contraites de réplicas pour obtenir un état stable de notre ressource
  • deployement

Pour aller un peu plus loin

  • configmap : stockage clef valeur non sécurisé
  • secrets : stockage en base64 d'information sensibles auquels ont fera référence dans les yamls afin de ne pas les révéler en clair
  • ingress : gestion de flux entrants
  • egress ; gestion de flux sortants
  • serviceaccount : identité pour un object kubernetes afin de lui déléger un accès a des ressources (un peu comme nous en tant qu'user

A voir aussi

  • statefulset : ... a lire
  • daemonset : ... a lire

mardi, juin 16 2020

Kubernetes - Plugins

Il est possible pour simplifier ou enrichir, selon sa propre topologie de cluster kubernetes, d'enrichir celui-ci de plugins. Les plus plugins les plus simple sont des scripts shells, que l'ont va simplement déclarer comme tel. Pour plus d'informations, lire la documentation

Mais ce qui nous intéresse vraiment ici, c'est un petit bloc de cette documentaiton, qui parle du manager de plugin krew

Pour l'installer, il suffit de suivre cette documentation

Mettre à jour la liste de plugins

kubectl krew update

Lister les plugins

kubectl krew search

Installer un plugin

kubectl krew install access-matrix

utiliser le plugin

kubectl access-matrix

L'un des plugin les plus intéressant est ksniff

kubectl krew install ksniff
kubectl sniff db2http-6cb54d9c6f-w7dcn  -f "port 5000" -o - | tshark -r -

Et nous obtenons une écoute réseau du port 5000 de notre container flask dans un contexte interne à kubernetes !!!

    1   0.000000    10.60.0.1 → 10.60.0.19   TCP 76 54502 → 5000 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2264947788 TSecr=0 WS=128
    2   0.000018   10.60.0.19 → 10.60.0.1    TCP 76 5000 → 54502 [SYN, ACK] Seq=0 Ack=1 Win=28160 Len=0 MSS=1420 SACK_PERM=1 TSval=3960258476 TSecr=2264947788 WS=128
    3   0.026261    10.60.0.1 → 10.60.0.19   TCP 68 54502 → 5000 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=2264947814 TSecr=3960258476
    4   0.028300    10.60.0.1 → 10.60.0.19   IPA 150 unknown 0x54 
    5   0.028316   10.60.0.19 → 10.60.0.1    TCP 68 5000 → 54502 [ACK] Seq=1 Ack=83 Win=28160 Len=0 TSval=3960258504 TSecr=2264947815
    6   0.030224   10.60.0.19 → 10.60.0.1    IPA 85 unknown 0x54 
    7   0.030369   10.60.0.19 → 10.60.0.1    IPA 205 unknown 0x6e 
    8   0.055745    10.60.0.1 → 10.60.0.19   TCP 68 54502 → 5000 [ACK] Seq=83 Ack=18 Win=64256 Len=0 TSval=2264947844 TSecr=3960258506
    9   0.056696    10.60.0.1 → 10.60.0.19   TCP 68 54502 → 5000 [FIN, ACK] Seq=83 Ack=156 Win=64128 Len=0 TSval=2264947845 TSecr=3960258506
   10   0.056708   10.60.0.19 → 10.60.0.1    TCP 68 5000 → 54502 [ACK] Seq=156 Ack=84 Win=28160 Len=0 TSval=3960258533 TSecr=2264947845

Les ip nous confrment bien que nous sommes dans le réseau interne de kubernetes, et non pas sur une écouté externe. D'ailleurs pour une écoute externe, le problème serait d'être positionné sur le load balancer, donc l'ip est attribuée dynamiquement, et n'est pas une ressource physique en tant que tel :)

lundi, juin 8 2020

Kubernetes, créer un secret pour accéder à son docker hub private

kubectl create secret docker-registry regcred \
  --docker-server=https://index.docker.io/v1/ \
  --docker-username=pepin55i5 \
  --docker-password=****REDACTED****  \
  --docker-email=pascal.valois@free.fr

Il suffit ensuite de préciser le secret dans kubernetes dans la section container :

      containers:
        - image: pepin55i5/repulsor:dbtohttp
          imagePullPolicy: Always

vendredi, juin 5 2020

Kubernetes, accès privé a une ressource

Certains pods n'ont pas vocation a être exposés (posgress, grafana, ...)

Nous pourrions utiliser des tunnels ssh, mais cela demanderai une forme d'exposition (nodePort, à minima) et une connaissance des IP des pods, ce qui dans kubernetes et son allocation dynamique est plutôt "tricky" (pas vraiment compliqué, mais surtout pénible à faire à chaque fois quand mieux existe).

Mais heureusement, kubernetes propose un système de port forwarding pour pallier au problème.

kubectl port-forward -n monitoring grafana-core-6dfd47c968-wkkwk 3000:3000 --address 0.0.0.0

Bon, il faut quand même connaitre le nom du pod pour cela, mais un petit script utilisant grep ou awk pour extraire un pattern comme "grafana-core" n'a rien de sorcier. il est même possible d'automatiser un autoexpose port avec python et les multiples libs de kube, docker, etc. en s'y prenant bien !

Bref, encore des choses à faire, et surtout une grand part lié a la connaissance de l'écosystème kube.

mardi, juin 2 2020

Kubernetes, Contexte et Shell

Si nous voulons tester des choses lié au réseau interne du cluster, il est nécessaire d'avoir un shell dans le contexte de kubernetes. Nous pouvons lancer un container a usage unique, utilisant un shell comme entrypoint, à la façon de docker, via kubectl :

kubectl run -i --tty busybox --image=busybox --restart=Never -- sh 

mais ce n'est qu'une busybody, donc un peu restreint questions outils. il est préférable d'utiliser ubuntu et bash

kubectl run -i --tty ubuntu --image=ubuntu --restart=Never -- bash

dimanche, mai 31 2020

Kubernetes Cheatsheet

Surement l'un des liens les plus utile du site

lundi, mai 18 2020

Traefik et Kubernetes

Autoriser traefik a se connecter au serveur Kube pour obtenir les routes ingress :

kubectl apply -f https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-ds.yaml

Ajouter le provider a la configuration traefik.toml :

[kubernetes]
  endpoint = "https://192.168.1.30:16443"
  namespaces = ["default"]

dimanche, mai 17 2020

Microk8s

Plutot que d'installer kubernetes officiel sur plusieurs noeuds pour tester ou s'autoformer à kubernetez, il existe des version plus simples à installer comme microk8s :

snap install microk8s
microk8s enable
microk8s start
microk8s enable dns storage
alias kubectl = "microk8s kubectl"

Pour activer le dashboard :

microk8s enable dashboard
token=$(microk8s kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
microk8s kubectl -n kube-system describe secret $token
microk8s kubectl port-forward -n kube-system service/kuberInetes-dashboard 10443:443

Tant que le port-forward est actif, vous avez accès au dashboard par la boucle locale, port 10443, et donc un tunnel ssh. Le token affiché est le token vous permettant de vous authentifier.

Une fois tout ceci fait, vous pouvez commencer à jouer !

mardi, mars 17 2020

Minikube

En ayant assez de me battre avec la recherche de ressource pour installer kubernetes de façon complète, sachant que de surcroit j'ai un rôle ansible qui le déploit fonctionnellement, et que ce que je recherche c'est plus faire des yaml parfait avec un traefik qui route comme je le souhaite les demandes, je passe a minikube pour mes travaux kube.

Installation

snap install minikube

Démarrage

minikube version
minikube start

mardi, mars 3 2020

Kubernetes/Audit2rbac

Pour debunker la création de droits pour les services et autres:

https://github.com/liggitt/audit2rb...

dimanche, décembre 15 2019

Kubernetes bare metal avec Metallb

Pour un kube bare-metal (installé par soit même), une solution de load-balancer est metallb. Metallb fera lui même l'affectation d'ip dynamique pour le service sous-jacent.

Pour installer metallb, il suffit d'exécuter :

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

Il faut ensuite créer un pool d'adresse que metallb pourra distribuer :

vi configmap-metallb.yml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.99.100-192.168.99.200

kubectl apply -f configmap-metallb.yml

Il faut bien sur que les adresses que metallb distribue arrivent au serveur sachant ensuite faire le load-balancing. Le cas le plus simple reste que le contrôleur kubernetes héberge lui meme le metallb et soit lui même la target des ip distribuées. Il reste que dans ce cas, il devient nœud d'engorgement et single point of failure architectural.

Une prochaine réflexion, sera de voir comment distribuer plus efficacement et sécuritairement.

Une fois notre yaml appliqué, metallb est prêt. Il nous suffit alors de créer un service pour nos pods qui sera un load-balancer.

Ici l'exemple pour une application nginx :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

Et voici le yaml pour le service :

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - name: http
    port: 8998
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

On applique notre deployment et notre service et nous voila avec deux nginx en load-balancing !!

Pour voire l'ip, il suffit de faire :

kubectl get svc nginx

NAME    TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)          AGE
nginx   LoadBalancer   10.96.84.103   192.168.99.100   8998:31748/TCP   64m

Suite à quoi, http://192.168.99.100:8998 affiche notre page via l'un ou l'autre des pods nginx.

vendredi, novembre 15 2019

Google Cloud et Kubernetes, notes

Kubernetes, ce que j'ai fait :

 Création d'un compte google cloud 
 Installation du sdk google : https://cloud.google.com/sdk
 Installation de kubectl : gcloud components install kubectl

Paramétrage de gcloud :

 gcloud config set compute/zone europe-west2-a 
 gcloud auth login 
 gcloud config set project gentle-booking-214421

Création d'un cluster sous google cloud :

 google containers cluster create pommeraie 
 kubectl get nodes

Reconnection au cluster depuis une autre machine

 gcloud container clusters get-credentials pommeraie

Création d'un yaml nginx :

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

Création des pods :

 kubectl create -f dep-nginx.yaml
 kubectl get pods

Destruction des pods :

 kubectl delete -f dep-nginx.yaml

Scaling des replicas du pod :

 kubectl scale --replicas=6 deployment nginx-deployment

Création d'un autoscaling :

 kubectl get rs
 kubectl autoscale deployment nginx-deployment  --min=2 --max=5 --cpu-percent=80
 kubectl get hpa
 kubectp get rs
 kubectl get pods

on voit bien qu'on est passé à 2 pods dispos.

Destruction de l'autoscaling :

 kubectl delete hpa nginx-deployment
 kubeclt get rs

Exposition d'un groupe de pod avec mise en place d'un load balancer :

 kubectl expose deployment nginx-deployment --type=LoadBalancer --name=lba-nginx
 kubectl get services

Récupération des informations de mon cluster :

 kubectl get nodes -o wide
 kubectl get pods -o wide
 kubectl get service -o wide
 kubectl get rs -o wide
 kubectl get hpa -o wide

Demande plus spécifique d'infos ;

 kubectl describe service lda-nginx

Lister tous les rôles de votre cluster :

 kubectl get clusterroles
 kubectl describe clusterroles

samedi, juillet 13 2019

Reinstallation de kubernetes et troubles persistants

Après une désinstallation des packs kubernetes pour pouvoir faire une installe fraich, le tube résultat indique que les noeuds sont la depuis plus de 50 jours et not ready ...

La je commence à me dire que quelquechose cloche ...

Purger et reconfigurer Kube :

kubeadm reset -f
kubeadm init

et sur les noeuds :

kubeadm reset -f
kubeadm join ...

Un reboot fut aussi nécessaire aussi sur les noeuds pour arriver à un état final ou tout le monde indique être prêt.

- page 1 de 2