jeudi, février 1 2024
Par pepin le jeudi, février 1 2024, 12:41
𝐂𝐨𝐧𝐭𝐫𝐨𝐥 𝐏𝐥𝐚𝐧𝐞
- 𝐀𝐏𝐈 𝐒𝐞𝐫𝐯𝐞𝐫: 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
Par pepin le samedi, janvier 20 2024, 10:05
kubectl -n default get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
mercredi, août 23 2023
Par pepin le mercredi, août 23 2023, 14:28
kubectl get events --sort-by='.metadata.creationTimestamp' -A
lundi, août 21 2023
Par pepin le lundi, août 21 2023, 12:16
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
Par pepin le mercredi, août 16 2023, 15:34
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
Par pepin le jeudi, août 3 2023, 17:28
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
Par pepin le vendredi, juin 23 2023, 11:26
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
Par pepin le lundi, juin 5 2023, 10:13
oc logs -n openshift-cluster-storage-operator $(oc get pods -A | grep detector-operator | awk '{print $2}')
jeudi, mars 23 2023
Par pepin le jeudi, mars 23 2023, 11:18
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
Par pepin le mardi, mars 21 2023, 17:06
oc exec velero-664f99d459-98rxh -it -- ./velero backup describe backup --details
Par pepin le mardi, mars 21 2023, 11:29
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
Par pepin le mardi, mars 7 2023, 15:01
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
Par pepin le jeudi, novembre 17 2022, 06:34
Do so :
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
dimanche, octobre 9 2022
Par pepin le dimanche, octobre 9 2022, 17:46
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
Par pepin le vendredi, septembre 30 2022, 16:24
dimanche, août 7 2022
Par pepin le dimanche, août 7 2022, 10:37
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
Par pepin le vendredi, janvier 15 2021, 10:34
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
Par pepin le jeudi, décembre 24 2020, 04:39
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
Par pepin le lundi, novembre 16 2020, 02:39
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
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
Par pepin le mardi, octobre 27 2020, 09:50
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
Par pepin le samedi, octobre 17 2020, 12:17
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
Par pepin le mardi, septembre 29 2020, 21:41
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
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
Par pepin le vendredi, septembre 4 2020, 10:56
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
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
sudo snap install kontena-lens --classic
mercredi, juillet 29 2020
Par pepin le mercredi, juillet 29 2020, 16:59
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
Par pepin le jeudi, juillet 9 2020, 18:35
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
mardi, juillet 7 2020
Par pepin le mardi, juillet 7 2020, 15:10
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
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
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
Par pepin le lundi, juin 29 2020, 23:56
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)
Par pepin le lundi, juin 29 2020, 22:18
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
Par pepin le samedi, juin 27 2020, 00:00
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
Par pepin le mercredi, juin 24 2020, 00:51
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
Par pepin le vendredi, juin 19 2020, 17:25
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
Par pepin le mardi, juin 16 2020, 16:30
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
Par pepin le lundi, juin 8 2020, 09:56
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
Par pepin le vendredi, juin 5 2020, 07:37
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
Par pepin le mardi, juin 2 2020, 13:44
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
Par pepin le dimanche, mai 31 2020, 18:42
Surement l'un des
liens
les plus utile du site
lundi, mai 18 2020
Par pepin le lundi, mai 18 2020, 19:06
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
Par pepin le dimanche, mai 17 2020, 00:12
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
Par pepin le mardi, mars 17 2020, 15:28
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
Par pepin le mardi, mars 3 2020, 11:39
Pour debunker la création de droits pour les services et autres:
https://github.com/liggitt/audit2rb...
dimanche, décembre 15 2019
Par pepin le dimanche, décembre 15 2019, 23:59
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
Par pepin le vendredi, novembre 15 2019, 17:14
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
Par pepin le samedi, juillet 13 2019, 02:55
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.