KUBERNETES : Création d’un cluster privé

Menu

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


Pour é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 controlons 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 desactivons le firewall

systemctl disable firewalld
systemctl stop firewall

Nous lancons le service en mode automatique pour chaque redémarrage

systemctl start ntpd && systemctl enable ntpd

Nous controlons la synchronisation horaire

ntpq -p
ntpdc -l

Nous redémrrons le serveur

reboot

Nous éditons le fichier de configuration pour le NFS

nano /etc/idmapd.conf

Voici la ligne à modifier

Domain = exemple.local

Nous lancons 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 (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.exemple.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
http://deploy.exemple.local:88
ou
http://192.168.1.236:88

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

http://kubernetes.exemple.local:30300
ou
http://192.168.1.100:30300

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
http://traefik-ui.exemple.local

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/chartrepo/application--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: administrateur@fichorga.fr
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
http://weavescope.exemple.local

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

Taggé , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .Mettre en favori le Permaliens.

Les commentaires sont fermés.