KUBERNETES : Création d’un cluster privé avec Breeze

Réduire
X
Réduire
  •  

  • KUBERNETES : Création d’un cluster privé avec Breeze













    Menu
    1. INSTALLATION OS
    2. CONFIGURATION SERVEUR
    3. CONFIGURATION DNS
    4. INSTALLATION DOCKER
    5. INSTALLATION BREEZE
    6. INTERFACE WEB
    7. CONTRÔLE
    8. DASHBOARD
    9. INSTALLATION TRAEFIK
    10. INSTALLATION HELM
    11. INSTALLATION Let’s Encrypt
    12. INSTALLATION Weave Scope
    13. DEBUG

    Pour réaliser l'installation je me base sur une application Breeze.
    - Breeze (Lien https://github.com/wise2c-devops/breeze/)

    1. INSTALLATION OS

    - sur tout les serveurs

    - Démarrer le serveur
    - boot sur cd ou ISO
    - Sélectionner "Install Centos 7"
    - Sélectionner en francais > Cliquer sur "Poursuivre"
    - Sélectionner des logiciels > "Serveur d'infrastructure" sans aucune option
    - Sélectionner de la sécurité > Désactivé SELINUX
    - Sélectionner hôte et réseau > Choisir le nom de l'hôte
    > Configurer le réseau
    > Bien l'activer au démarrage
    - Sélectionner de la destination > Choisir le volume disque
    > Sélectionner le mode manuel
    > faire en automatique
    > revenir sur le partionnement et diminuer la partition /HOME
    > Créer la partition /var/lib/docker la plus grosse possible
    - Lancer l'installation
    - Choisir le mot de passe ROOT
    - A la fin reboot de la machine

    Voici un tableau récapitulatif de l'infrastructure avec les fonctions et les adresses IP
    VIP kubernetes kubernetes.exemple.local 192.168.1.100
    deploy deploy.exemple.local 192.168.1.236
    harbor harbor.exemple.local 192.168.1.62
    kmaster01 kmaster01.exemple.local 192.168.1.57
    kmaster02 kmaster02.exemple.local 192.168.1.167
    kmaster03 kmaster03.exemple.local 192.168.1.120
    knode01 knode01.exemple.local 192.168.1.37
    knode02 knode02.exemple.local 192.168.1.14
    knode03 knode03.exemple.local 192.168.1.38
    NAS nas.exemple.local 192.168.1.11
    2. CONFIGURATION SERVEUR

    sur tout les serveurs

    Nous contrôlons la configuration réseau et le nom d'hôte
    nmtui
    Mise à jours global et installation de nouvelle application
    yum update -y && yum upgrade -y
    yum install epel-release nfs-utils ntp ca-certificates python-pip net-snmp yum-utils -y
    yum install nrpe nagios-plugins-users nagios-plugins-load nagios-plugins-swap nagios-plugins-disk nagios-plugins-procs -y
    yum install fusioninventory-agent fusioninventory-agent-task-inventory -y
    yum update -y && yum upgrade -y
    Nous désactivons le selinux
    setenforce 0
    sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
    Pour de la pré-production nous désactivons le firewall
    systemctl disable firewalld
    systemctl stop firewall
    Nous lançons le service en mode automatique pour chaque redémarrage
    systemctl start ntpd && systemctl enable ntpd



    Nous contrôlons la synchronisation horaire
    ntpq -p
    ntpdc -l


    Nous redémarrons le serveur
    reboot



    Nous éditons le fichier de configuration pour le NFS
    nano /etc/idmapd.conf



    Voici la ligne à modifier
    Domain = exemple.local

    Nous lançons le service en mode automatique pour chaque redémarrage
    systemctl enable rpcbind && systemctl start rpcbind



    Nous créons le dossier
    mkdir -p /opt/tools



    Nous montons le lecteur distant
    mount 192.168.1.11:/docker/tools /opt/tools



    Nous éditons le fichier de partition
    nano /etc/fstab



    Voici la ligne à rajouter
    120.4.1.151:/docker/tools /opt/tools nfs defaults,_netdev 0 0
    Nous faisons une copie de la configuration par default
    mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak



    Nous en créons un nouveau
    nano /etc/snmp/snmpd.conf



    Voici les lignes à rajouter
    #com2sec paranoid default EN-TETE-PUBLIC
    com2sec readonly default EN-TETE-PRIVEE
    #com2sec readwrite default EN-TETE-PUBLIC
    #group MyRWGroup usm readwrite
    group ROGroup v1 readonly
    informsink 10.59.1.11 EN-TETE-PRIVEE
    # incl/excl subtree mask
    view all included .1 80
    view system included .iso.org.dod.internet.mgmt.mib-2.system
    view system included .1.3.6.1.4.1.2021.11
    view System included .1.3.6.1.2.1.1
    view System included .1.3.6.1.2.1.25.1.1
    ####

    # Finally, grant the 2 groups access to the 1 view with different
    # write permissions:
    # context sec.model sec.level match read write notif
    access MyROSystem "" any noauth exact system none none
    access MyROGroup "" any noauth exact all none none
    access MyRWGroup "" any noauth exact all all none
    access ROGroup "" v1 noauth exact all none none
    # -----------------------------------------------------------------------------
    syslocation France (configure /etc/snmp/snmpd.local.conf)
    syscontact Root <[email protected]> (configure /etc/snmp/snmpd.local.conf)
    # Check the / partition and make sure it contains at least 10 megs.
    disk / 10000
    # MUCH more can be done with the snmpd.conf than is shown as an
    # example here.
    exec .1.3.6.1.4.1.2021.54 hdNum /usr/local/bin/snmpdiskio hdNum
    exec .1.3.6.1.4.1.2021.55 hdIndex /usr/local/bin/snmpdiskio hdIndex
    exec .1.3.6.1.4.1.2021.56 hdDescr /usr/local/bin/snmpdiskio hdDescr
    exec .1.3.6.1.4.1.2021.57 hdInBlocks /usr/local/bin/snmpdiskio hdInBlocks
    exec .1.3.6.1.4.1.2021.58 hdOutBlocks /usr/local/bin/snmpdiskio hdOutBlocks
    Nous modifions le fichier pour l'inventaire
    nano /etc/fusioninventory/agent.cfg




    Voici la ligne modifier
    server = http://glpi.exemple.local/plugins/fusioninventory/

    Nous créons le fichier pour rajouter des commande NRPE futur
    nano /etc/nrpe.d/centreon.cfg




    Voici les lignes à rajouter
    ################################################## ##############################
    # COMMAND DEFINITIONS
    # Syntax:
    # command[]=
    #

    command[users]=/usr/lib64/nagios/plugins/check_users -w 5 -c 10
    command[load]=/usr/lib64/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
    command[check_load]=/usr/lib64/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
    command[swap]=/usr/lib64/nagios/plugins/check_swap -w 20% -c 10%
    command[root_disk]=/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -p / -m
    command[usr_disk]=/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -p /usr -m
    command[var_disk]=/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -p /var -m
    command[zombie_procs]=/usr/lib64/nagios/plugins/check_procs -w 5 -c 10 -s Z
    command[total_procs]=/usr/lib64/nagios/plugins/check_procs -w 190 -c 200
    command[proc_named]=/usr/lib64/nagios/plugins/check_procs -w 1: -c 1:2 -C named
    command[proc_crond]=/usr/lib64/nagios/plugins/check_procs -w 1: -c 1:5 -C crond
    command[proc_syslogd]=/usr/lib64/nagios/plugins/check_procs -w 1: -c 1:2 -C syslog-ng
    command[proc_rsyslogd]=/usr/lib64/nagios/plugins/check_procs -w 1: -c 1:2 -C rsyslogd
    command[check_yum]=/usr/lib64/nagios/plugins/check_yum.py
    Nous modifions le fichier de configuration NRPE
    nano /etc/nagios/nrpe.cfg




    Voici la ligne à modifier
    allowed_hosts=127.0.0.1,::1,centreon,centreon.exem ple.local
    Nous lancons le service en mode automatique pour chaque redémarrage
    systemctl daemon-reload
    systemctl restart snmpd && systemctl enable snmpd
    systemctl restart nrpe && systemctl enable nrpe
    systemctl restart fusioninventory-agent && systemctl enable fusioninventory-agent



    3. CONFIGURATION DNS

    sur le serveur DNS externe

    Avoir créer les enregistrements DNS sur le serveur en powershell.
    Add-DnsServerResourceRecordA -Name "kubernetes" -ZoneName exemple.local -AllowUpdateAny -IPv4Address 192.168.1.100
    Add-DnsServerResourceRecordA -Name "deploy" -ZoneName exemple.local -AllowUpdateAny -IPv4Address 192.168.1.236
    Add-DnsServerResourceRecordA -Name "harbor" -ZoneName exemple.local -AllowUpdateAny -IPv4Address 192.168.1.62
    Add-DnsServerResourceRecordA -Name "kmaster01" -ZoneName exemple.local -AllowUpdateAny -IPv4Address 192.168.1.57
    Add-DnsServerResourceRecordA -Name "kmaster02" -ZoneName exemple.local -AllowUpdateAny -IPv4Address 192.168.1.167
    Add-DnsServerResourceRecordA -Name "kmaster03" -ZoneName exemple.local -AllowUpdateAny -IPv4Address 192.168.1.120
    Add-DnsServerResourceRecordA -Name "knode01" -ZoneName exemple.local -AllowUpdateAny -IPv4Address 192.168.1.37
    Add-DnsServerResourceRecordA -Name "knode02" -ZoneName exemple.local -AllowUpdateAny -IPv4Address 192.168.1.14
    Add-DnsServerResourceRecordA -Name "knode03" -ZoneName exemple.local -AllowUpdateAny -IPv4Address 192.168.1.38
    Add-DnsServerResourceRecordCName -Name "traefik-ui" -HostNameAlias kubernetes.exemple.local -ZoneName exemple.local
    4. INSTALLATION DOCKER

    sur le serveur DEPLOY

    Nous installons docker
    mkdir -p /opt/tools/docker-install/ && cd /opt/tools/docker-install/
    curl -# -LO "https://releases.rancher.com/install-docker/18.06.sh"
    chmod +x 18.06.sh && ./18.06.sh



    Mise en place du droit pour ROOT
    sudo usermod -aG docker root



    Nous lancons le service en mode automatique pour chaque redémarrage
    systemctl start docker && systemctl enable docker



    Nous installons docker-compose
    mkdir -p /opt/tools/docker-compose-install/ && cd /opt/tools/docker-compose-install/
    curl -# -LO "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o docker-compose
    chmod +x docker-compose-Linux-x86_64
    cp /opt/tools/docker-compose-install/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose



    5. INSTALLATION BREEZE

    sur le serveur DEPLOY

    Création de la clé de sécurité
    ssh-keygen




    La déployé sur tout les serveurs
    ssh-copy-id kmaster01
    ssh-copy-id kmaster02
    ssh-copy-id kmaster03
    ssh-copy-id harbor
    ssh-copy-id knode01
    ssh-copy-id knode02
    ssh-copy-id knode03






    Nous créons le répertoire pour les sources
    mkdir -p /opt/tools/breeze/ && cd /opt/tools/breeze/




    Téléchargement du fichier d'installation
    curl -# -LO "https://raw.githubusercontent.com/wise2c-devops/breeze/master/docker-compose.yml" -o docker-compose.yml




    nous lancons l'installations de Breeze
    docker-compose up -d




    Nous pouvons enfin aller sur l'interface graphique

    ou


    6. INTERFACE WEB

    Nous arrivons sur la page principal


    Passer en Anglais


    On valide en cliquant sur le bouton bleue


    Nous pouvons commencer nous cliquons sur Start


    Pour créer le cluster nous cliqosn sur le +


    Nous lui donnons un nom et une description et nous validons sur Ok


    Nous cliquons sur le cluster que nous venons de créer


    Nous devons commencer par saisir l'ensemble des serveurs qui vont nous être utile


    Nous obtenons une liste commence ci-dessous


    Nous pouvons lancer l'installation en cliquant sur "Next step"

    Nous devons saisir la fonction pour chaque d'entre eux.


    la version de docker


    Le paramétrage pour Harbor


    Le paramétrage pour le loadbalancer (VIP)


    Le paramétrage pour l'ETCD


    Le paramétrage pour Kubernetes


    Je ne procéde pas à l'installation de Prometheus car il n'a jamais fonctionné pour moi

    Nous pouvons lancer l'installation en cliquant sur "Next step"


    Lancer l'installation


    Une fois terminé cliquer de "DONE"


    Nous pouvons que l'installation c'est bien passé.


    7. Controle

    Nous pouvons controler que l'ensemble de l'installation est correcte avec les commande suivant

    kubectl get node


    kubectl get cs


    kubectl get csr


    kubectl get nodes -o wide


    kubectl -n kube-system get pods


    8. DASHBOARD

    Pour obtenir le port du dashboard
    kubectl -n kube-system edit service kubernetes-dashboard

    ou


    Pour obtenir le Token
    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
    eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiO.....

    9. INSTALLATION TRAEFIK


    seulement sur kmaster01

    Nous créons le répertoire pour les sources
    mkdir -p /opt/tools/traefik/ && cd /opt/tools/traefik/
    Nous créons le fichier installation
    nano traefik-install.yaml
    Voici les lignes à rajouter
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
    name: traefik
    labels:
    name: traefik
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
    name: traefik-ingress-controller
    rules:
    - apiGroups:
    - ""
    resources:
    - pods
    - services
    - endpoints
    - secrets
    verbs:
    - get
    - list
    - watch
    - apiGroups:
    - extensions
    resources:
    - ingresses
    verbs:
    - get
    - list
    - watch
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: traefik-ingress-controller
    namespace: traefik
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
    name: traefik-ingress-controller
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: traefik-ingress-controller
    subjects:
    - kind: ServiceAccount
    name: traefik-ingress-controller
    namespace: traefik
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: traefik-conf
    namespace: traefik
    data:
    traefik.toml: |
    defaultEntryPoints = ["http","https"]
    [web]
    address = ":8080"
    ---
    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
    name: traefik-ingress-controller
    namespace: traefik
    labels:
    k8s-app: traefik-ingress-lb
    kubernetes.io/cluster-service: "true"
    spec:
    template:
    metadata:
    labels:
    k8s-app: traefik-ingress-lb
    name: traefik-ingress-lb
    spec:
    hostNetwork: true
    serviceAccountName: traefik-ingress-controller
    terminationGracePeriodSeconds: 60
    tolerations:
    - key: node-role.kubernetes.io/master
    effect: NoSchedule
    containers:
    - image: traefik
    name: traefik-ingress-lb
    imagePullPolicy: Always
    volumeMounts:
    - mountPath: /config
    name: traefik-config
    args:
    - --kubernetes
    - --logLevel=INFO
    - --configfile=/config/traefik.toml
    volumes:
    - name: traefik-config
    configMap:
    name: traefik-conf
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: traefik-web-ui
    namespace: traefik
    spec:
    selector:
    k8s-app: traefik-ingress-lb
    ports:
    - port: 80
    targetPort: 8080
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: traefik-web-ui
    namespace: traefik
    annotations:
    kubernetes.io/ingress.class: traefik
    spec:
    rules:
    - host: traefik-ui.exemple.local
    http:
    paths:
    - backend:
    serviceName: traefik-web-ui
    servicePort: 80
    ---
    Nous exécutons le fichier d'installation
    kubectl create -f traefik-install.yaml
    Nous pouvons aller sur l'interface


    10. INSTALL HELM

    Nous créons le répertoire pour les sources
    mkdir /opt/tools/helm/ && cd /opt/tools/helm/
    Nous téléchargons la source
    curl -# -LO "https://storage.googleapis.com/kubernetes-helm/helm-v2.13.0-linux-amd64.tar.gz"
    Nous la décompressons
    tar zxvf helm-v2.13.0-linux-amd64.tar.gz
    nous la déplacons
    mv linux-amd64/helm /usr/local/bin/helm
    nous initialisation
    helm init
    Nous mettons à jour
    helm repo update
    Nous mettons en route la repo de notre application
    helm repo add --username k8s --password k8s@Harbor authentic https://harbor.exemple.local/chartre...ation--ca-file /opt/certificats/ca.crt --cert-file /opt/certificats/server.crt --key-file /opt/certificats/server.key
    Nous
    kubectl -n kube-system create sa tiller
    Nous créons clusterrolebinding
    kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
    Nous créons serviceaccount
    kubectl create serviceaccount tiller --namespace kube-system
    Nous créons le fichier installation
    nano tiller-clusterrolebinding.yaml
    Voici les lignes à rajouter
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
    name: tiller-clusterrolebinding
    subjects:
    - kind: ServiceAccount
    name: tiller
    namespace: kube-system
    roleRef:
    kind: ClusterRole
    name: cluster-admin
    apiGroup: ""
    ---
    Nous exécutons le fichier d'installation
    kubectl create -f tiller-clusterrolebinding.yaml
    Nous mettons en route le service
    helm init --service-account tiller --upgrade
    11. INSTALL Let’s Encrypt


    Nous créons le répertoire pour les sources
    mkdir -p /opt/tools/letsencrypt/ && cd /opt/tools/letsencrypt/
    helm install --name cert-manager --namespace kube-system --set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer stable/cert-manager --version v0.5.2
    Nous créons le fichier installation
    nano letsencrypt-staging-cluster-issuer.yaml
    Voici les lignes à rajouter
    ---
    apiVersion: certmanager.k8s.io/v1alpha1
    kind: ClusterIssuer
    metadata:
    name: letsencrypt-prod
    spec:
    acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
    name: letsencrypt-prod
    http01: {}
    ---
    Nous exécutons le fichier d'installation
    kubectl apply -f letsencrypt-staging-cluster-issuer.yaml
    12. INSTALL Weave Scope

    Nous créons le répertoire pour les sources
    mkdir -p /opt/tools/weavescope/ && cd /opt/tools/weavescope/
    Nous téléchargons la source
    curl -# -LO "https://cloud.weave.works/launch/k8s/weavescope.yaml"
    Nous lancons l'installation
    kubectl create -f "weavescope.yaml"
    Nous pouvons controler que tout est bien en place
    kubectl get pods -n weave
    Nous créons le fichier installation
    nano ingress-weavescope.yaml
    Voici les lignes à rajouter
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: weavescope-ingress
    namespace: weave
    annotations:
    kubernetes.io/ingress.class: traefik
    spec:
    rules:
    - host: weavescope.exemple.local
    http:
    paths:
    - path: /
    backend:
    serviceName: weave-scope-app
    servicePort: app
    ---
    Nous exécutons le fichier d'installation
    kubectl create -f ingress-weavescope.yaml
    Nous pouvons voir l'ensemble des process qui tourne


    13. DEBUG

    Voici quelque commande utile

    find /var -name "*.log" \( \( -size +50M -mtime +7 \) -o -mtime +30 \) -exec truncate {} --size 0 \;
    yum clean all
    rm -rf /var/cache/yum
    rm -rf /var/tmp/yum-*
    package-cleanup --quiet --leaves --exclude-bin
    package-cleanup --oldkernels --count=2
    rm -rf /root/.composer/cache
    rm -rf /home/*/.composer/cache
    find -regex ".*/core\.[0-9]+$" -delete

    kubectl get nodes
    kubectl cordon knode02
    kubectl uncordon knode02
    kubectl drain knode02
    kubectl get pods --all-namespaces
    kubectl get nodes | grep '^.*notReay.*$' | awk '{print $1}' | xargs kubectl describe node

    journalctl -u kubelet
    Dernière modification par hcornet, 05 November 2023, 10h48.
      L'envoi de commentaires est désactivé.

    Article Tags

    Réduire

    Latest Articles

    Réduire

    • Comment prendre le contrôle à distance des sessions utilisateurs
      par hcornet
      ### Pourquoi prendre le contrôle à distance d’une session RDS ?

      Dans une infrastructure RDS, les utilisateurs se connectent à des sessions distantes sur le serveur. Parfois, un support technique doit intervenir directement dans la session de l’utilisateur pour corriger un problème, configurer un paramètre, ou simplement accompagner une formation. La fonctionnalité de contrôle à distance permet cette interaction sans nécessiter que l’utilisateur se déconnecte, facilitant...
      05 November 2025, 09h23
    • Nmap
      par hcornet
      Sommaire

      Lien : https://nmap.org/

      1. Présentation

      Nmap est un utilitaire pour la découverte de réseaux et l'audit de sécurité.
      De nombreux systèmes et réseaux les administrateurs le trouvent également utile pour des tâches telles que le réseau.
      L'inventaire, la gestion des calendriers de mise à niveau des services et la surveillance de l'hôte ou disponibilité du service.
      Nmap utilise des paquets IP bruts de nouvelles manières...
      19 August 2025, 13h07
    • Type d'attaque DNS
      par hcornet
      1. DNS Tunneling

      Le tunneling DNS est une technique utilisée par les attaquants pour contourner les mesures de sécurité réseau en encodant des données dans les requêtes et réponses DNS. Cette règle surveille le trafic DNS à la recherche de requêtes ou de réponses excessives vers des noms de domaine ou des adresses IP inhabituels, ce qui pourrait indiquer une attaque par tunneling DNS.

      MITRE ATT&CK tactique

      Exfiltration
      Command and Control
      ...
      04 August 2025, 10h08
    • Commande réseau indispansable
      par hcornet
      Commande Fonction
      ipconfig affiche la configuration réseau
      ipconfig /all affiche la configuration réseau détaillé
      ipconfig /release libère l'adresse IP pour le serveur DHCP
      ...
      23 July 2025, 09h00
    • Centreon : warning chmod () operation not permitted
      par hcornet
      Lorsqu'on a l'erreur : Warningchmod(): Operation not permitted au moment de l'exportation de la configuration des colleteurs



      Code:
      chown www-data:www-data /etc/centreon-engine/*
      chown www-data:www-data /etc/centreon-broker/*
      ou

      Code:
      chown apache:apache /etc/centreon-engine/*
      chown apache:apache /etc/centreon-broker/*
      ​...
      21 April 2025, 16h53
    • Ls en couleurs
      par hcornet
      Pour avoir ls en couleur il faut taper ls --color. C'est bien me direz vous mais c'est chiant au possible à taper à chaque fois !

      Code:
      alias ls="ls --color=auto"​
      16 April 2025, 11h10
    Chargement...