When deleting a namespace is stuck in Terminating
state, you can find all resources in this namespace with kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete
Un super tuto pour déployer et utiliser Elasticsearch, Kibana et Metricbeat sur Kubernetes à l'aide des Helm charts Elastic officiels.
Attention, contrairement a ce qui était mentionné à l'origine dans cet article, les Helm charts Elastic be sont pas encore officiellement supporté avec Helm v3. L'utilisation de Helm v2 est donc recommandée.
Une bonne explication des différences entre les Helm charts et les opérateurs Kubernetes.
Une application mobile pour gérer ses clusters k8s depuis son smartphone
Un ensemble de CRD qui permettent de créer des ressources GCP via des templates kubernetes.
exemple:
apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLInstance
metadata:
name: my-sql-instance
labels:
cost-center: "cc9"
spec:
databaseVersion: MYSQL_5_7
region: us-central1
settings:
tier: db-f1-micro
Un Space Invaders like pour killer des pods Kubernetes
Les commandes pour générer un kubeconfig à partir d'un Service Account K8S.
J'ai créé 2 scripts à partir de ces instructions:
AWS EKS gère désormais les node groups de workers en tant que ressources managées (avant il fallait gérer soit même les ASG de workers nodes).
En plus c'est déjà géré par la nouvelle version du provider terraform-aws
Présentation de ClusterAPI qui permet de provisionner depuis un cluster k8s existant (management cluster) d'autres clusters k8s (target clusters) dans le cloud grâce a des CRDs (ex: AWSCluster, MachineDeployment). C'est encore en alpha mais ça a l'air très prometteur.
Un plugin Helm qui permet de déclencher un rollback automatique suite à l'upgrade d'une release Helm en fonction d'une query Elasticsearch ou Prometheus
Une nouvelle vulnérabilité a été découverte dans runc qui permet aux containers Docker qui tournent en tant que root de devenir root sure le système hôte.
Il faut mettre à jour Docker (dernière version: 18.09.02).
Il est également recommandé de ne jamais faire tourner de containers en tant que root et de contrôler les images Docker qui tournent en production.
EDIT: voire également la communication côté K8S (https://kubernetes.io/blog/2019/02/11/runc-and-cve-2019-5736/) et AWS (https://aws.amazon.com/security/security-bulletins/AWS-2019-002/)
Un top-like pour kubernetes qui permet de monitorer en temps réel les resources K8S mais aussi d'afficher ou éditer leurs définition, d'afficher les logs des pods ou de lancer un kubectl exec
dessus.
Les Operators K8S permettent de déployer un produit (ex: Prometheus, ETCD out Vault...) sur K8S et de gérer toute la configuration sous forme d'objets K8S custom (CRDs). C'est selon moi un des concepts les plus prometteurs de K8S qui permet notamment de déployer le monitoring Prometheus en même temps qu'une appli dans K8S, mais aussi d'automatiser le provisioning de ressources externes cloud nécessaires au fonctionnement de l'application (bucket S3, record DNS ou base DynamoDB par exemple). L'article présente les Operators plus en détail et liste les 120 Operators existant actuellement avec le niveau de maturité de chacun.
Quelques optimisations pour utiliser EKS en production
Les prérequis a connaitre pour utiliser K8S avec le cloud provider AWS qui permet de provisionner automatiquement de ressources ELB et EBS pour les services de type Load balancer et les PersistentVolumes
Le getting started officiel Hashicorp pour déployer un cluster EKS avec Terraform.
Le code est ici: https://github.com/terraform-providers/terraform-provider-aws/tree/master/examples/eks-getting-started
EDIT:
NOTE: The usage of the specific kubernetes.io/cluster/ resource tags below are required for EKS and Kubernetes to discover and manage networking resources.
NOTE: The usage of the specific kubernetes.io/cluster/ resource tag below is required for EKS and Kubernetes to discover and manage compute resources.
voir également: https://github.com/kubernetes/cloud-provider-aws/blob/8f6e1e3d2cfa20a0deac088b9c4022d433500369/pkg/cloudprovider/providers/aws/tags.go#L30-L52
Je n'ai pas trouvé de doc officielle claire indiquant les tags à mettre en place sur les ressources AWS, mais après avoir passé 2 jours à débugguer pourquoi mes ELB ne se provisionnaient pas, puis pourquoi mes Nodes n'arrivaient pas à joindre le cluster EKS, je confirme que ces tags sont très importants à ajouter sur les ressources suivantes:
Un petit tuto pour créer un cluster AKS (K8S managé Azure) avec Terraform.
Un catalogue de helm charts façon DockerHub
L'article propose d'optimiser les coûts d'infrastructures et de bénéficier d'un pseudo chaos engineering sur les clusters k8s en utilisant des spots instances aws (ou équivalent dans les autres clouds).
Un tuto pour faire tourner une webapp sur un cluster K8S GKE minimal (3 nodes f1-micro / 600Mb RAM) pour 5$ par mois
Explication du fonctionnements des overlays networks dans Kubernetes par la pratique en prenant l'example d'un plugin CNI écrit en bash (https://github.com/s-matyukevich/bash-cni-plugin/blob/master/01_gcp/bash-cni)
(via: https://dooby.fr/links/?q-jJiA)
Quelques commandes utiles pour diagnostiquer un problème sur un pod kubernetes.
Une cli pour créer des clusters AWS EKS en une ligne de commande
Quelques conseils pour mettre en place et gérer un cluster Kubernetes:
Une commandline interactive (REPL) pour gérer les clusters Kubernetes avec des commandes moins longues et plus simples que kubectl
Un nouveau projet de la fondation Jenkins qui permet d'automatiser une chaîne complète de CI/CD, de la création du repo à la promotion en prod avec Jenkins et Kubernetes. L’intégration semble s’approcher de ce que propose OpenShift en la matière.
3 méthodes différentes permettant de prendre le contrôle d'un cluster kubernetes à partir d'un pod avec une installation de kops par défaut et comment les sécuriser. Il faudrait vérifier si ces failles existent également par défaut avec les autres outils de provisioning kubernetes (kubespray...).
Kubetail permet d'agréger et d'afficher en temps réel les logs d'un ou plusieurs pods
Kubediff compare l'état réel d'un cluster kubernetes avec son état attendu (configuration yaml files) et remonte une alerte en cas de divergences
Synthèse des nouveaux services EKS et Fargate annoncés aux AWS Re-Invent Summit cette année.
EKS (AWS Kubernetes managed solution) permet de déployer un cluster Kubernetes sur AWS en ne gérant que les workers nodes (masters nodes managés par AWS).
Fargate va plus loin en fournissant une solution 100% managée (workers nodes managés) pour ECS dans un premier temps puis EKS en 2018. Cette solution permet de déployer des containers sans ce soucier des instances EC2 sur lesquels ils tourneront et de payer uniquement pour les containers déployés (facturation par container au lieu de la facturation par instances EC2 démarrées dans le cluster).
Une formation (gratuite) sur Kubernetes offerte par la Linux Fondation
Correspondances entre les noms des ressources dans Spinnaker et dans Kubernetes:
Attention: au delà des nommages différents, d'autres subtilités existent et sont décrites plus en détails dans l'article.
Pour centraliser les logs des pods dans Cloudwatch Logs avec un cluster Kubernetes provisionné par KOPS:
$ kops edit cluster
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: kops/v1alpha2
kind: Cluster
spec:
...
additionalPolicies:
node: |
[
{
"Effect": "Allow",
"Action": ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
"Resource": ["*"]
}
]
master: |
[
{
"Effect": "Allow",
"Action": ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
"Resource": ["*"]
}
]
docker:
logDriver: awslogs
logOpt:
- awslogs-region=eu-west-1
- awslogs-group=k8s
...
$ kops update cluster --yes # used only to update additional iam policies
$ kops rolling-update --yes --force # used to recreate every k8s cluster members (docker logdriver and logopt will be added to /etc/sysconfig/docker at the first boot)
Attention les noms des streams de logs dans cloudwatch correspondent aux id des containers, ce n'est pas très pratique...
EDIT: en utilisant cette méthode, les logs ne sont plus accessible via la commande kubectl logs
. Du coup je ne recommande pas cette approche...
kops get cluster ${CLUSTER_NAME} -o yaml --full > cluster.yml
kops get ig nodes -o yaml > nodes.yml
kops get ig masters -o yaml > master.yml
cat cluster.yml > cluster_spec.yml
echo --- >> cluster_spec.yml
cat nodes.yml >> cluster_spec.yml
echo --- >> cluster_spec.yml
cat master.yml >> cluster_spec.yml
kops create -f cluster_spec.yml
route53-kubernetes permet d'automatiser la création d'enregistrement DNS quand on configure son Ingress.
C'est intégré sous forme d'addon à KOPS.
Attention: Après quelques tests, si route53-kubernetes gère bien la création des nouveaux enregistrements DNS, je n'ai pas l'impression qu'il gère la modification ou suppression des enregistrements créés précédemment. Il doit donc falloir faire du ménage manuellement de temps en temps.
A noter qu'il existe aussi ExternalDNS qui semble être la future méthode standard pour manipuler les DNS externes (Route53, Google Cloud DNS, ...) mais qui semble moins mature.
Quand on écrit des config Kubernetes, il faut jongler avec les versions d'api (paramètre apiVersion
dans le yaml) qui diffèrent selon la version de Kubernetes et le type de ressources (principalement v1
, apps/v1
et extensions/v1beta1
).
La documentation de référence de l'API permet (entre autre) de connaître la bonne version à utiliser pour chaque resource.
La doc pour créer un Ingress Traefik qui fera office de Reverse Proxy/Load Balancer pour accéder aux pods Pods depuis l'exterieur.
$ source <(kubectl completion bash) # setup autocomplete in bash, bash-completion package should be installed first.
$ source <(kubectl completion zsh) # setup autocomplete in zsh
et plein d'autres tips bien pratiques...
Pour installer un cluster Kubernetes privé avec KOPS sur une infra AWS déjà existante (DNS, VPC, Subnets, ...)
EDIT
en complement un tuto qui permet de faire quasimment la même chose mais en utilisant KOPS pour exporter une configuration Terraform pour ceux qui utilisent déjà Terraform pour le reste de leur infrastructure:
https://ryaneschinger.com/blog/kubernetes-aws-vpc-kops-terraform/
Une présentation des avantages de Prometheus pour le monitoring de clusters Kubernetes
Une bonne introduction à la partie networking de Kubernetes
Kops permet de créer un cluster Kubernetes complet et haute-dispo sur AWS.
Parmi les nombreuses features intéressantes:
Une plateforme de e-learning pour des services d'infrastructures (nomad, kubernetes, consul, google app engine).
Un lab de 15min pour apprendre les bases de Kubernetes
Une demo fournie par Red Hat pour deployer une architecture microservices basée sur Kubernetes, Openshift et Spring Cloud / Netflix OSS avec Ansible.
EDIT:
Une comparaison des approches fournies par Spring Cloud / Netflix OSS et Kubernetes pour résoudre les problématiques des architectures microservices.
Une autre comparaison de Kubernetes et SpringCloud pour une archi microservice
Un tuto pour se faire la main sur OpenShift de RedHat qui permet de deployer un PAAS open source basé sur Docker et Kubernetes
Comparaison entre Kubernetes et ECS
Kubernetes gagne sur tous les points.
Attention cet article date de juin. Les 2 solutions ont certainement évoluées depuis.
Un tuto pour automatiser la création et le déploiement d'images docker dans GoogleCloud avec Jenkins, Packer et Kubernetes
Le contenu du tuto (dockerfiles...) est disponible sur github: https://github.com/GoogleCloudPlatform/kube-jenkins-imager