Créer un service (objet Service) et une entrée (objet Ingress)

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]

[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 conteneurs hello-app écoutent sur le port TCP 50000 et que les conteneurs node-hello écoutent sur le port TCP 8080. Pour hello-app, vous pouvez examiner l'effet de la variable d'environnement PORT 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

[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 sur port. Dans cet exemple, 10.105.252.237:60000. La demande est transférée à un pod membre sur targetPort. 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 sur targetPort. 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 sur port. Dans cet exemple, 10.105.252.237:60001. La demande est transférée à un pod membre sur targetPort. 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 sur targetPort. 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éploiement hello-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