Kubectl
Prérequis
- Une machine Linux Ubuntu ou Debian
- 8 CPU, 16GB RAM, 100GB Disk
- Docker Install
- Minikube Install
- kubectl Install
- Stern Docs Release
- jq Install
- 3 terminal SSH
Installation de minikube
Linux
mkdir bin && cd bin
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.29.0/minikube-linux-amd64
chmod +x minikube
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.26.1/bin/linux/amd64/kubectl
chmod +x kubectl
cd ..MacOs
mkdir bin && cd bin
curl -Lo minikube https://github.com/kubernetes/minikube/releases/v1.29.0/download/minikube-darwin-arm64
chmod +x minikube
curl -LO https://dl.k8s.io/release/v1.26.1/bin/darwin/arm64/kubectl
chmod +x kubectl
cd ..Et ajouter les variables d’environnement :
export MINIKUBE_HOME=$(pwd);
export PATH=$MINIKUBE_HOME/bin:$PATH
export KUBECONFIG=$MINIKUBE_HOME/.kube/config
export KUBE_EDITOR="code -w"Conserver les paramètres de Vim dans .vimrc
Nous examinons les paramètres importants de Vim si vous souhaitez travailler avec YAML pendant le TP K8s.
Paramètres
Créez d’abord ou ouvrez (s’il existe déjà) le fichier .vimrc :
vim ~/.vimrcSaisissez ensuite (en mode insertion activé avec i) les lignes suivantes :
alias k=kubectlSauvegardez et fermez le fichier en appuyant sur Esc suivi de :x et Enter.
Démarrer le cluster Kubernetes
Linux
minikube start --memory=8192 --cpus=3 --kubernetes-version=v1.26.1 --vm-driver=dockerAvec un proxy :
minikube start --memory=8192 --cpus=3 --docker-env HTTPS_PROXY=$HTTPS_PROXY --docker-env HTTP_PROXY=$HTTP_PROXY --docker-env=NO_PROXY=$NO_PROXY --kubernetes-version=v1.26.1 --vm-driver=dockerMacOs
minikube start --memory=8192 --cpus=3 --kubernetes-version=v1.26.1 --vm-driver=dockerAvec un proxy :
minikube start --memory=8192 --cpus=3 --docker-env HTTPS_PROXY=$HTTPS_PROXY --docker-env HTTP_PROXY=$HTTP_PROXY --docker-env=NO_PROXY=$NO_PROXY --kubernetes-version=v1.26.1 --vm-driver=dockerEt le résultat doit être quelque chose de similaire :
😄 [devnation] minikube v1.20.0 on Darwin 11.3
✅ Created a new profile : devnation
✅ minikube profile was successfully set to devnation
😄 [default] minikube v1.29.0 on Darwin 11.3
✨ Selecting 'virtualbox' driver from user configuration (alternates: [hyperkit])
🔥 Creating virtualbox VM (CPUs=2, Memory=8192MB, Disk=50000MB) ...
🐳 Preparing Kubernetes v1.26.1 on Docker '20.10.6' ...
▪ apiserver.enable-admission-plugins=LimitRanger,NamespaceExists,NamespaceLifecycle,ResourceQuota,ServiceAccount,DefaultStorageClass,MutatingAdmissionWebhook
🚜 Pulling images ...
🚀 Launching Kubernetes ...
⌛ Waiting for cluster to come online ...
🏄 Done! kubectl is now configured to use "devnation"Enfin, configurez l’utilisation de minikube internal docker comme docker host :
eval $(minikube docker-env)Installation de l’ingress controller
minikube addons enable ingressVérifier que l’ingress controller est bien installé :
kubectl get pods -n ingress-nginxRésultat :
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-g9g49 0/1 Completed 0 11m
ingress-nginx-admission-patch-rqp78 0/1 Completed 1 11m
ingress-nginx-controller-59b45fb494-26npt 1/1 Running 0 11mInstallation de Kubernetes Dashboard
Le tableau de bord Kubernetes fournit une interface utilisateur web pour la gestion du cluster Kubernetes. Minikube installe le tableau de bord en tant qu’extension, mais il est désactivé par défaut. Avant d’utiliser le tableau de bord, nous devons activer l’extension Dashboard, ainsi que l’extension metrics-server, une extension d’assistance conçue pour collecter les métriques d’utilisation du cluster Kubernetes. Pour accéder au tableau de bord depuis Minikube, nous pouvons utiliser la commande minikube dashboard , qui ouvre un nouvel onglet dans notre navigateur web affichant le tableau de bord Kubernetes, mais seulement après avoir listé, activé et vérifié les extensions requises :
minikube addons listminikube addons enable metrics-serverminikube addons enable dashboardminikube dashboard API avec “kubectl proxy”
En émettant la commande proxy kubectl , kubectl s’authentifie auprès du serveur API sur le nœud du plan de contrôle et rend les services disponibles sur le port proxy par défaut 8001 .
Tout d’abord, nous exécutons la commande kubectl proxy :
kubectl proxyDébut de diffusion sur 127.0.0.1:8001
Il verrouille le terminal tant que le proxy est en cours d’exécution, à moins que nous ne l’exécutions en arrière-plan (avec kubectl proxy & ).
Lorsque le proxy kubectl est en cours d’exécution, nous pouvons envoyer des requêtes à l’API via l’ hôte local sur le port proxy par défaut 8001 (à partir d’un autre terminal, puisque le proxy verrouille le premier terminal lorsqu’il s’exécute au premier plan) :
curl http://localhost:8001/{
"chemins": [
"/api",
"/api/v1",
"/apis",
"/apis/apps",
......
......
"/logs",
"/metrics",
"/openapi/v2",
"/version"
]
}Avec la requête curl ci-dessus , nous avons demandé tous les points de terminaison de l’API au serveur d’API. En cliquant sur le lien ci-dessus (dans la commande curl ), la même liste s’ouvrira dans un onglet de navigateur.
Nous pouvons explorer plusieurs combinaisons de chemins avec curl ou dans un navigateur également, telles que :
http://localhost:8001/api/v1http://localhost:8001/apis/apps/v1http://localhost:8001/healthzhttp://localhost:8001/metricsParlez à votre Cluster
echo $KUBECONFIG
kubectl config viewAffiche les paramètres fusionnés de kubeconfig
Vue du noeud
kubectl get nodes
kubectl get nodes --show-labels
kubectl get namespacesAffiche tous les noeuds, les labels définit et les espaces de noms.
Voir les Pods prêts à l’emploi
Votre fournisseur de Kubernetes comprend probablement de nombreuses espaces de noms prêtes à l’emploi :
kubectl get pods --all-namespaces
kubectl get pods --all-namespaces --show-labels
kubectl get pods --all-namespaces -o wideAffiche tous les espaces de noms, les labels définit et les sorties. Les espaces de noms sont destinés à être utilisés dans des environnements avec de nombreux utilisateurs répartis sur plusieurs équipes ou projets. Les espaces de noms sont un moyen de diviser les ressources du cluster entre plusieurs utilisateurs
Déployer quelque chose
Créer un espace de nommage et déployer quelque chose :
kubectl create namespace mystuff
kubectl config set-context --current --namespace=mystuff
kubectl create deployment myapp --image=quay.io/rhdevelopers/quarkus-demo:v1La commande “kubectl config set-context” permet une bascule rapide entre les namespaces du cluster kubernetes.
Tout en surveillant les événements
terminal 2
watch kubectl get events --sort-by=.metadata.creationTimestampLAST SEEN TYPE REASON OBJECT MESSAGE
<unknown> Normal Scheduled pod/myapp-5dcbf46dfc-ghrk4 Successfully assigned mystuff/myapp-5dcbf46dfc-ghrk4 to g
cp-5xldg-w-a-5ptpn.us-central1-a.c.ocp42project.internal
29s Normal SuccessfulCreate replicaset/myapp-5dcbf46dfc Created pod: myapp-5dcbf46dfc-ghrk4
29s Normal ScalingReplicaSet deployment/myapp Scaled up replica set myapp-5dcbf46dfc to 1
21s Normal Pulling pod/myapp-5dcbf46dfc-ghrk4 Pulling image "quay.io/burrsutter/quarkus-demo:1.0.0"
15s Normal Pulled pod/myapp-5dcbf46dfc-ghrk4 Successfully pulled image "quay.io/burrsutter/quarkus-dem
o:1.0.0"
15s Normal Created pod/myapp-5dcbf46dfc-ghrk4 Created container quarkus-demo
15s Normal Started pod/myapp-5dcbf46dfc-ghrk4 Started container quarkus-demoLa commande “watch” permet d’initer une écoute en temps réel des modifications d’un objet.
Objets créés
Déploiements
kubectl get deploymentsNAME READY UP-TO-DATE AVAILABLE AGE
myapp 1/1 1 1 95sLa sortie observer permet de connaitre l’état du déploiment d’un ou plusieurs pods. Le déploiement fournit des mises à jour déclaratives pour Pods et ReplicaSets. Il permet de décrire l’état désiré et le controlleur du déploiement change l’état réel à l’état souhaité.
Replicasets
kubectl get replicasetsNAME DESIRED CURRENT READY AGE
myapp-5dcbf46dfc 1 1 1 2m1sLa sortie observer permet de connaitre l’état d’un ensemble stable de Pods à un moment donné. Cet objet est souvent utilisé pour garantir la disponibilité d’un certain nombre identique de Pods.
Pods
kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELS
myapp-5dcbf46dfc-ghrk4 1/1 Running 0 2m18s app=myapp,pod-template-hash=5dcbf46dfcLa sortie observer permet de connaitre l’état du pod. Les Pods sont les plus petites unités informatiques déployables qui peuvent être créées et gérées dans Kubernetes.
Un pod (terme anglo-saxon décrivant un groupe de baleines ou une gousse de pois) est un groupe d’un ou plusieurs conteneurs (comme des conteneurs Docker), ayant du stockage/réseau partagé, et une spécification sur la manière d’exécuter ces conteneurs. Les éléments d’un pod sont toujours co-localisés et co-ordonnancés, et s’exécutent dans un contexte partagé. Un pod modélise un “hôte logique” spécifique à une application - il contient un ou plusieurs conteneurs applicatifs qui sont étroitement liés — dans un monde pré-conteneurs, être exécuté sur la même machine physique ou virtuelle signifierait être exécuté sur le même hôte logique.
Logs
kubectl logs -l app=myapp2020-03-22 14:41:30,497 INFO [io.quarkus] (main) Quarkus 0.22.0 started in 0.021s. Listening on: http://0.0.0.0:8080
2020-03-22 14:41:30,497 INFO [io.quarkus] (main) Installed features: [cdi, resteasy]Exposer un service
kubectl expose deployment myapp --port=8080 --type=LoadBalancerterminal 2
watch kubectl get servicesNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp LoadBalancer 172.30.103.41 <pending> 8080:31974/TCP 4sKubernetes ServiceTypesvous permet de spécifier le type de service que vous souhaitez. La valeur par défaut est ClusterIP.
Type les valeurs et leurs comportements sont:
ClusterIP: Expose le service sur une IP interne au cluster. Le choix de cette valeur rend le service uniquement accessible à partir du cluster. C’est la valeur par défaut ServiceType.
NodePort: Expose le service sur l’IP de chaque nœud à un port statique (le NodePort). Un ClusterIPservice, vers lequel le NodePortservice est acheminé, est automatiquement créé. Vous pourrez contacter le NodePortService, depuis l’extérieur du cluster, en faisant la demande :.
LoadBalancer: Expose le service en externe à l’aide de l’équilibreur de charge d’un fournisseur de cloud. NodePortet les ClusterIPservices, vers lesquels les itinéraires de l’équilibreur de charge externe, sont automatiquement créés.
ExternalName: Mappe le service au contenu du externalNamechamp (par exemple foo.bar.example.com), en renvoyant un CNAME enregistrement avec sa valeur. Aucun mandataire d’aucune sorte n’est mis en place.
Parler aux applications
terminal 3
minikube service myapp --url -n mystuffhttp://127.0.0.1:54134terminal 1
URL=http://127.0.0.1:54134Sondez le résultat :
while true
do curl $URL
sleep .3
doneRésultats du sondage :
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-ghrk4:289
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-ghrk4:290
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-ghrk4:291
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-ghrk4:292
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-ghrk4:293Terminal 3 Changer les répliques :
kubectl scale deployment myapp --replicas=3NAME READY STATUS RESTARTS AGE
myapp-5dcbf46dfc-6sn2s 0/1 ContainerCreating 0 4s
myapp-5dcbf46dfc-ghrk4 1/1 Running 0 5m32s
myapp-5dcbf46dfc-z6hqw 0/1 ContainerCreating 0 4sCommencez une mise à jour continue en changeant l’image :
kubectl set image deployment/myapp quarkus-demo=quay.io/rhdevelopers/myboot:v1Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-6sn2s:188
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-z6hqw:169
Aloha from Spring Boot! 0 on myapp-58b97dbd95-vxd87
Aloha from Spring Boot! 1 on myapp-58b97dbd95-vxd87
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-6sn2s:189
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-z6hqw:170
Aloha from Spring Boot! 2 on myapp-58b97dbd95-vxd87kubectl set image deployment/myapp quarkus-demo=quay.io/rhdevelopers/myboot:v2Bonjour from Spring Boot! 2 on myapp-7d58855c6b-6c8gd
Bonjour from Spring Boot! 3 on myapp-7d58855c6b-6c8gd
Aloha from Spring Boot! 7 on myapp-58b97dbd95-mjlwx
Bonjour from Spring Boot! 4 on myapp-7d58855c6b-6c8gd
Aloha from Spring Boot! 8 on myapp-58b97dbd95-mjlwx
Bonjour from Spring Boot! 5 on myapp-7d58855c6b-6c8gdkubectl set image deployment/myapp quarkus-demo=quay.io/rhdevelopers/quarkus-demo:v1Bonjour from Spring Boot! 14 on myapp-7d58855c6b-dw67s
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-tcfwp:3
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-tcfwp:4
Bonjour from Spring Boot! 15 on myapp-7d58855c6b-dw67s
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-tcfwp:5
Bonjour from Spring Boot! 13 on myapp-7d58855c6b-72wp8
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-7rkxj:1
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-7rkxj:2
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-7lf9t:1
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-7rkxj:3
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-7lf9t:2
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-7lf9t:3
Supersonic Subatomic Java with Quarkus myapp-5dcbf46dfc-tcfwp:6Nettoyage
kubectl delete namespace mystuff
kubectl config set-context --current --namespace=defaultA vous de jouez !
Créer un namespace de nom starting.
Dans le namespace, créez un deploiement nommée my-dep en ligne de commande (kubectl) avec :
- Une image httpd:alpine
- 2 replicas
- Port 8080
Réaliser un downscale du déploiement à 1.
