Cette page explique comment créer un objet Ingress Kubernetes dans un cluster d'utilisateur Anthos clusters on VMware (GKE On-Prem). Un objet "Ingress" doit être associé à un ou plusieurs objets Service, chacun étant associé à un ensemble de pods.
Se connecter en SSH au poste de travail administrateur
Connectez-vous en SSH à votre poste de travail administrateur :
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
où [IP_ADDRESS] est l'adresse IP de votre poste de travail administrateur.
Effectuez toutes les étapes restantes de cette page sur votre poste de travail administrateur.
Créer un déploiement
Voici un fichier manifeste de déploiement :
apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment spec: selector: matchLabels: greeting: hello replicas: 3 template: metadata: labels: greeting: hello spec: containers: - name: hello-world image: "gcr.io/google-samples/hello-app:2.0" env: - name: "PORT" value: "50000" - name: hello-kubernetes image: "gcr.io/google-samples/node-hello:1.0" env: - name: "PORT" value: "8080"
Pour les besoins de cet exercice, voici les points importants à comprendre concernant le fichier manifeste de déploiement :
Chaque pod appartenant au déploiement possède le libellé
greeting: hello
.Chaque pod possède deux conteneurs.
Les champs
env
spécifient que les conteneurshello-app
écoutent sur le port TCP 50000 et que les conteneursnode-hello
écoutent sur le port TCP 8080. Pourhello-app
, vous pouvez examiner l'effet de la variable d'environnementPORT
en consultant le code source.
Copiez le fichier manifeste dans un fichier nommé hello-deployment.yaml
, puis créez le déploiement :
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-deployment.yaml
où [USER_CLUSTER_KUBECONFIG] est le fichier kubeconfig de votre cluster d'utilisateur.
Exposer votre déploiement avec un service
Pour fournir aux clients un moyen stable d'envoyer des requêtes aux pods de votre déploiement, créez un service.
Voici un fichier manifeste pour un service qui expose votre déploiement aux clients situés à l'intérieur et à l'extérieur de votre cluster :
apiVersion: v1 kind: Service metadata: name: hello-service spec: type: NodePort selector: greeting: hello ports: - name: world-port protocol: TCP port: 60000 targetPort: 50000 - name: kubernetes-port protocol: TCP port: 60001 targetPort: 8080
Copiez le fichier manifeste dans un fichier nommé hello-service.yaml
, puis créez le service :
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-service.yaml
Consultez le Service :
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get service hello-service --output yaml
La sortie affiche les valeurs nodePort
qui ont été attribuées au service :
apiVersion: v1 kind: Service metadata: ... name: hello-service namespace: default ... spec: clusterIP: 10.105.252.237 externalTrafficPolicy: Cluster ports: - name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000 - name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080 selector: greeting: hello sessionAffinity: None type: NodePort status: loadBalancer: ingress: - {}
Dans la sortie précédente, le champ ports
est un tableau d'objets ServicePort : l'un nommé world-port
et l'autre nommé kubernetes-port
.
Voici comment un client peut appeler le service à l'aide de world-port
:
Un client s'exécutant sur l'un des nœuds de cluster peut envoyer une requête à
clusterIP
surport
. Dans cet exemple, 10.105.252.237:60000. La demande est transférée à un pod membre surtargetPort
. Dans cet exemple, [POD_IP_ADDRESS]:50000.Un client peut envoyer une requête à l'adresse IP de n'importe quel nœud de cluster sur
nodePort
. Dans cet exemple, [NODE_IP_ADDRESS]:31807. La demande est transférée à un pod membre surtargetPort
. Dans cet exemple, [POD_IP_ADDRESS]:50000.
Voici comment un client peut appeler le service à l'aide de kubernetes-port
:
Un client s'exécutant sur l'un des nœuds de cluster peut envoyer une requête à
clusterIP
surport
. Dans cet exemple, 10.105.252.237:60001. La demande est transférée à un pod membre surtargetPort
. Dans cet exemple, [POD_IP_ADDRESS]:8080.Un client peut envoyer une requête à l'adresse IP de n'importe quel nœud de cluster sur
nodePort
. Dans cet exemple, [NODE_IP_ADDRESS]:30734. La demande est transférée à un pod membre surtargetPort
. Dans cet exemple, [POD_IP_ADDRESS]:8080.
Créer un Ingress
Voici un fichier manifeste d'Ingress :
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /greet-the-world backend: serviceName: hello-service servicePort: 60000 - path: /greet-kubernetes backend: serviceName: hello-service servicePort: 60001
Copiez le manifeste dans un fichier nommé my-ingress.yaml
et créez l'Ingress :
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f my-ingress.yaml
Lors de la création de votre cluster utilisateur, vous avez spécifié une adresse IP virtuelle pour l'entrée en indiquant une valeur pour usercluster.vips.ingressvip
dans le fichier de configuration du cluster utilisateur.
Lorsqu'un client envoie une requête à votre adresse IP virtuelle d'entrée de cluster d'utilisateur, la requête est acheminée vers votre équilibreur de charge BIG-IP F5. L'équilibreur de charge transmet la requête à un service d'entrée exécuté dans votre cluster d'utilisateur. Le service d'entrée est configuré pour transférer la requête à différents backends en fonction du chemin d'accès dans l'URL de la requête.
Il est important de comprendre qu'il existe deux services différents liés aux étapes décrites dans cette rubrique :
Votre service nommé
hello-service
. Il s'agit d'un service que vous avez créé pour exposer les pods de votre déploiementhello-deployment
.Le service d'entrée qui s'exécute dans l'espace de noms
gke-system
de votre cluster d'utilisateur. Ce service fait partie de l'infrastructure de votre cluster.
Chemin d'accès /greet-the-world
Dans votre fichier manifeste d'entrée, vous pouvez trouver une règle indiquant que le chemin d'accès /greet-the-world
est associé à serviceName: hello-service
et servicePort: 60000
. Rappelez-vous que 60000 est la valeur port
dans le champ world-port
de votre service hello-service
.
- name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000
Le service d'entrée choisit un nœud de cluster et transfère la requête au nœud sur nodePort
. Dans cet exemple, [NODE_IP_ADDRESS]:31807. Les règles iptables du nœud transfèrent la requête à un pod membre sur le port 50000. Le conteneur écoutant sur le port 50000 affiche le message Hello World!
.
Chemin d'accès /greet-kubernetes
Dans votre fichier manifeste d'entrée, vous pouvez trouver une règle indiquant que le chemin d'accès /greet-kubernetes
est associé à serviceName: hello-service
et servicePort: 60001
. Rappelez-vous que 60001 est la valeur port
dans le champ kubernetes-port
de votre service hello-service
.
- name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080
Le service d'entrée choisit un nœud de cluster et transfère la requête au nœud sur nodePort
. Dans cet exemple, [NODE_IP_ADDRESS]:30734. Les règles iptables du nœud transfèrent la requête à un pod membre sur le port 8080.
Le conteneur écoutant sur le port 8080 affiche le message Hello Kubernetes!
.
Tester l'entrée
Testez l'entrée à l'aide du chemin d'accès /greet-the-world
:
curl [USER_CLUSTER_INGRESS_VIP]/greet-the-world
Le résultat affiche un message Hello, world!
:
Hello, world! Version: 2.0.0 Hostname: ...
Testez l'entrée à l'aide du chemin d'accès /greet-kubernetes
:
curl [USER_CLUSTER_INGRESS_VIP]/greet-kubernetes
Le résultat affiche un message Hello, Kubernetes!
:
Hello Kubernetes!
Nettoyer
Supprimez l'entrée :
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete ingress my-ingress
Supprimez le service :
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete service hello-service
Supprimez le déploiement :
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete deployment hello-deployment