Académique Documents
Professionnel Documents
Culture Documents
La bonne pratique consiste à créer un fichier manifest qui sera soumis au contrôleur afin de créer le pod.
Fichier ‘simple.yaml’ :
apiVersion: v1
kind: Pod
metadata:
name: www
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Pour rendre l’application accessible, on utilisera les commande kubectl port-forward afin d’exposer le port
80 vers un port de la machine locale :
➔ kubectl port-forward <resource-type/resource-name> [local_port]:<pod_port>
Exemple
Il est préférable de déployer des pods en les déclarant sous forme de ‘deployment’, ce qui permettra de
pouvoir les maintenir dans l’ état souhaité et d’agir sur le nombre de répliquas.
matchLabels: ← Avec ‘Selector’, on définit quels pods sont gérés par ce déploiement :
deploy: exemple (doit correspondre au label définis pour les pods) Ici, le label est
‘exemple’
template:
metadata: Imbriqué sous ‘spec’, template permet de configurer les pods
labels:
deploy: example ← définir le label des pods
spec:
containers:
- name: nginx
image: nginx:1.7.9 ← spécifie le nom et l’image du container servant à déployer les pods
Il s’agit de mettre en place un déploiement appelé ‘dep1’, basé sur l’image de container ‘nginx’, puis
d’exposer le port 80 du container sur un port de la machine locale (master)
1. kubectl create deployment dep1 --image=nginx/latest
2. kubectl expose deployment dep1 --port=80 --type=NodePort
3. kubectl get deploy,svc
➔ On peut constater qu’un port (ici : 31274) est associé au port 443 du service
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app:dev
name: nginx-deployment Soit on utilise un fichier unique , décrivant le
spec: ‘deployment’ et son port de service
replicas: 2
selector:
matchLabels:
app: dev
template:
metadata:
labels:
app: dev
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Soit on préfère définir en plusieurs fichiers, la description du ‘déployment’ et le service auquel on le fait
correspondre (par le jeu des ‘labels’)
Exemple :
1 - fichier ‘nginx-deploy.yaml’ 2 - fichier ‘nginx-service.yaml’
Exposer le port TCP/80 de l’application déployée, afin de pouvoir s’y connecter depuis l’extérieur
kubectl expose deployment nginx-deployment –type NodePort --port 80
Il en résultera un port TCP local, situé au dessus de 30000 qui sera associé au port 80 du pod de l’application
Il est alors possible de se connecter sur l’application nginx, via http://@_IP du serveur:30511
La mise à l’échelle consiste à faire évoluer le nombre de pods déployés pour la mise en ligne
d’applications.
➔ Les pods sont répliqués, constituant alors une ‘armée’ de machines supportant l’application
désirée.
Fichier hello-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: helloworld
labels:
app: helloworld
Vérifiez que le pod est en marche
spec: kubectl get pods
containers:
- name: helloworld
image: particule/helloworld
ports:
- containerPort: 80
kubectl apply -f hello-pod.yaml
Fichier hello-deploy.yml.
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld
labels:
app: helloworld
spec:
replicas: 1 Supprimez le pod
selector: kuubectl delete pod helloworld
matchLabels:
app: helloworld
template:
metadata: ➔ Le pod n’est pas supprimé !
labels: Pourquoi ?
app: helloworld
spec:
containers:
- name: helloworld
image: particule/helloworld
ports:
- containerPort: 80
3 - Création d'un service
kubectl apply -f hello-deploy.yaml Fichier helloworld-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: helloworld-svc
labels:
app: helloworld
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
selector:
app: helloworld
kubectl apply -f hello-svc.yaml
K8S- T.P. v240302 Jean GAUTIER
kubectl describe svc hello-svc
Connexion aux pods
Le ‘Port Mapping’
• La notion de 'port' précise le n° de port sur lequel le trafic entrant sera reçu
• La notion de 'targetport' précise le n° de port des pods vers lesquels sera redirigé le trafic
Afin de permettre aux applications déployées de communiquer en réseau, il existe plusieurs types de services
• ClusterIP
• NodePort
• ExternalIP
• LoadBalancer
ClusterIP
Chaque cluster Kubernetes dispose d'un réseau interne pour les services.
Le type de service par défaut est ClusterIP, qui fournit une adresse IP virtuelle aux Pods avec ‘Load-
Balancing’ du trafic entre les pods en mode répliquas.
Avec ce mode, les connexions ne sont possibles qu’à l’intérieur du cluster.
NodePort
Un service NodePort expose le service sur un port dans la plage '30000 – 32767', sur chaque nœud
du cluster.
Ce service est accessible aussi bien depuis l'intérieur que depuis l'extérieur, du cluster.
Le service est accessible via l'adresse IP du nœud ainsi que le port alloué.
Dans la spécification du service, le champ nodePort correspond au port de chaque nœud, le champ
port est le port du service et targetPort est le port du pod où le trafic réseau sera reçu.
Fichier 'nodeport.yaml' :
apiVersion: v1
kind: Service
metadata:
Déploiement simple :
name: webapp1-nodeport-svc Fichier 'nginx-nodeport-service.yaml'
labels: apiVersion: v1
app: webapp1-nodeport kind: Service
spec: metadata:
type: NodePort name: nginx-nodeport-service
ports: spec:
- port: 80 type: NodePort
nodePort: 30080 selector:
selector: app: nginx
app: webapp1-nodeport ports:
--- - protocol: TCP
apiVersion: apps/v1 port: 80
kind: Deployment targetPort: 1080
metadata: nodePort: 30080
name: webapp1-nodeport-deployment
spec:
replicas: 2
selector:
matchLabels:
app: webapp1-nodeport
template:
metadata:
labels:
app: webapp1-nodeport
spec:
containers:
- name: webapp1-nodeport-pod
image: nginx:latest
ports:
- containerPort: 80
➔ L'application devient accessible depuis l’extérieur, en ciblant l'adresse IP du 'node' sur lequel
l'application est disponible et le port défini en tant que 'nodeport'
Pour exposer le service uniquement sur une IP, il faut utiliser le service 'ExternalIP'
Exemple
apiVersion: v1
kind: Service
metadata:
name: nginx-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
Alors que l'URL spécifiée n'est pas réellement définie, il faudra spécifier le nom, lors de la requête de
connexion
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: srv.labo
http:
paths:
- path: /foo
backend:
serviceName: service-1
servicePort: 82
- path: /bar
backend:
serviceName: service-2
servicePort: 84
Mise en place
kubectl apply -f pomme.yaml
kubectl apply -f banane.yaml
kubectl create -f ingress.yaml
Tests de connexion
curl -kL http://localhost/pomme
pomme
Créer 2 x serveurs WEB afin de les rendre accessibles, via le service nginx
Exemple :
Affecter un label à un node :
• kubectl label nodes node1 SRV=1
• kubectl label nodes node2 SRV=2
L'option 'NodeSelector'
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
manager: robert
template:
metadata:
labels:
manager: robert
spec:
nodeSelector:
datacenter: alpha
containers:
- name: nginx
image: particule/helloworld
ports:
- containerPort: 80
Exemple
Placer tous les pods sur des nodes ayant un label ‘datacenter=alpha’
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-affinity-alpha
spec:
replicas: 2
selector:
matchLabels:
app: scheduling
template:
metadata:
labels:
app: scheduling
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: datacenter
operator: In
values:
- alpha
containers:
- name: alpha
image: particule/helloworld
ports:
- containerPort: 80
Exemple
Interdire de provisionner un pod sur un node possédant déjà un pod avec un label ‘app=scheduling’
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-antiaff
spec:
replicas: 2
selector:
matchLabels:
app: scheduling
template:
metadata:
labels:
app: scheduling
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- scheduling
topologyKey: "kubernetes.io/hostname"
containers:
- name: alpha
image: particule/helloworld
ports:
- containerPort: 80
Exemple :
Empêcher le provisionnement de pod sur un node.
• Les taints sont appliquées aux nodes
• Les tolerations sont appliquées aux pods
Exemple
---
apiVersion: v1
kind: Pod
metadata:
name: alpha
spec:
containers:
- name: alpha
image: particule/helloworld
➔ Tant que le pod ne tolère aucun 'taint', il ne peut pas être provisionné !
Fichier ‘traefik/values.yaml’
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
additionalArguments:
- "--api"
- "--api.dashboard=true"
- "--api.insecure=true"
- "--log.level=DEBUG"
ports:
traefik:
expose: true
providers:
kubernetesCRD:
allowCrossNamespace: true
Fichier 'ingress-traefik.yaml'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mailhog-traefik
spec:
ingressClassName: traefik
rules:
- host: "mailhog-traefik.eni.yannig.ovh"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mailhog
port:
number: 8025