Vous trouverez sur cette page la procédure à suivre pour créer des services Kubernetes dans un cluster Google Kubernetes Engine (GKE). Pour en savoir plus sur le concept de service et découvrir les différents types de services, consultez la page Service.
Présentation
Dans l'idée, un service consiste à regrouper un ensemble de points de terminaison de pods dans une seule ressource. Vous pouvez configurer différents types d'accès à ce regroupement. Par défaut, vous obtenez une adresse IP de cluster stable que les clients du cluster peuvent utiliser afin de contacter les pods du service. Un client envoie une requête à l'adresse IP stable, et la requête est acheminée vers l'un des pods du service.
Il existe cinq types de services :
- ClusterIP (par défaut)
- NodePort
- LoadBalancer
- ExternalName
- Headless
Par défaut, les clusters Autopilot sont publics. Si vous choisissez un cluster Autopilot privé, vous devez configurer Cloud NAT pour établir des connexions Internet sortantes, par exemple pour extraire des images de DockerHub.
Cette page comporte plusieurs exercices. Dans chaque exercice, vous créez un déploiement et exposez ses pods en créant un service. Vous envoyez ensuite une requête HTTP au service.
Avant de commencer
Avant de commencer, effectuez les tâches suivantes :
- Activez l'API Google Kubernetes Engine. Activer l'API Google Kubernetes Engine
- Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande
gcloud components update
.
Créer un service de type ClusterIP
Dans cette section, vous allez créer un service de type ClusterIP
.
kubectl apply
Voici le fichier manifeste d'un déploiement :
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
selector:
matchLabels:
app: metrics
department: sales
replicas: 3
template:
metadata:
labels:
app: metrics
department: sales
spec:
containers:
- name: hello
image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
Copiez le fichier manifeste dans un fichier nommé my-deployment.yaml
, puis créez le déploiement :
kubectl apply -f my-deployment.yaml
Vérifiez que trois pods sont en cours d'exécution :
kubectl get pods
Le résultat affiche trois pods en cours d'exécution :
NAME READY STATUS RESTARTS AGE
my-deployment-dbd86c8c4-h5wsf 1/1 Running 0 7s
my-deployment-dbd86c8c4-qfw22 1/1 Running 0 7s
my-deployment-dbd86c8c4-wt4s6 1/1 Running 0 7s
Voici le fichier manifeste d'un service de type ClusterIP
:
apiVersion: v1
kind: Service
metadata:
name: my-cip-service
spec:
type: ClusterIP
# Uncomment the below line to create a Headless Service
# clusterIP: None
selector:
app: metrics
department: sales
ports:
- protocol: TCP
port: 80
targetPort: 8080
Le service contient un sélecteur qui spécifie deux libellés :
app: metrics
department: sales
Chaque pod du déploiement que vous venez de créer comporte ces deux libellés. Les pods du déploiement deviendront donc des membres de ce service.
Copiez le fichier manifeste dans un fichier nommé my-cip-service.yaml
, puis créez le service :
kubectl apply -f my-cip-service.yaml
Attendez quelques minutes que Kubernetes attribue une adresse interne stable au service, puis affichez ce dernier :
kubectl get service my-cip-service --output yaml
Le résultat affiche une valeur pour clusterIP
:
spec:
clusterIP: 10.59.241.241
Notez la valeur de clusterIP
. Elle vous servira un peu plus tard.
Console
Créer un déploiement
Accédez à la page Charges de travail dans la console Google Cloud.
Cliquez sur add_box Déployer.
Sous Spécifier un conteneur, sélectionnez Image existante du conteneur.
Dans le champ Chemin de l'image, saisissez
us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
Cliquez sur OK, puis sur Continuer.
Sous Configuration, dans le champ Nom de l'application, saisissez
my-deployment
.Sous Libellés, créez les libellés suivants :
- Clé :
app
et Valeur :metrics
- Clé :
department
et Valeur :sales
- Clé :
Sous Cluster, choisissez le cluster dans lequel vous souhaitez créer le déploiement.
Cliquez sur Déployer.
Lorsque votre déploiement est prêt, la page Informations sur le déploiement s'affiche. Sous Pods gérés, vous pouvez voir que votre déploiement comporte un ou plusieurs pods en cours d'exécution.
Créer un service pour exposer le déploiement
- Sur la page Informations sur le déploiement, cliquez sur list Actions > Exposer.
Dans la boîte de dialogue Exposer, sous Mappage de port, définissez les valeurs suivantes :
- Port :
80
- Port cible :
8080
- Protocole :
TCP
- Port :
Dans la liste déroulante Type de service, sélectionnez Adresse IP de cluster.
Cliquez sur Exposer.
Lorsque votre service est prêt, la page Informations sur le service s'ouvre, avec toutes les informations relatives à votre service. Sous Adresse IP de cluster, notez l'adresse IP que Kubernetes a attribuée à votre service. Il s'agit de l'adresse IP qui peut permettre aux clients internes d'appeler le service.
Accéder au service
Répertoriez vos pods en cours d'exécution :
kubectl get pods
Dans le résultat, copiez l'un des noms de pods commençant par my-deployment
.
NAME READY STATUS RESTARTS AGE
my-deployment-dbd86c8c4-h5wsf 1/1 Running 0 2m51s
Obtenez une interface système dans l'un de vos conteneurs en cours d'exécution :
kubectl exec -it POD_NAME -- sh
Remplacez POD_NAME
par le nom de l'un des pods dans my-deployment
.
Dans votre interface système, installez curl
:
apk add --no-cache curl
Dans le conteneur, envoyez une requête à votre service via votre adresse IP de cluster et le port 80. Notez que 80 correspond à la valeur du champ port
de votre service. C'est le port que vous utilisez en tant que client du service.
curl CLUSTER_IP:80
Remplacez CLUSTER_IP
par la valeur de clusterIP
dans votre service.
Votre requête est transférée à l'un des pods membres sur le port TCP 8080, qui correspond à la valeur du champ targetPort
. Notez que chacun des pods membres du service doit avoir un conteneur qui écoute sur le port 8080.
La réponse affiche le résultat de hello-app
:
Hello, world!
Version: 2.0.0
Hostname: my-deployment-dbd86c8c4-h5wsf
Pour quitter l'interface système de votre conteneur, saisissez exit
.
Créer un service de type NodePort
Dans cette section, vous allez créer un service de type NodePort
.
kubectl apply
Voici le fichier manifeste d'un déploiement :
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment-50000
spec:
selector:
matchLabels:
app: metrics
department: engineering
replicas: 3
template:
metadata:
labels:
app: metrics
department: engineering
spec:
containers:
- name: hello
image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
env:
- name: "PORT"
value: "50000"
Examinons l'objet env
dans le fichier manifeste. L'objet env
spécifie que la variable d'environnement PORT
du conteneur en cours d'exécution aura une valeur de 50000
. L'application hello-app
écoute sur le port spécifié par la variable d'environnement PORT
. Dans cet exercice, vous indiquez donc au conteneur d'écouter sur le port 50000.
Copiez le fichier manifeste dans un fichier nommé my-deployment-50000.yaml
, puis créez le déploiement :
kubectl apply -f my-deployment-50000.yaml
Vérifiez que trois pods sont en cours d'exécution :
kubectl get pods
Voici le fichier manifeste d'un service de type NodePort :
apiVersion: v1
kind: Service
metadata:
name: my-np-service
spec:
type: NodePort
selector:
app: metrics
department: engineering
ports:
- protocol: TCP
port: 80
targetPort: 50000
Copiez le fichier manifeste dans un fichier nommé my-np-service.yaml
, puis créez le service :
kubectl apply -f my-np-service.yaml
Consultez le Service :
kubectl get service my-np-service --output yaml
Le résultat affiche la valeur nodePort
:
...
spec:
...
ports:
- nodePort: 30876
port: 80
protocol: TCP
targetPort: 50000
selector:
app: metrics
department: engineering
sessionAffinity: None
type: NodePort
...
Créez une règle de pare-feu pour autoriser le trafic TCP sur le port de votre nœud :
gcloud compute firewall-rules create test-node-port \
--allow tcp:NODE_PORT
Remplacez NODE_PORT
par la valeur du champ nodePort
de votre service.
Console
Créer un déploiement
Accédez à la page Charges de travail dans la console Google Cloud.
Cliquez sur add_box Déployer.
Sous Spécifier un conteneur, sélectionnez Image existante du conteneur.
Dans le champ Chemin de l'image, saisissez
us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
.Cliquez sur add Ajouter une variable d'environnement.
Pour Clé, saisissez
PORT
, et pour Valeur, saisissez50000
.Cliquez sur OK, puis sur Continuer.
Sous Configuration, dans le champ Nom de l'application, saisissez
my-deployment-50000
.Sous Libellés, créez les libellés suivants :
- Clé :
app
et Valeur :metrics
- Clé :
department
et Valeur :engineering
- Clé :
Sous Cluster, choisissez le cluster dans lequel vous souhaitez créer le déploiement.
Cliquez sur Déployer.
Lorsque votre déploiement est prêt, la page Informations sur le déploiement s'affiche. Sous Pods gérés, vous pouvez voir que votre déploiement comporte un ou plusieurs pods en cours d'exécution.
Créer un service pour exposer le déploiement
- Sur la page Informations sur le déploiement, cliquez sur list Actions > Exposer.
Dans la boîte de dialogue Exposer, sous Mappage de port, définissez les valeurs suivantes :
- Port :
80
- Port cible :
50000
- Protocole :
TCP
- Port :
Dans la liste déroulante Type de service, sélectionnez Port du nœud.
Cliquez sur Exposer.
Lorsque votre service est prêt, la page Informations sur le service s'ouvre, avec toutes les informations relatives à votre service. Sous Ports, notez le port de nœud que Kubernetes a attribué à votre service.
Créer une règle de pare-feu pour le port de nœud
Accédez à la page Stratégies de pare-feu de la console Google Cloud.
Cliquez sur add_box Créer une règle de pare-feu.
Dans le champ Nom, saisissez
test-node-port
.Dans la liste déroulante Cibles, sélectionnez Toutes les instances du réseau.
Dans le champ Plages IPv4 sources, saisissez
0.0.0.0/0
.Dans Protocoles et ports, sélectionnez Protocoles et ports spécifiés.
Cochez la case tcp, puis saisissez la valeur de port de nœud que vous avez notée.
Cliquez sur Créer.
Obtenir une adresse IP de nœud
Recherchez l'adresse IP externe de l'un de vos nœuds :
kubectl get nodes --output wide
Le résultat ressemble à ce qui suit :
NAME STATUS ROLES AGE VERSION EXTERNAL-IP
gke-svc-... Ready none 1h v1.9.7-gke.6 203.0.113.1
Tous les clusters n'ont pas d'adresses IP externes pour les nœuds. C'est le cas des nœuds des clusters privés par exemple.
Accéder au service
Dans la barre d'adresse de votre navigateur, saisissez les informations suivantes :
NODE_IP_ADDRESS:NODE_PORT
Remplacez les éléments suivants :
NODE_IP_ADDRESS
: l'adresse IP externe de l'un de vos nœuds trouvé lors de la création du service lors de la tâche précédente.NODE_PORT
: valeur du port de votre nœud.
Le résultat ressemble à ce qui suit :
Hello, world!
Version: 2.0.0
Hostname: my-deployment-50000-6fb75d85c9-g8c4f
Créer un service de type LoadBalancer
Dans cette section, vous allez créer un service de type LoadBalancer
.
kubectl apply
Voici le fichier manifeste d'un déploiement :
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment-50001
spec:
selector:
matchLabels:
app: products
department: sales
replicas: 3
template:
metadata:
labels:
app: products
department: sales
spec:
containers:
- name: hello
image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
env:
- name: "PORT"
value: "50001"
Vous remarquerez que les conteneurs de ce déploiement écoutent sur le port 50001.
Copiez le fichier manifeste dans un fichier nommé my-deployment-50001.yaml
, puis créez le déploiement :
kubectl apply -f my-deployment-50001.yaml
Vérifiez que trois pods sont en cours d'exécution :
kubectl get pods
Voici le fichier manifeste d'un service de type LoadBalancer
:
apiVersion: v1
kind: Service
metadata:
name: my-lb-service
spec:
type: LoadBalancer
selector:
app: products
department: sales
ports:
- protocol: TCP
port: 60000
targetPort: 50001
Copiez le fichier manifeste dans un fichier nommé my-lb-service.yaml,
, puis créez le service :
kubectl apply -f my-lb-service.yaml
Lorsque vous créez un service du type LoadBalancer
, un contrôleur Google Cloud s'active et configure un équilibreur de charge réseau passthrough externe.
Attendez quelques minutes que le contrôleur configure l'équilibreur de charge réseau passthrough externe et génère une adresse IP stable.
Consultez le Service :
kubectl get service my-lb-service --output yaml
Le résultat affiche une adresse IP externe stable sous loadBalancer:ingress
:
...
spec:
...
ports:
- ...
port: 60000
protocol: TCP
targetPort: 50001
selector:
app: products
department: sales
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 203.0.113.10
Console
Créer un déploiement
Accédez à la page Charges de travail dans la console Google Cloud.
Cliquez sur add_box Déployer.
Sous Spécifier un conteneur, sélectionnez Image existante du conteneur.
Dans le champ Chemin de l'image, saisissez
us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
.Cliquez sur add Ajouter une variable d'environnement.
Pour Clé, saisissez
PORT
, et pour Valeur, saisissez50001
.Cliquez sur OK, puis sur Continuer.
Sous Configuration, dans le champ Nom de l'application, saisissez
my-deployment-50001
.Sous Libellés, créez les libellés suivants :
- Clé :
app
et Valeur :products
- Clé :
department
et Valeur :sales
- Clé :
Sous Cluster, choisissez le cluster dans lequel vous souhaitez créer le déploiement.
Cliquez sur Déployer.
Lorsque votre déploiement est prêt, la page Informations sur le déploiement s'affiche. Sous Pods gérés, vous pouvez voir que votre déploiement comporte un ou plusieurs pods en cours d'exécution.
Créer un service pour exposer le déploiement
- Sur la page Informations sur le déploiement, cliquez sur list Actions > Exposer.
Dans la boîte de dialogue Exposer, sous Mappage de port, définissez les valeurs suivantes :
- Port :
60000
- Port cible :
50001
- Protocole :
TCP
- Port :
Dans la liste déroulante Type de service, sélectionnez Équilibreur de charge.
Cliquez sur Exposer.
Lorsque votre service est prêt, la page Informations sur le service s'ouvre, avec toutes les informations relatives à votre service. Sous Équilibreur de charge, notez l'adresse IP externe de l'équilibreur de charge.
Accéder au service
Attendez quelques minutes que GKE configure l'équilibreur de charge.
Dans la barre d'adresse de votre navigateur, saisissez les informations suivantes :
LOAD_BALANCER_ADDRESS:60000
Remplacez LOAD_BALANCER_ADDRESS
par l'adresse IP externe de votre équilibreur de charge.
La réponse affiche le résultat de hello-app
:
Hello, world!
Version: 2.0.0
Hostname: my-deployment-50001-68bb7dfb4b-prvct
Notez que la valeur de port
dans un service est arbitraire. L'exemple précédent le prouve en utilisant une valeur de port
de 60000.
Créer un service de type ExternalName
Dans cette section, vous allez créer un service de type ExternalName
.
Un service de type ExternalName
fournit un alias interne à un nom DNS externe. Les clients internes effectuent des requêtes à l'aide du nom DNS interne, qui sont redirigées vers le nom externe.
Voici le fichier manifeste d'un service de type ExternalName
:
apiVersion: v1
kind: Service
metadata:
name: my-xn-service
spec:
type: ExternalName
externalName: example.com
Dans l'exemple précédent, le nom DNS est my-xn-service.default.svc.cluster.local. Lorsqu'un client interne envoie une requête à my-xn-service.default.svc.cluster.local, celle-ci est redirigée vers example.com.
Créer un service à l'aide de kubectl expose
Au lieu d'écrire un fichier manifeste de service, vous pouvez créer un service en utilisant kubectl expose
pour exposer un déploiement.
Pour exposer my-deployment
, évoqué précédemment sur cette page, vous pouvez saisir la commande suivante :
kubectl expose deployment my-deployment --name my-cip-service \
--type ClusterIP --protocol TCP --port 80 --target-port 8080
Pour exposer my-deployment-50000
, évoqué précédemment sur cette page, vous pouvez saisir la commande suivante :
kubectl expose deployment my-deployment-50000 --name my-np-service \
--type NodePort --protocol TCP --port 80 --target-port 50000
Pour exposer my-deployment-50001
, évoqué précédemment sur cette page, vous pouvez saisir la commande suivante :
kubectl expose deployment my-deployment-50001 --name my-lb-service \
--type LoadBalancer --port 60000 --target-port 50001
Nettoyer
Après avoir terminé les exercices de cette page, procédez comme suit pour supprimer les ressources afin d'éviter que des frais inutiles ne vous soient facturés sur votre compte :
kubectl apply
Supprimer les services
kubectl delete services my-cip-service my-np-service my-lb-service
Supprimer les déploiements
kubectl delete deployments my-deployment my-deployment-50000 my-deployment-50001
Supprimer la règle de pare-feu
gcloud compute firewall-rules delete test-node-port
Console
Supprimer les services
Accédez à la page Services de la console Google Cloud.
Sélectionnez les services que vous avez créés dans le cadre de cet exercice, puis cliquez sur delete Supprimer.
Lorsque vous êtes invité à confirmer votre choix, cliquez sur Supprimer.
Supprimer les déploiements
Accédez à la page Charges de travail dans la console Google Cloud.
Sélectionnez les déploiements que vous avez créés dans cet exercice, puis cliquez sur delete Supprimer.
Lorsque vous êtes invité à confirmer l'opération, cochez la case Supprimer les autoscalers horizontaux de pods associés aux déploiements sélectionnés, puis cliquez sur Supprimer.
Supprimer la règle de pare-feu
Accédez à la page Stratégies de pare-feu de la console Google Cloud.
Cochez la case test-node-port, puis cliquez sur delete Supprimer.
Lorsque vous êtes invité à confirmer votre choix, cliquez sur Supprimer.