---
# System prepended metadata

title: '**Brief 6**'

---

# **Brief 6**
### *Raja Choukri* 
----


### Plan
1. ***Chapitre 1 : Déployer un cluster AKS***
2. ***Chapitre 2 : Déployer un container Redis***
3. ***Chapitre 3 : Déployer un container Voting App***
4. ***Chapitre 4 : Un mot de passe pour Redis***
5. ***Chapitre 5 : Configurer un stockage persistent pour Redis***

## **Chapitre 1 : Déployer un cluster AKS**
---

***1.Déployer un cluster Azure Kubernetes Service (AKS)***
- Azure Cli; 
- Créer une groupes de ressources  : 
 
         *  az group create --location eastus --resource-group brief6-raja

- Créer un cluster AKS avec 2 nodes :

        * az aks create --resource-group brief6-raja --name myAKSCluster  --node-count 2 --ssh-key-value /Users/rajac/.ssh/id_rsa.pub* 
        
- Installer Kubernetes Servers : 
 
        * 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 hold kubelet kubeadm kubectl
      

## **Chapitre 2 : Déployer un container Redis**
---
***1. Créer un Deployment avec une image Redis***



    * az login 
    * az aks get-credentials --resource-group brief6-raja --name myAKSCluster
    
-> creation yml -> nano redis.yml 
 
* nano redis.yml


``` consol 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis
        env:
        - name: ALLOW_EMPTY_PASSWORD
          value: "yes"
        ports:
        - containerPort: 6379
          name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  ports:
  - port: 6379
  selector:
    app: redis   
     
```

- Je lance la comande suivant pour verifié que le fichier redis et été bien crée: 

        * kubectl apply -f redis.yml
        
 
***2. Installer un client Redis sur votre poste de travail***

        * sudo apt-get update
        * sudo apt-get install redis
        
***Tester la connection au container Redis déployé***
    
        * redis-cli -h 20.119.122.206

## **Chapitre 3 : Déployer un container Voting App**

***Créer un Deployment avec une image de l’application Azure Voting App qui dépend de Redis***


- **nano redis.yml**

        
```consol 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  labels:
    app: redislb
spec:
  selector:
    matchLabels:
      app: redislb
  replicas: 1
  template:
    metadata:
      labels:
        app: redislb
    spec:
      containers:
      - name: redis
        image: redis
        ports:
        - containerPort: 6379
          name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: clustredis
spec:
  type: ClusterIP
  ports:
  - port: 6379
  selector:
    app: redislb

```

- Executé la command  pour deployer le redis: 
    
        *kubectl apply -f redis.yml

- **nano vote.yml**

``` consol 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: voteapp
  labels:
    app: voteapplb
spec:
  selector:
    matchLabels:
      app: voteapplb
  replicas: 1
  template:
    metadata:
      labels:
        app: voteapplb
    spec:
      containers:
      - name: voteapp
        image: whujin11e/public:azure_voting_app
        ports:
        - containerPort: 80
        env:
        - name: REDIS
          value: "clustredis"
        - name: STRESS_SECS
          value: "2"
---
apiVersion: v1
kind: Service
metadata:
  name: loadvoteapp
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: voteapplb
    
 ```       

-  Executé la command suivant pour voir si été bien deployer le vote: 
    
        * kubectl apply -f vote.yml
        
- Nous vérifions que le déploiement a bien été créé sur le portail Azure: 

 aller sur myAKSCluster -> Services et entrées -> et on voir que tout bien deployer on vais clique sur l'adresse IP et il vais nou ovrire l'application vote. 
           myAKSCluster -> Charges de travail
 
 
## **Chapitre 4 : Un mot de passe pour Redis**

* Cree mot de passe pour Redis:
 
         * PASSWORD=brief6raja
         * echo -n ${PASSWORD} | base64

* Creation fichier secret.yml

``` consol 
apiVersion: v1
kind: Secret
metadata:
  name: redispw
type: Opaque
data:  
  password: YnJpZWY2cmFqYQ==

``` 
* Ajouter dans la fichier redis.yml la partie secret: 

``` consol

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  labels:
    app: redislb
spec:
  selector:
    matchLabels:
      app: redislb
  replicas: 1
  template:
    metadata:
      labels:
        app: redislb
    spec:
      containers:
      - name: redis
        image: redis
  **    args: ["--requirepass", "$(REDIS_PWD)"]
        env:
        - name: REDIS_PWD
          valueFrom:
            secretKeyRef:
              name: redispw
              key: password
        - name: ALLOW_EMPTY_PASSWORD
  **      value: "no"
        ports:
        - containerPort: 6379
          name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: clustredis
spec:
  type: ClusterIP
  ports:
  - port: 6379
  selector:
    app: redislb
``` 

* Ajouter dans la fichier vote.yml la partie secret

``` consol
apiVersion: apps/v1
kind: Deployment
metadata:
  name: voteapp
  labels:
    app: voteapplb
spec:
  selector:
    matchLabels:
      app: voteapplb
  replicas: 1
  template:
    metadata:
      labels:
        app: voteapplb
    spec:
      containers:
      - name: voteapp
        image: whujin11e/public:azure_voting_app
        ports:
        - containerPort: 80
        env:
        - name: REDIS
          value: "clustredis"
        - name: STRESS_SECS
          value: "2"
**      - name: REDIS_PWD
          valueFrom:
            secretKeyRef:
              name: redispw
**            key: password
---
apiVersion: v1
kind: Service
metadata:
  name: loadvoteapp
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: voteapplb


``` 

## **Chapitre 5 :  Configurer un stockage persistent pour Redis**

- **Créer un PersistentVolumeClaim:** 

``` consol
apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
  name: redisclaim
spec:    
  accessModes:
    - ReadWriteOnce
  ressources: 
    requests:
      storage: 10Gi
  storageClassName: redistor
     
``` 

- **Crée le StorageClass**
 

``` consol

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: redisstor
provisioner: kubernetes.io/azure-disk
parameters: 
  skuName: Standard_LRS
allowVolumeExpannsion: true

``` 

## **Chapitre 6 : Utiliser Azure Application Gateway avec AKS**

1. ***Supprimer le cluster AKS:***

        * az aks delete --resource-group brief6-raja --name myAKSCluster*

2. ***Recréer un cluster AKS avec l’add-on AGIC et 4 nodes***

        
         *  az aks create -g brief6-raja -n agic --ssh-key-value /Users/rajac/.ssh/id_rsa.pub --node-count 4 --enable-managed-identity -a ingress-appgw --appgw-name myApplicationGateway --appgw-subnet-cidr "10.225.0.0/16"
         
         *  az aks get-credentials --name agic --resource-group brief6-raja  

3. ***Créer un ingress dans votre configuration Kubernetes pour l’Application Gateway***
         
         * Créer un Ingress dans la configuration Kubernetes:
    
``` consol
    
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: guestbook
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: loadvoteapp 
            port:
              number: 80
     
 ``` 

* ***créer un nouveau mot de passe pour le fichier secret.yml***

       *  PASSWORD=brief6
       *  echo -n ${PASSWORD} | base64

* ***modifier la partie services de vote.yml supprimer les loadBalancers pour ClusterIP***


## **Chapitre 7 : Un nom de domaine pour Voting App**

        * Adresse IP Gateway: 20.241.198.121
        * http://brief6.simplon-raja.space/
        
        
## **Chapitre 8 : Un certificat TLS pour Voting App**

1. ***Créer un certificat TLS pour la Voting App en utilisant Certbot et le challenge DNS sur votre poste de travail.***

        * sudo apt-get update 
        * sudo apt-get upgrade 
        * sudo apt install software-properties-common -y
        * sudo add-apt-repository ppa:deadsnakes/ppa -y
        * sudo apt install python3.10
        * sudo apt-get update
        * sudo apt-get upgrade
        * pip3 install certbot-plugin-gandi
        * creation nano gandi.ini 
        * chmod 600 gandi.ini
        * certbot certonly --authenticator dns-gandi --dns-gandi-credentials gandi.ini -d brief6.simplon-raja.space
        * cd /etc/letsencrypt/live/brief6.simplon-raja.space
        * ls
        * cat cert.pem privkey.pem > certificat.pem
        * ls 
        * mv certificat.pem /home
        * cd /home
        * ls
        * mv certificat.pem /home/raja
        * cd raja
        * ls 
        

2. ***Updater le certificat de l’Application Gateway***

- Création d'un fichier secrettls.yml où j'ai encoder en base64 les données de clé et de certificat. : 

            * cat tls.crt | base64
            * cat tls.key | base64
            
            * at /var/log/letsencrypt/letsencrypt.log
- dans le fichier ingress.yml que j'ai ajouté dans la partie spec. le nom secret

## **Chapitre 9 : Scaling de la Voting App** 

        * pwd
        * /home/raja
        * nano test_charge.sh
        * nano test_charge.r
    - dans le fichier nano test_de_charge.r j'ai ajouté l'installation des packages suivants :
        - install.packages("data.table")
        - install.packages("ggplot2")
        - install.packages("dplyr")
        
    - après avoir exécuté le script et installé avec succès les trois packages, vous pouvez ensuite les supprimer du fichier nano.
    
        * sudo apt install parallel 
        * sudo apt install r-base-core
        * sudo apt install r-cran-littler
        * sudo Rscript test_de_charge.r
        
* Après avoir installé tout ce dont j'avais besoin pour faire fonctionner le test de charge, j'ai exécuté le script mais j'ai eu quelques problèmes, où le test de charge ne fonctionnait que pour la moitié et donc j'avais des trous découverts, alors j'ai fait un ls et j'ai cherché le test_file et je trouvé que j'avais en fait un ***502 BAD GATEWAY***, pour résoudre le problème que j'ai rencontré de la manière suivante : 
            
            *  nano test_charge.sh 
            *  J'ai ajouté cette ligne dans le fichier:
            *  sed '/ 502 Bad Gateway/I,+2 d' test_file > test_file2
            *  enfin j'ai exécuté le script plusieurs fois avec sudo bash test_charge.sh
        








