---
# System prepended metadata

title: '***Kubernetes***'

---

# ***Kubernetes*** 

Bien que chaque ***pod*** ait une ***adresse IP unique***, ces adresses IP ne sont pas exposées en dehors du ***cluster sans service***. Les services permettent à vos applications de recevoir du trafic. Les services peuvent être exposés de différentes manières en spécifiant un type dans la ServiceSpec : 

* **ClusterIP** (par défaut) - Expose le service sur une adresse IP interne dans le cluster. Ce type rend le service uniquement accessible depuis le cluster.
* **NodePort** - Expose le service sur le même port de chaque nœud sélectionné dans le cluster à l'aide de ***NAT***. Rend un service accessible depuis l'extérieur du cluster à l'aide de ***NodeIP*** :***NodePort***. Surensemble de ***ClusterIP***.
* **LoadBalancer** - Crée un équilibreur de charge externe dans le cloud actuel (si pris en charge) et attribue une adresse IP externe fixe au service. Surensemble de ***NodePort***.


## ***Installer kubernetes***
 
      * sudo apt update 
      * sudo apt -y upgrade 
      * sudo apt -y install curl apt-transport-https
      * curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - 
      * echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list 
      * sudo apt update
      * sudo apt -y install vim git curl wget kubelet kubeadm kubectl
      * sudo apt-mark holdsudo apt -y install vim git curl wget kubelet kubeadm kubectl kubelet kubeadm kubectl



* ***1- Create Kubernetes Secret:***


 ``` consol 
 
 apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: kubernetes.io/basic-auth
stringData:
  password: *******
 
 ``` 
        * nano mysql-secret.yaml
        * kubectl apply -f mysql-secret.yaml


* ***2- Créer un volume persistant et une revendication de volume:***

``` consol 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi


``` 

        * nano mysql-storage.yaml
        * kubectl apply -f mysql-storage.yaml
        

* ***3- Create MySQL Deployment***

    * ***3.1 Créez le fichier de déploiement. Le fichier de déploiement définit les ressources que le déploiement MySQL utilisera.***

``` consol 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
    
```
     * nano mysql-deployment.yaml
     * kubectl apply -f mysql-deployment.yaml
     
    
* Pour accéder à l'instance MySQL, accédez au pod créé par le déploiement. Utiliser la commande suivant: 

        * kubectl get pod  
    
* Obtenez un shell pour le conteneur en cours d'exécution:

        * kubectl exec -it shell-demo -- /bin/bash


* Pour accéder au shell MySQL tapez la commande suivante : 
    
        * mysql -p
    
* ***4- Supprimer votre instance MySQL***

        * kubectl delete deployment,svc mysql
        * kubectl delete pvc mysql-pv-claim
        * kubectl delete pv mysql-pv-volume
        * kubectl delete secret mysql-secret

## ***Déployer php sur le cluster Kubernetes***

``` consol
apiVersion: v1
kind: Service
metadata:
  name: php
  labels:
    tier: backend
spec:
  selector:
    app: php
    tier: backend
  ports:
  - protocol: TCP
    port: 9000
```

## ***Déployer le serveur Web Apache et PHP sur le cluster Kubernetes***

``` consol 

apiVersion: v1
kind: service 
metadata:
  name: httpd-service-devops
  namespace: httpd-namespace-devops
  labels:
    app: apache_app
spec:
  type: NodePort
  selector:
    app: apache_app
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30004

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment-devops
  namespace: httpd-namespace-devops
spec: 
  replicas: 2 
  selector:
    matchLabels:
      app: apache_app
  template:
    metadata:
      labels:
        app: apache_app
  spec:
   containers:
    - name: httpd-container-devops
      image: httpd:latest
      ports:
       - containerPort: 80
       
       
``` 
        * nano apache-dev.yaml


- On doit cree un namespace: 

        * kubectl create ns httpd-namespace-devops
        * kubectl get ns 
        * kubectl apply -f apache-dev.yaml
        * kubectl get pods -n httpd-namespace-devops
        * kubectl describe pods -n httpd-namespace-devops
        * kubectl get pods -n httpd-namespace-devops
        * kubectl service 



### ***Déployer Ingress***

Un ***Ingress*** est un objet Kubernetes qui ***gère l'accès externe*** aux services dans un cluster, généralement du trafic ***HTTP***.

``` consol 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  defaultBackend:
    service:
      name: 
      port:
        number: 80

``` 

## ***k9s***

K9s surveille votre cluster Kubernetes de façon permanente. Il vous offrira notamment :

* Une bonne compréhension de votre cluster K8s et une bonne ***visibilité de l’état des ressources***
* Une ***navigation facilitée*** à travers les ressources du cluster
* Une possibilité d'***interagir simplement*** avec ces ressources.

###### ***Installer K9s***

        * sudo apt install k9s
        
+ Une fois K9s installé, vous pouvez le lancer depuis le terminal avec la commande: 

        * k9s

K9s affiche différentes informations sur les ressources consultées.
Par example: son âge, le node sur lequel il tourne, la quantité de RAM etc.
Ces informations sont accessibles par les suivants commandes:

    * kubectl get pods
    * kubectl top pods 
    


Pour supprimer les pods plus rapidement, 


### ***Installer Minikube***

        
***Minikube*** est une implémentation Kubernetes légère qui crée une ***machine virtuelle*** sur votre machine locale et déploie un ***cluster simple*** contenant ***un seul nœud***.
        

        * wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
        * chmod +x minikube-linux-amd64
        * sudo mv minikube-linux-amd64 /usr/local/bin/minikube
        * minikube start
        * kubectl cluster-info
        
      
* Les ***nœuds*** communiquent avec le maître à l'aide de l'***API Kubernetes***
