Vous consultez la documentation d'une version précédente de GKE On-Prem. Consultez la documentation la plus récente.

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 GKE On-Prem. Un objet Ingress doit être associé à un ou plusieurs objets Service, chacun étant associé à un ensemble de Pods.

Se connecter en mode SSH au poste de travail administrateur

Connectez-vous en mode 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 rubrique 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 voir 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 pour 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

Le résultat affiche les valeurs nodePort 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 le résultat précédent, 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 le 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 le 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 le 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 le targetPort. Dans cet exemple, [POD_IP_ADDRESS]:8080.

Créer un Ingress

Voici un fichier manifeste d'Entrée :

apiVersion: extensions/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 le fichier Entrée :

kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f my-ingress.yaml

Lors de la création de votre cluster d'utilisateurs, vous avez spécifié une adresse IP virtuelle pour l'entrée en fournissant une valeur pour usercluster.vips.ingressvip dans votre fichier de configuration.

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.

Le chemin d'accès /greet-the-world

Dans votre fichier manifeste d'entrée, vous pouvez voir 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 un message Hello World!.

Le chemin d'accès /greet-kubernetes

Dans votre fichier manifeste d'entrée, vous pouvez voir 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 du 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 qui écoute sur le port 8080 affiche un message Hello Kubernetes!.

Tester l'entrée :

Testez l'entrée à l'aide du chemin /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 votre entrée :

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete ingress my-ingress

Supprimez votre service :

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete service hello-service

Supprimez votre déploiement :

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete deployment hello-deployment

Étape suivante

Présentation des sujets avancés concernant l'installation