- Préambule
- Etape 1 : Namespace
- Etape 2 : pod
- Etape 3 : deployment
- Etape 4 : service
- Etape 5 : ingress
Quelques liens utiles:
- https://kubernetes.io/docs/reference/kubectl/cheatsheet/
- https://www.gitbook.com/book/ramitsurana/awesome-kubernetes/details
https://kubernetes.io/docs/tasks/tools/install-kubectl/
Déchiffre la configuration de kubectl
gpg --output kubeconfig --decrypt kubeconfig.enc
Copie la configuration de kubeconfig dans ~/.kube/config (à éditer si elle existe déjà)
Crée ton namespace
Solution
kubectl create ns tau
ou
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: tau
EOF
Question: Quelles resources sont présentes dans le namespace ?
Réponse
kubectl get serviceaccount --namespace tau
Le serviceaccount "default". L'important ici est de bien noter l'option --namespace
qui permet
de préciser le namespace avec lequel on travaille.
Il est possible de changer le namespace par défaut en éditant le fichier ~/.kube/config
ou en utilisant un outil
comme kubens.
Change de namespace par défaut pour utiliser le tiens
Solution 1
vi ~/.kube/config
contexts:
- context:
cluster: xke.techx.fr
user: xke.techx.fr
namespace: changeme
name: xke.techx.fr
Solution 2
kubectl config set-context $(kubectl config current-context) --namespace=changeme
L'outil https://github.com/ahmetb/kubectx est très pratique pour changer de namespace et de contexte.
Crée un pod à partir d'un manifest yaml composé de:
- un conteneur nginx
- un conteneur tauffredou/quote-logger
Solution
kubectl apply -f solutions/ex1.1/pod.yaml
Question: Quel est l'ip du pod?
Réponse 1
kubectl get po exo1.1 -o wide
Réponse 2
kubectl get po exo1.1 -o jsonpath='{.status.podIP}'
Question: Comment joindre le serveur nginx depuis quote-logger ? Depuis un autre pod ?
Réponse
kubectl exec exo1.1 -c quote-logger curl localhost
Affiche les logs du quote-logger dans le pod
Solution
kubectl logs exo1.1 -c quote-logger
Entre dans le conteneur nginx pour afficher les variables d'environement
Solution
kubectl exec exo1.1 -c nginx env
Supprime le pod à l'aide de la commande
kubectl delete
Solution
kubectl delete pod exo1.1
Question: Quel est l'état du pod ?
Réponse
Le pod est complétement supprimé. Il n'est pas relancé. Il n'est pas redémarrable, il n'y pas d'état "stoppé".
Il est possible de démarrer un pod en ligne de commande avec kubectl run
Démarre un conteneur quote-logger en ligne de commande
Solution
kubectl run exo1dot2 --image tauffredou/quote-logger
Question: Quelles ressouces supplémentaires ont été créées ?
Réponse
deployment, replicatset
Supprime le pod précédement créé
Solution
kubectl delete po exo1dot2-67455455bf-d86sw
Question : Quel est l'état du pod cette fois-ci ?
Réponse
Le pod est supprimé. En revanche, un autre pod identique au premier est créé pour satisfaire les contraintes du deployment (1 réplique)
A partir de cette étape, nous allons construire l'application clickcount
Crée un manifest de deployment du composant "redis" :
- image: redis
- replicas: 1
- le pod contient un "label" nommé "component" de valeur "redis"
Solution
kubectl apply -f solutions/ex3.1/deployment.yaml
Crée un manifest de deployment du composant "web" :
- image: tauffredou/clickcount
- replicas: 3
- le pod contient un "label" nommé "component" de valeur "web"
- l'adresse du redis est définie par une variable d'environnement nommée REDIS_HOST
Note: la valeur de REDIS_HOST peut être devinée dès cette étape mais la définition sera abordée dans l'étape suivante (service)
Question : combien de pods ont été alloués lors de mon deployment ?
Réponse
kubectl get deploy
(colonne CURRENT
)
ou
kubectl get pod
=> 3 pods
Réduire le nombre de replicas du composant "web" à 2 instances
Solution
sed -i 's/replicas: .\*$/replicas: 2/' solutions/ex3.2/deployment-web.yaml
kubectl apply -f app/ex3.2/deployment-web.yaml
Retire 2 répliques au deployment via la commande scale
Solution
kubectl scale deployment web --replicas 2
Crée un service qui expose le deployment de redis
Tips pour les plus valeureux: Il n'y a qu'une seule instance de redis. Il n'est pas nécessaire d'utiliser un loadbalancer pour y accéder. La définition d'un service reste requis.
Solution
kubectl apply -f solutions/ex4.1/service-redis.yaml
Affiche la description du service
Solution
kubectl describe service redis
Question : que remarque-t-on ?
Réponse
- le service crée une adresse Ip (virtuelle)
- la liste des endpoints est vide (le déploiement avait été supprimé, aucun routage possible !)
Question: Quelle est l'adresse du service au sein du namespace ?
Crée un service qui expose le deployment de web en testant les types de services:
- LoadBalancer
- NodePort
- ClusterIp
Question: Sachant que les noeuds du cluster sont dans un réseau privé, quel type de service vous semble le plus adapté pour exposer le composant "web" sur internet ?
Solution
kubectl apply -f solutions/ex4.2/service-web.yaml
=> utilisation de ClusterIp (option par défaut) et d'un ingress à l'étape suivante
Question: Quelle est l'adresse du service au sein du cluster ?
Réponse
kubectl get service web
ou
kubectl describe service web
Crée un ingress pour exposer le service web sur le host .xke.techx.fr.
Note: le wildcard *.xke.techx.fr est configuré pour pointer sur l'ingress controller du cluster kubernetes.
Solution
kubectl apply -f solutions/ex5.1/ingress.yaml
Crée un ingress rediriger le path / vers le service web sur le host all.xke.techx.fr.
Solution
kubectl apply -f solutions/ex5.2/ingress-path.yaml