KUBERNETES

Sommaire


1- Introduction

blog kubernetes: https://blog.heptio.com/

Architecture micro-services

Application Cloud Native

Les ouils devops

differents outils devops


2- La plateforme

Historique

Fonctionnalites

concept de base 1

concept de base 2

La gestion du cluster est faite via le binaire kubectl ou l’interface web (et au fichier de conf kubeconfig)

Differentes categories de ressources

Specification des ressources

Exemple de specification d’un Pod:

apiVersion: v1
kind: Pod
metadata:
    name: www
    labels:
        app: w3
spec:
    containers:
    - name: www
      image: nginx:1.16

Exemple de specification d’un Service:

apiVersion: v1
kind: Service
metadata:
    name: www
spec:
    selector:
        app: w3
    ports:
    - port: 80
      targetPort: 80

Exemple de specification d’un Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: www
spec:
    replicas: 3
    selector:
        matchLabels:
            app: w3
        template:
            metadata:
                labels:
                    app: vote
            spec:
                containers:
                - name: vote
                  image: instavote/vote

Labels et Annotations

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: www
    annotations:
        ingress.kubernetes.io/rewrite-target: /
    labels:
        app: www

Communication avec le cluster

En utilisant le binaire kibectl ou l’interface web.

$ kubectl get nodes
$ kubectl get pods
$ kubectl apply -f pod.yaml

Les differents types de nodes

Master:

Worker / Node:

$ kubectl get nodes
NAME        STATUS      ROLES       AGE     VERSION
kube-01     Ready       master      32m     v1.13.4
kube-02     Ready       <none>      24m     v1.13.4
kube-03     Ready       <none>      24m     v1.13.4

vision d'ensemble

vision d'ensemble suite

vision d'ensemble suite2

Pour lister les differents Pods il suffit de faire kubectl get pod -n kube-system

vision d'ensemble suite2

Les processus: API Server

workflow de creation d'un pod

Context d’utilisation

On peut utiliser plusieurs clusters Kubernetes, par exemple un en local (minikube, docker desktop), un cluster manage, pre prod, prod… Le contexte permet de definire le cluster (de staging, de production..) auquel on s’adresse et avec quel utilisateur on le fait. Par defaut il est defini dans un fichier ${HOME}/.kube/config ou $KUBECONFIG ou encore --kubeconfig.


3- Mise en place

Minikube

Docker Desktop (macOS/Win)

Exercice: Installation de Minikube

Pour lancer minikube:

$ minikube start
$ kubectl get pods
$ kubectl get nodes
$ kubectl get version
$ kubectl get services #verifier @IP et Port d'un service

Exemple demarrer 2 instances du serveur web Nginx puis verifiez que les 2 instances sont disponibles:

$ kubectl run my-nginx --image=nginx --replicas=2 --port=80
deployment "my-nginx" created

$ kubectl get deploy
NAME    DESORED     CURRENT     UP-TO-DATE      AVAILABLE   AGE
my-nginx 2          2           2               1           12s

$ kubectl get pod
NAME                READY       STATUS      RESTARTS    AGE
my-nginx-ldkdjfgh   1/1         Running     0           16s
my-nginx-rotieuee   1/1         Running     0           16s

Nginx s’exécute dans deux conteneurs Docker mais n’est pas accessible hors du cluster Kubernetes. La façon la plus simple d’exposer le déploiement et de le rendre accessible de l’extérieur est d’utiliser l’adresse IP standard 192.168.99.100 (de la Minikube VM) et d’exposer un NodePort. Le système convertit l’adresse pour le port TCP de cette adresse IP vers l’adresse IP interne du conteneur.

$ kubectl expose deployment my-nginx --port=80 --type=NodePort
service "my-nginx" exposed

Pour s’assurer que Nginx est actif, ouvrez un navigateur Web, et entrez http://192.168.99.100:<port> soit 30709, où le port est celui indiqué dans la commande kubectl get services

$ kubectl get services
NAME        TYPE        CLUSTER-IP      EXTERNAL-IP     PORT(S)         AGE
kubernetes  ClusterIP   10.96.0.1       <none>          443/TCP         8m
my-nginx    NodePort    10.101.62.218   <none>          80:30709/TCP    2s

Interface graphique:

Un serveur web est maintenant déployé sur Kubernetes.

Jusqu’à présent, nous avons utilisé des outils en ligne de commande pour gérer Kubernetes, ce qui est une excellente pratique pour l’automatisation. Cependant, une interface graphique facilite grandement l’exploration de ce qui se passe dans ce labo Kubernetes. Utilisez la commande minikube dashboard pour lancer un navigateur Web et ouvrir le tableau de bord.

Le tableau de bord affiche des informations sur les déploiements actifs, l’exécution de Pods (là où se trouvent les containers) et plusieurs autres éléments.

Fermer, supprimer:

Pour fermer Minikube, exécutez la commande minikube stop pour arrêter la VM. Minikube conservera les déploiements ainsi que les services définis au démarrage. Pour empêcher le déploiement de reprendre, supprimez l’installation avec kubectl delete po,svc,deploy my-nginx avant de fermer Minikube.

Un cluster Kubernetes en production aura certes plus d’un hôte. Ce laboratoire n’est utile que pour des tests à petite échelle.

Cluster Kubernetes managé

Cluster Kubernetes managé: GKE

Creation depuis l’interface https://console.cloud.google.com ou le binaire gcloud

$ gcloud init
$ gcloud container clusters create kube-demo --cluster-version=lastest --num-nodes 3

Cluster Kubernetes managé: AKS

Creation depuis l’inteface web https://portal.azure.com ou le binaire az

# Creation d'un groupe
$ az group create --name kube-group --location westeurope

# Creation du cluster
$ az aks create --name kube-demo --resource-group kubegroup --node-count 3 --generate-ssh-keys

# Mise a jour de la configuration de kubectl
$ az aks get-credentials --resource-group kubegroup --name kube-demo

Cluster Kubernetes managé: DigitalOcean

Creation depuis l’interface web https://digitalocean.com ou le binaire doctl

$ doctl k8s cluster create mykube --region lon1 --version 1.14.1-do.2 --node-pool="name=workers;size=s-2vcpu-4gb;count=5" --update-kubeconfig=true

(recuperer le kubeconfig.yaml permet de faire la liaison entre sa machine et le cluster cloud export KUBECONFIG=~/[PATH_kubeconfig.yml])

Cluster de production - d’autres outils

De nombreuses solutions pour creer et superviser

Installation avec kubeadm

# Initialisation du Master
$ kubeadm init

# Mise en place du reseau pour la communication entre les Pods
$ export kubever=$(kubectl version | base64 | tr -d '\n')
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

# Ajout de node supplementaires
$ kubeadm join --token <token> <master-ip>:<master-port>

Creer et superviser un cluster Kubernetes avec Rancher

$ docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:latest

Exercice: Installation sur DigitalOcean avec kubeadm (pour la creation de cluster)

Installation des prerequis sur les vm (voir pdf ci-dessus):

Playground en ligne

labs.play-with-k8s.com

Quelques commandes:

Configuration

context 1 context 2 context 3 context 4 context 5 exemple play with k8s

4- Les objets: Pod

Description des commandes

Differentes categories:

Une meme structure de base:

apiVersion: v1
kind: Pod
metadata:
    name: nginx
spec:
    containers:
    - name: www
      image: nginx:1.12.2
apiVersion: v1
kind: Service
metadata:
    name: votre-service
spec:
    selector:
        app: vote.
    ports:
    - port: 80
      targetPort: 80
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: www-domain
spec:
    rules:
        - host: www.example.com
          http:
            paths:
                - backend:
                    serviceName: www
                    servicePort: 80

Presentation des Pod

Exemple - server http

$ cat nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
 name: nginx
spec:
 containers:
 - name: www
 image: nginx:1.12.2
Spécification d’un Pod dans lequel est lancé un container basé sur l’image nginx

VIDEO 17


5- Les objets: Service


6- Les objets: Deployment


7- Les objets: Namespace


8- Application micro-services


9- Les objets: ConfigMap


10- Stack Elastic (ELK)


11- Les objets: Secret


12- Utilisateurs et droits d’acces RBAC


13- DaemonSet


14- Les objets: Ingress


15- Application stateful


16- Helm


17- Bonus