Configuration du contrôleur d'entrée natif OCI

Découvrez comment configurer et personnaliser le contrôleur d'entrée natif OCI pour équilibrer la charge et acheminer le trafic entrant vers les pods de service exécutés sur des noeuds de processus actif dans un cluster Kubernetes.

Lorsque vous avez installé le contrôleur d'entrée natif OCI (en tant que programme autonome ou en tant qu'extension de cluster) et créé les ressources liées à l'entrée Kubernetes nécessaires pour l'utiliser, vous pouvez configurer le contrôleur d'entrée natif OCI en procédant comme suit :

Spécification de règles de routage pour le contrôleur entrant natif OCI

Pour indiquer comment l'équilibreur de charge OCI créé par le contrôleur d'entrée natif OCI (installé en tant que programme autonome ou en tant qu'extension de cluster) achemine les demandes entrantes, indiquez des règles de routage dans le manifeste Ingress.

Acheminer les demandes en fonction de l'hôte

Vous pouvez configurer le contrôleur d'entrée natif OCI pour acheminer une demande entrante en fonction du nom de domaine dans l'en-tête d'hôte de la demande (hôte auquel la demande a été envoyée à l'origine).

Pour acheminer une demande vers un port et un service back-end particuliers en fonction de l'hôte, créez une règle de routage dans le manifeste Ingress. Si l'hôte correspond à la règle de routage, le contrôleur d'entrée natif OCI achemine la demande vers le port et le service back-end associés.

Par exemple, vous pouvez définir la règle suivante pour acheminer les demandes initialement envoyées à http://foo.bar.com vers un service back-end nommé ServiceA sur le port 80. Tout le trafic entrant initialement envoyé à http://foo.bar.com est acheminé vers ServiceA sur le port 80.

kind: Ingress
...
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
        - pathType: Prefix
          path: /
          backend:
            serviceName: ServiceA
            servicePort: 80

Acheminer les demandes vers différents services back-end en fonction du chemin

Vous pouvez configurer le contrôleur d'entrée natif OCI pour acheminer les demandes entrantes vers différents services back-end, en fonction des éléments du chemin vers lequel les demandes ont été envoyées à l'origine.

Pour acheminer une demande vers un port et un service back-end donnés en fonction du chemin, créez une règle de routage dans le manifeste Ingress. Si le chemin correspond à la règle de routage, le contrôleur d'entrée natif OCI achemine la demande vers le port et le service back-end associés. Vous pouvez indiquer plusieurs chemins dans la même règle pour acheminer les demandes vers différents back-ends.

Par exemple, vous pouvez définir la règle suivante pour acheminer les demandes en fonction du chemin vers lequel la demande a été initialement envoyée :

  • Si le chemin commence par /app1, le contrôleur d'entrée natif OCI achemine la demande vers un service back-end nommé ServiceA sur le port 80.
  • Si le chemin commence par /app2, le contrôleur d'entrée natif OCI achemine la demande vers un service back-end nommé ServiceB sur le port 443.

Comme la règle ne spécifie pas d'hôte, elle s'applique à tout le trafic entrant.

kind: Ingress
...
spec:
  rules:
    - http:
      paths:
        - pathType: Prefix
          path: /app1
          backend:
            serviceName: ServiceA
            servicePort: 80
        - pathType: Prefix
          path: /app2
          backend:
            serviceName: ServiceB
            servicePort: 443

Acheminer les demandes en fonction de l'hôte et du chemin

Vous pouvez configurer le contrôleur d'entrée natif OCI pour acheminer une demande entrante en fonction du nom de domaine dans l'en-tête d'hôte de la demande (hôte auquel la demande a été envoyée à l'origine) et des éléments du chemin vers lequel la demande d'origine a été envoyée.

Pour acheminer une demande vers un port et un service back-end particuliers en fonction de l'hôte et du chemin, créez une règle de routage dans le manifeste Ingress. Si l'hôte et le chemin correspondent à la règle de routage, le contrôleur d'entrée natif OCI achemine la demande vers le port et le service back-end associés.

Par exemple, vous pouvez définir la règle suivante pour acheminer les demandes initialement envoyées à http://foo.bar.com/app1 vers un service back-end nommé foo sur le port 80 :

kind: Ingress
...
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
        - pathType: Prefix
          path: /app1
          backend:
            serviceName: foo
            servicePort: 80

Acheminer les demandes vers un back-end par défaut

Vous pouvez configurer le contrôleur d'entrée natif OCI pour acheminer les demandes entrantes vers un back-end par défaut. Vous pouvez configurer un back-end par défaut pour gérer les demandes qui ne correspondent à aucune règle de routage.

Par exemple, vous pouvez définir l'élément defaultBackend suivant pour acheminer les demandes qui ne correspondent pas aux autres règles du manifeste Ingress vers un service back-end nommé ServiceC sur le port 8080.

Si vous ne spécifiez aucune autre règle dans un manifeste Ingress, vous devez spécifier une valeur defaultBackend.

kind: Ingress
...
spec:
  rules:
    - http:
      paths:
        - pathType: Prefix
          path: /app1
          backend:
            serviceName: ServiceA
            servicePort: 80
        - pathType: Prefix
          path: /app2
          backend:
            serviceName: ServiceB
            servicePort: 443
  defaultBackend:
    service:
      name: ServiceC
      port:
        number: 8080

Personnalisation du comportement du contrôleur d'entrée natif OCI à l'aide d'annotations

Vous pouvez ajouter des annotations aux manifestes de ressource IngressClass ou Ingress pour personnaliser le comportement du contrôleur d'entrée natif OCI (installé en tant que programme autonome ou en tant qu'extension de cluster).

Personnaliser le comportement général à l'aide d'annotations

Vous pouvez ajouter des annotations aux manifestes de ressource IngressClass ou Ingress pour personnaliser le comportement général du contrôleur d'entrée natif OCI.

Annotation Description Ajouter une annotation à ce manifeste de ressource Exemple
oci-native-ingress.oraclecloud.com/id OCID d'un équilibreur de charge OCI existant à utiliser, plutôt que d'en créer un nouveau.

Si vous indiquez un équilibreur de charge existant, le contrôleur d'entrée natif OCI gère l'équilibreur de charge et met à jour ses propriétés si nécessaire pour l'aligner sur les valeurs des manifestes de ressource IngressClassParameters, IngressClass et entrante.

IngressClass oci-native-ingress.oraclecloud.com/id: ocid1.loadbalancer.oc1.iad.aaaaaaaan___u7a
oci-native-ingress.oraclecloud.com/defined-tags Des balises définies à appliquer à l'équilibreur de charge, au format JSON.

Reportez-vous à Application de balises définies à l'équilibreur de charge.

IngressClass oci-native-ingress.oraclecloud.com/defined-tags: '{"tag-namespace-1": {"key1": "value1", "key2": "value2"}, "tag-namespace-2": {"key1": "value1"}}'
oci-native-ingress.oraclecloud.com/freeform-tags Balises à format libre à appliquer à l'équilibreur de charge, au format JSON.

Reportez-vous à Application de balises à format libre à l'équilibreur de charge.

IngressClass oci-native-ingress.oraclecloud.com/freeform-tags: '{"key1": "value1", "key2": "value2"}'
oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true" Indique si l'équilibreur de charge doit être conservé si IngressClass est supprimé.

Si la valeur est true, l'équilibreur de charge est conservé. S'il n'est pas indiqué, false est la valeur par défaut et l'équilibreur de charge est supprimé si IngressClass est supprimé.

Reportez-vous à Conservation de l'équilibreur de charge après la suppression de IngressClass.

IngressClass oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"
oci-native-ingress.oraclecloud.com/network-security-group-ids OCID des groupes de sécurité réseau auxquels ajouter l'équilibreur de charge, dans une liste séparée par des virgules. S'il n'est pas indiqué, l'équilibreur de charge n'est ajouté à aucun groupe de sécurité réseau. IngressClass oci-native-ingress.oraclecloud.com/network-security-group-ids: 'ocid1.networksecuritygroup.oc1.iad.agx___kby, ocid1.networksecuritygroup.oc1.iad.ahr___mlo'
oci-native-ingress.oraclecloud.com/waf-policy-ocid OCID d'une stratégie WAF (Web Application Firewall) existante. Reportez-vous à Stratégies Web Application Firewall. IngressClass oci-native-ingress.oraclecloud.com/waf-policy-ocid: ocid1.webappfirewallpolicy.oc1.iad.ama___aqq
oci-native-ingress.oraclecloud.com/protocol Protocole à utiliser pour le processus d'écoute sur l'équilibreur de charge. HTTP2 ou TCP.

(Notez que si vous indiquez HTTP2 comme protocole, un processus d'écoute configuré par TLS est requis.)

Ingress oci-native-ingress.oraclecloud.com/protocol: "HTTP2"
oci-native-ingress.oraclecloud.com/backend-tls-enabled Indique si les pods de service back-end peuvent recevoir des demandes TLS.

Si la valeur est false, les demandes TLS sont interrompues au niveau du processus d'écoute de l'équilibreur de charge et les demandes entre l'ensemble de back-ends et les back-ends sont échangées en texte brut.

Ingress oci-native-ingress.oraclecloud.com/backend-tls-enabled: "false"
oci-native-ingress.oraclecloud.com/http-listener-port

Créez un port de processus d'écoute unique pour tous les chemins HTTP sous cette entrée, plutôt que de créer un port de processus d'écoute pour chaque port de service. Les stratégies de routage sont configurées en conséquence.

Ingress oci-native-ingress.oraclecloud.com/http-listener-port: "100"
oci-native-ingress.oraclecloud.com/https-listener-port Créez un port de processus d'écoute unique pour tous les chemins HTTPS sous cette entrée, plutôt que de créer un port de processus d'écoute pour chaque port de service. Les stratégies de routage sont configurées en conséquence. Ingress oci-native-ingress.oraclecloud.com/https-listener-port: "500"
oci-native-ingress.oraclecloud.com/policy Stratégie à utiliser par l'ensemble de back-ends de l'équilibreur de charge pour la répartition du trafic. Ingress oci-native-ingress.oraclecloud.com/policy: "ROUND_ROBIN"

Personnalisation du comportement de la vérification de l'état à l'aide d'annotations

Vous pouvez ajouter des annotations au manifeste de ressource Ingress pour personnaliser les vérifications de l'état effectuées par l'équilibreur de charge créé par le contrôleur d'entrée natif OCI. Pour plus d'informations sur les vérifications de l'état des équilibreurs de charge, reportez-vous à Vérifications de l'état pour les équilibreurs de charge.

Annotation Description Ajouter une annotation à ce manifeste de ressource Exemple
oci-native-ingress.oraclecloud.com/healthcheck-protocol Protocole à utiliser pour les vérifications de l'état de l'ensemble de back-ends de l'équilibreur de charge. Ingress oci-native-ingress.oraclecloud.com/healthcheck-protocol: "HTTP"
oci-native-ingress.oraclecloud.com/healthcheck-port Port à utiliser pour les vérifications de l'état de l'ensemble de back-ends de l'équilibreur de charge. Ingress oci-native-ingress.oraclecloud.com/healthcheck-port: "80"
oci-native-ingress.oraclecloud.com/healthcheck-path Chemin à utiliser pour les vérifications de l'état de l'ensemble de back-ends de l'équilibreur de charge. Ingress oci-native-ingress.oraclecloud.com/healthcheck-path: "/test"
oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds Intervalle entre les vérifications de l'état de l'ensemble de back-ends de l'équilibreur de charge. Ingress oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds: "1000"
oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds Période au bout de laquelle la vérification de l'état de l'ensemble de back-ends de l'équilibreur de charge est considérée comme ayant échoué. Ingress oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds: "750"
oci-native-ingress.oraclecloud.com/healthcheck-retries Nombre de nouvelles tentatives après lesquelles la vérification de l'état de l'ensemble de back-ends de l'équilibreur de charge est considérée comme ayant échoué. Ingress oci-native-ingress.oraclecloud.com/healthcheck-retries: "5"
oci-native-ingress.oraclecloud.com/healthcheck-return-code Code de statut que l'ensemble de back-ends de l'équilibreur de charge doit renvoyer en réponse à une vérification de l'état pour être considéré comme sain. Ingress oci-native-ingress.oraclecloud.com/healthcheck-return-code: "200"
oci-native-ingress.oraclecloud.com/healthcheck-response-regex Expression régulière permettant d'analyser le corps de réponse à partir de l'ensemble de back-ends de l'équilibreur de charge. Vous pouvez spécifier n'importe quelle valeur d'expression régulière (telle que * ou /) ou une valeur vide. Ingress oci-native-ingress.oraclecloud.com/healthcheck-response-regex: "*"
oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext Indique si une vérification de l'état doit être envoyée au back-end de l'équilibreur de charge sans SSL (HTTP uniquement). Sinon, false est la valeur par défaut. Ingress oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext: "true"

Configuration d'un point de contrôle de préparation des pods

Les portes de préparation de pod sont des conditions supplémentaires incluses dans un manifeste de pod pour indiquer qu'un pod est prêt à recevoir du trafic. Les jalons de préparation des pods vous permettent d'implémenter des contrôles de préparation personnalisés complexes et peuvent vous aider à éviter tout temps d'inactivité lors des déploiements non simultanés. Pour plus d'informations, reportez-vous aux détails relatifs à la préparation des pods dans la documentation Kubernetes.

Lorsque vous utilisez le contrôleur d'entrée natif OCI (en tant que programme autonome ou en tant qu'extension de cluster) avec un cluster dont le type de réseau est Mise en réseau de pod natif VCN, vous pouvez indiquer que le contrôleur d'entrée natif OCI doit injecter une porte de préparation de pod dans la spécification de pod de chaque pod créé dans un espace de noms particulier. Vous ne pouvez pas utiliser le contrôleur d'entrée natif OCI pour injecter des points de contrôle de préparation de pod dans les spécifications de pod si le cluster a une surcouche Flannel comme type de réseau.

Indiquez que le contrôleur d'entrée natif OCI doit injecter un point de contrôle de préparation de pod dans la spécification de pod de chaque pod créé dans un espace de noms particulier en saisissant ce qui suit :

kubectl label ns <namespace> podreadiness.ingress.oraclecloud.com/pod-readiness-gate-inject=enabled

Le contrôleur d'entrée natif OCI injecte une condition dans la spécification de pod de chaque pod créé dans l'espace de noms. Par exemple :


kind: Pod
...
    spec:
      readinessGates:
      - conditionType: podreadiness.ingress.oraclecloud.com/k8s_6b5b1b3a38
Vous pouvez vérifier le statut des points de contrôle de préparation du pod en saisissant ce qui suit :
kubectl get pods -o wide -w
Exemple de sortie :
NAME                                             READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
testecho-7cdcfff87f-b6xt4                        1/1     Running   0          35s   10.0.10.242   10.0.10.135   <none>           0/1
testecho-7cdcfff87f-b6xt4                        1/1     Running   0          72s   10.0.10.242   10.0.10.135   <none>           1/1

Configuration des processus d'écoute TCP

Vous pouvez utiliser le contrôleur d'entrée natif OCI (en tant que programme autonome ou en tant qu'extension de cluster) pour configurer des processus d'écoute d'équilibreur de charge en tant que processus d'écoute TCP. Chaque processus d'écoute TCP transmet simplement le trafic TCP reçu sur un port particulier au service back-end spécifié pour ce port dans un manifeste de ressource Ingress, sans effectuer de routage de couche de transport 7.

Vous définissez l'annotation oci-native-ingress.oraclecloud.com/protocol pour indiquer que le contrôleur d'entrée natif OCI doit créer un processus d'écoute TCP pour chaque port unique inclus dans les règles de routage dans un manifeste de ressource Ingress.

Pour indiquer que le contrôleur d'entrée natif OCI doit créer des processus d'écoute TCP, procédez comme suit :

  1. Définissez une nouvelle ressource entrante dans un fichier .yaml. Reportez-vous à Création d'une ressource entrante.
  2. Dans la section metadata:, ajoutez un élément annotations: et définissez l'annotation oci-native-ingress.oraclecloud.com/protocol sur TCP, au format suivant :
    kind: Ingress
    metadata:
      name: <i-name>
      annotations:
        oci-native-ingress.oraclecloud.com/protocol: TCP
    spec:
    ...

    name: <i-name> est le nom que vous avez choisi pour la ressource entrante.

    Par exemple :

    kind: Ingress
    metadata:
      name: ingress-pass-through
      annotations:
        oci-native-ingress.oraclecloud.com/protocol: TCP
    spec:
    ...
  3. Dans la section rules: du manifeste de ressource Ingress, ajoutez une règle pour chaque processus d'écoute qui doit recevoir le trafic TCP :
    • (recommandé) Définissez paths.pathType sur ImplementationSpecific.
    • Définissez paths.backend.service.name sur le nom du service back-end.
    • Définissez paths.backend.service.port.number sur le port sur lequel écouter le trafic TCP et sur lequel transférer le trafic TCP.

    Par exemple, si vous voulez qu'un processus d'écoute TCP écoutant sur le port 8080 transfère le trafic TCP vers my-first-svc:8080 et qu'un processus d'écoute TCP écoutant sur le port 8081 transfère le trafic TCP vers my-second-svc:8081, vous pouvez configurer un manifeste de ressource Ingress comme suit :

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-pass-through
      annotations:
        oci-native-ingress.oraclecloud.com/protocol: TCP
    spec:
      rules:
        - http:
            paths:
              - pathType: ImplementationSpecific
                backend:
                  service:
                    name: my-first-svc
                    port:
                      number: 8080
        - http:
            paths:
              - pathType: ImplementationSpecific
                backend:
                  service:
                    name: my-second-svc
                    port:
                      number: 8081 
    
  4. Créez la ressource en saisissant kubectl create -f <filename>.yaml

Ajout de la prise en charge des demandes HTTPS/TLS

Vous pouvez utiliser le contrôleur d'entrée natif OCI (soit en tant que programme autonome, soit en tant qu'extension de cluster) pour prendre en charge la communication HTTPS sécurisée. A l'aide du contrôleur d'entrée natif OCI, vous pouvez configurer des processus d'écoute d'équilibreur de charge OCI et des ensembles de back-ends pour gérer le trafic crypté à l'aide de TLS (anciennement SSL).

Lorsque vous utilisez le contrôleur d'entrée natif OCI pour prendre en charge la communication HTTPS, vous disposez de deux options :

Lors de la gestion du trafic HTTPS, l'équilibreur de charge OCI créé par le contrôleur d'entrée natif OCI implémente TLS de bout en bout par défaut. L'équilibreur de charge utilise des certificats pour accepter une demande cryptée TLS d'un client, puis utilise des règles de routage pour transmettre la demande à l'ensemble de back-ends approprié. L'ensemble de back-ends crée une connexion TLS avec des back-ends exécutés sur le cluster (en utilisant le package d'autorité de certification comme autorité de confiance pour la nouvelle connexion).

Tenez compte des éléments suivants :

  • Si vous supprimez une ressource IngressClass, le contrôleur d'entrée natif OCI supprime l'équilibreur de charge qu'il a créé ou l'équilibreur de charge existant indiqué par l'annotation oci-native-ingress.oraclecloud.com/id (sauf si vous avez défini oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"). Cependant, le contrôleur d'entrée ne supprime pas les ressources créées dans le service OCI Certificates. Vous êtes responsable de la suppression de ces ressources de service Certificates. En particulier, si vous avez spécifié une clé secrète Kubernetes dans le manifeste de ressource Ingress, notez que vous êtes responsable de la suppression des ressources de service Certificates que le contrôleur d'entrée natif OCI a créées pour vous.
  • Les certificats obtenus à partir du service OCI Certificates de type Importé ne peuvent pas faire l'objet d'une rotation automatique. Si vous souhaitez que les certificats fassent l'objet d'une rotation automatique, obtenez manuellement un certificat dans le service OCI Certificates vous-même en indiquant que vous souhaitez que le certificat soit émis par une autorité de certification interne du service Certificates (les certificats sont de type Emis par l'autorité de certification interne). Vous pouvez configurer la rotation automatique des certificats de type Emis par l'autorité de certification interne.
  • Si vous indiquez une clé secrète Kubernetes dans le manifeste de ressource Ingress, les certificats obtenus par le contrôleur d'entrée natif OCI à partir du service Certificates sont de type Imported et ne font donc pas l'objet d'une rotation automatique. Toutefois, vous pouvez renouveler manuellement le certificat obtenu à partir du service Certificates en modifiant les détails du certificat de serveur en cours indiqué dans la clé secrète Kubernetes existante. Lorsque vous modifiez les détails du certificat de serveur, le contrôleur d'entrée natif OCI met à jour les détails correspondants du certificat obtenu à partir du service Certificates.

    Notez que la modification des informations de sujet dans le certificat de serveur actuel (nom commun, nom d'organisation, autres noms de sujet) n'est pas prise en charge par le service Certificates. Pour modifier les informations sur l'objet, supprimez la clé secrète Kubernetes d'origine et créez une clé secrète portant le même nom. Le contrôleur d'entrée natif OCI obtient un nouveau certificat de type Imported et un nouveau package d'autorité de certification à partir du service Certificates, et les associe au processus d'écoute et à l'ensemble de back-ends (remplaçant le certificat et le package d'autorité de certification précédents).

  • Un processus d'écoute ne peut être associé qu'à un seul certificat. Par conséquent, ne créez pas plusieurs ressources entrantes ayant chacune des règles spécifiant la même combinaison service/port back-end, mais où les ressources entrantes utilisent des certificats différents.
  • Par défaut, l'équilibreur de charge OCI créé par le contrôleur d'entrée natif OCI implémente TLS de bout en bout. L'équilibreur de charge met fin à la demande TLS sur le processus d'écoute, et une nouvelle connexion TLS est établie entre l'ensemble de back-ends et les back-ends. Toutefois, si les back-ends n'exécutent pas de serveur HTTPS et que vous voulez donc que la connexion entre l'ensemble de back-ends et les back-ends soit en texte brut, définissez l'annotation oci-native-ingress.oraclecloud.com/backend-tls-enabled sur "false". Lorsque l'annotation oci-native-ingress.oraclecloud.com/backend-tls-enabled est définie sur "false", l'équilibreur de charge peut accepter le trafic crypté en provenance d'un client, mais le trafic entre l'équilibreur de charge et les back-ends n'est pas crypté.

Option 1 : le contrôleur d'entrée natif OCI obtient le certificat du service Certificates à l'aide d'une clé secrète Kubernetes

Pour configurer le contrôleur d'entrée natif OCI afin d'obtenir un certificat à partir du service OCI Certificates, procédez comme suit :

  1. Obtenez une paire de clés publique et privée TLS et un certificat.

    Dans les environnements de production, vous obtenez un certificat TLS auprès de l'autorité de certification choisie en soumettant une demande de signature de certificat. Pendant le processus de demande de certificat, une clé publique et la clé privée correspondante sont générées.

    Dans les environnements de développement et de test, vous pouvez créer un certificat auto-signé et générer vous-même une clé privée à l'aide d'un outil tel que OpenSSL. Par exemple (avec OpenSSL 3.0 ou version ultérieure) :

    1. Générez une paire de clés publique et privée en entrant les commandes suivantes :

      openssl genrsa -out rootCA.key 4096
      openssl req -x509 -addext basicConstraints=critical,CA:TRUE -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt -subj /CN=RootCA
    2. Générez un certificat en saisissant les commandes suivantes :

      openssl genrsa -out server.key 4096
      openssl req -new -sha256 -key server.key -subj /C=US/ST=CA/O=MyOrg,Inc./CN=my.example.com -out server.csr
      openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256

    Dans cet exemple :

    • rootCA.key contient la paire de clés de l'autorité de certification racine.
    • rootCA.crt contient le certificat CA racine.
    • server.key contient la paire de clés permettant de générer le certificat de serveur.
    • server.csr contient la demande de signature de certificat pour le certificat de serveur.
    • server.crt contient le certificat de serveur généré.
  2. Créez une ressource de clé secrète Kubernetes de l'une des manières suivantes :
    • A l'aide de la commande kubectl create secret generic, saisissez :

      kubectl create secret generic <k8s-secret-name> --type=kubernetes.io/tls --from-file=ca.crt=<path-and-filename>.crt --from-file=tls.crt=<path-and-filename>.crt --from-file=tls.key=<path-and-filename>.key

      où :

      • <k8s-secret-name> est le nom de votre choix pour la clé secrète Kubernetes
      • --from-file=ca.crt=<path-and-filename>.crt indique le chemin du fichier contenant le certificat d'autorité de certification racine. Par exemple, --from-file=ca.crt=rootCA.crt
      • --from-file=tls.crt=<path-and-filename>.crt indique le chemin d'accès au fichier contenant le certificat de serveur généré. Par exemple, --from-file=tls.crt=server.crt
      • --from-file=tls.key=<path-and-filename>.key indique le chemin du fichier contenant la clé privée générée. Par exemple, --from-file=tls.key=server.key

      Par exemple :

      kubectl create secret generic example-tls-secret --type=kubernetes.io/tls --from-file=ca.crt=rootCA.crt --from-file=tls.crt=server.crt --from-file=tls.key=server.key
    • A l'aide d'un fichier manifeste de ressource Secret :
      1. Définissez la clé secrète Kubernetes dans un fichier .yaml, au format suivant :

        apiVersion: v1
        kind: Secret
        metadata:
          name: <k8s-secret-name>
        type: kubernetes.io/tls
        data:
          ca.crt: <base64-encoded-certificate-chain>
          tls.crt: <base64-encoded-server-certificate>
          tls.key: <base64-encoded-private-key>

        où :

        • name: <k8s-secret-name> est le nom de votre choix pour la ressource de clé secrète Kubernetes.
        • ca.crt: <base64-encoded-certificate-chain> représente le contenu du ou des fichiers contenant des certificats intermédiaires qui forment une chaîne de certificat allant du certificat feuille à l'autorité de certification. Vous pouvez omettre ca.cert, à condition d'inclure toute la chaîne de certificats en tant que valeur de tls.cert (dans ce cas, démarrez la chaîne de certificats avec le contenu du fichier contenant le certificat de serveur généré, suivi des certificats restants).
        • tls.crt: <base64-encoded-server-certificate> est le contenu du fichier contenant le certificat de serveur généré.
        • tls.key: <base64-encoded-private-key> est le contenu du fichier contenant la clé privée générée.

        Par exemple :

        apiVersion: v1
        kind: Secret
        metadata:
          name: example-tls-secret
        type: kubernetes.io/tls
        data:
          ca.crt : MIIFGERTegcDFRTuSDGfghREdE______Jre
          tls.crt: MIIC2DCCAcCgAwIBAgIBATANBg______kqh
          tls.key: MIIEpgIBAAKCAQEA7yn3bRHQ5F______HMQ
      2. Créez la ressource de clé secrète en saisissant kubectl create -f <filename>.yaml

  3. Ajoutez la clé secrète Kubernetes à un manifeste de ressource Ingress :
    1. Définissez une nouvelle ressource entrante dans un fichier .yaml. Reportez-vous à Création d'une ressource entrante.
    2. Dans la section spec: du manifeste, ajoutez un élément tls: qui indique à la fois l'hôte qui doit recevoir le trafic HTTPS et le nom de la clé secrète Kubernetes, au format suivant :
      kind: Ingress
      ...
      spec:
        tls:
        - hosts:
            - <host-name>
          secretName: <k8s-secret-name>

      Par exemple :

      kind: Ingress
      ...
      spec:
        tls:
        - hosts:
            - my.example.com
          secretName: example-tls-secret
    3. Dans la section rules: du manifeste, ajoutez une règle pour l'hôte qui doit recevoir le trafic HTTPS et indiquez 443 comme port d'écoute du trafic HTTPS.

      Par exemple :

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: acme-tls-secret-ingress
      spec:
        tls:
        - hosts:
            - my.example.com
          secretName: example-tls-secret
        rules:
        - host: "my.example.com"
          http:
            paths:
            - pathType: Prefix
              path: "/TLSPath"
              backend:
                service:
                  name: tls-test
                  port:
                    number: 443
    4. Créez la ressource en saisissant kubectl create -f <filename>.yaml

Lorsque vous créez la ressource entrante, le contrôleur d'entrée natif OCI utilise la clé secrète Kubernetes pour obtenir un certificat de type Importé et un package d'autorité de certification (bundle d'autorité de certification) à partir du service OCI Certificates. Le contrôleur d'entrée natif OCI associe le certificat au processus d'écoute et le package d'autorité de certification à l'ensemble de back-ends.

Lorsque le processus d'écoute qui écoute sur le port 443 reçoit une demande HTTPS vers l'hôte spécifié, il utilise le certificat pour la terminaison TLS. Le processus d'écoute utilise ensuite la règle de routage pour transmettre la demande à l'ensemble de back-ends. L'ensemble de back-ends crée une connexion TLS avec les back-ends exécutés sur le cluster (en utilisant le package d'autorité de certification comme autorité de confiance pour la nouvelle connexion).

Option 2 : obtenir un certificat auprès du service Certificates

Pour configurer le contrôleur d'entrée natif OCI de sorte qu'il utilise un certificat obtenu à partir du service OCI Certificates, procédez comme suit :

  1. Créez un certificat dans le service OCI Certificates de l'une des manières suivantes :
    • en important un certificat émis par une CA tierce (le certificat sera de type Imported)
    • en émettant le certificat en interne à partir d'une CA de service Certificates (le certificat sera de type Emis par une CA interne)

    Ne créez pas de certificat à gérer en externe (de type Emis par une autorité de certification interne, géré en externe). Pour plus d'informations, voir Création d'un certificat.

  2. Notez l'OCID du certificat.
  3. Ajoutez l'OCID du certificat à un manifeste de ressource Ingress :
    1. Définissez une nouvelle ressource entrante dans un fichier .yaml. Reportez-vous à Création d'une ressource entrante.
    2. Dans la section metadata:, ajoutez un élément annotations: qui indique l'OCID du certificat que vous avez créé dans le service OCI Certificates, au format suivant :
      kind: Ingress
      metadata:
        name: <i-name>
        annotations:
          oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid>
      spec:
      ...

      où :

      • name: <i-name> est le nom de votre choix pour la ressource entrante.
      • oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid> est l'OCID du certificat que vous avez créé dans le service OCI Certificates.

      Par exemple :

      kind: Ingress
      metadata:
        name: acme-tls-certificate-ingress
        annotations:
          oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc
      spec:
      ...
    3. Dans la section rules: du manifeste de ressource Ingress, ajoutez une règle pour l'hôte qui doit recevoir le trafic HTTPS et indiquez 443 comme port d'écoute du trafic HTTPS.

      Par exemple :

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: acme-tls-certificate-ingress
        annotations:
          oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc
      spec:
        rules:
        - host: "my.example.com"
          http:
            paths:
            - pathType: Prefix
              path: "/TLSPath"
              backend:
                service:
                  name: tls-test
                  port:
                    number: 443
    4. Créez la ressource en saisissant kubectl create -f <filename>.yaml.

Ce qui se passe lorsque vous créez la ressource entrante dépend de la façon dont vous avez créé le certificat dans le service OCI Certificates :

  • Si vous avez créé le certificat en important un certificat émis par une autorité de certification tierce, le certificat est de type Imported. Le contrôleur d'entrée natif OCI associe le certificat au processus d'écoute, crée un package d'autorité de certification à partir de la chaîne de certificats et associe le package d'autorité de certification à l'ensemble de back-ends. Notez que vous ne pouvez pas configurer la rotation automatique des certificats de type Importé.
  • Si vous avez créé le certificat en émettant le certificat en interne à partir d'une CA de service Certificates, le certificat est de type Emis par une CA interne. Le contrôleur entrant natif OCI associe le certificat au processus d'écoute, obtient l'OCID de l'autorité de certification et associe cet OCID à l'ensemble de back-ends. Notez que vous pouvez configurer la rotation automatique des certificats de type Emis par l'autorité de certification interne.

Lorsque le processus d'écoute qui écoute sur le port 443 reçoit une demande HTTPS vers l'hôte spécifié, il utilise le certificat pour la terminaison TLS. Le processus d'écoute utilise ensuite la règle de routage pour transmettre la demande à l'ensemble de back-ends. L'ensemble de back-ends crée une connexion TLS avec les back-ends exécutés sur le cluster (à l'aide du package d'autorité de certification ou de l'autorité de certification identifiée par son OCID, en tant qu'autorité de confiance pour la nouvelle connexion).

Agrégation des ports de processus d'écoute HTTP/HTTPS

Lorsque vous utilisez le contrôleur d'entrée natif OCI (en tant que programme autonome ou en tant qu'extension de cluster), vous pouvez agréger tout le trafic HTTP dans un port de processus d'écoute unique. De même, vous pouvez agréger tout le trafic HTTPS dans un port unique.

Par défaut, le contrôleur d'entrée natif OCI crée un processus d'écoute d'équilibreur de charge OCI pour chaque port de service back-end défini dans un manifeste Ingress. Le contrôleur d'entrée natif OCI crée également une stratégie de routage pour chaque port de processus d'écoute. Toutefois, vous pouvez utiliser l'annotation oci-native-ingress.oraclecloud.com/http-listener-port et/ou l'annotation oci-native-ingress.oraclecloud.com/https-listener-port pour créer un processus d'écoute et une stratégie de routage uniques pour toutes les demandes HTTP, et/ou un processus d'écoute et une stratégie de routage uniques pour toutes les demandes HTTPS.

Par exemple, vous pouvez définir une entrée avec des règles pour quatre services back-end, chaque service écoutant sur un port différent, comme suit :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-ingress
spec:
  tls:
    - hosts:
        - "foo.bar.com3"
        - "foo.bar.com4"
      secretName: secret_name
  rules:
    - host: "foo.bar.com1"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho1"
            backend:
              service:
                name: testecho1
                port:
                  number: 80
    - host: "foo.bar.com2"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho2"
            backend:
              service:
                name: testecho2
                port:
                  number: 81
    - host: "foo.bar.com3"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho3"
            backend:
              service:
                name: testecho3
                port:
                  number: 443
    - host: "foo.bar.com4"
      http:
        paths:
          - pathType: Prefix
            path: "/testecho4"
            backend:
              service:
                name: testecho4
                port:
                  number: 444 

Dans cet exemple, le manifeste Ingress définit quatre services :

  • testecho1, écoute sur le port 80 pour le trafic HTTP
  • testecho2, écoute sur le port 81 pour le trafic HTTP
  • testecho3, écoute du trafic HTTPS sur le port 443
  • testecho4, écoute du trafic HTTPS sur le port 444

Par défaut, le contrôleur d'entrée natif OCI crée :

  • Quatre processus d'écoute dans l'équilibreur de charge (deux processus d'écoute écoutant le trafic HTTP sur les ports 80 et 81, et deux processus d'écoute écoutant le trafic HTTPS sur les ports 443 et 444).
  • Quatre stratégies de routage (une pour chaque port du processus d'écoute).

Pour simplifier l'administration, vous pouvez décider qu'un seul processus d'écoute écoute le trafic HTTP et qu'un seul écoute le trafic HTTPS, en définissant les annotations comme suit :

oci-native-ingress.oraclecloud.com/http-listener-port: "100"
oci-native-ingress.oraclecloud.com/https-listener-port: "500"

Avec les annotations définies comme indiqué, le contrôleur d'entrée natif OCI crée :

  • un processus d'écoute unique écoutant le trafic HTTP sur le port 100, et une stratégie de routage unique pour le port 100 avec des chemins pour les back-ends sur les ports testecho1:80 et testecho2:81
  • un seul processus d'écoute écoutant le trafic HTTPS sur le port 500, et une seule stratégie de routage pour le port 500 avec des chemins pour les back-ends sur les ports testecho3:443 et testecho4:444

Tenez compte des éléments suivants :

  • Vous pouvez définir les annotations oci-native-ingress.oraclecloud.com/http-listener-port et oci-native-ingress.oraclecloud.com/https-listener-port indépendamment les unes des autres, de sorte que vous n'avez pas à définir les deux annotations.

  • Si le manifeste de ressource Ingress inclut l'annotation oci-native-ingress.oraclecloud.com/certificate-ocid, le contrôleur d'entrée natif OCI considère que tous les hôtes doivent être configurés pour TLS. Dans ce cas, le contrôleur d'entrée natif OCI :

    • ignore l'annotation oci-native-ingress.oraclecloud.com/http-listener-port (si elle est présente dans le manifeste de ressource Ingress)
    • applique l'annotation oci-native-ingress.oraclecloud.com/https-listener-port (si elle est présente dans le manifeste de ressource Ingress) afin de créer un processus d'écoute unique pour tout le trafic
  • Quelles que soient les annotations oci-native-ingress.oraclecloud.com/http-listener-port et oci-native-ingress.oraclecloud.com/https-listener-port, le contrôleur d'entrée natif OCI crée uniquement des processus d'écoute HTTP et/ou HTTPS (et les stratégies de routage correspondantes) si nécessaire pour les services back-end définis dans le manifeste de ressource entrante. Par exemple :
    • Si vous incluez l'annotation oci-native-ingress.oraclecloud.com/http-listener-port dans un manifeste de ressource Ingress qui ne définit pas de back-end HTTP, le contrôleur d'entrée natif OCI ne crée pas de processus d'écoute HTTP.
    • Si vous incluez l'annotation oci-native-ingress.oraclecloud.com/https-listener-port dans un manifeste de ressource Ingress qui ne définit pas de back-end HTTPS, le contrôleur d'entrée natif OCI ne crée pas de processus d'écoute HTTPS.
    • Si vous incluez à la fois des annotations oci-native-ingress.oraclecloud.com/http-listener-port et oci-native-ingress.oraclecloud.com/https-listener-port dans un manifeste de ressource Ingress qui définit uniquement les back-ends HTTP, le contrôleur d'entrée natif OCI ignore l'annotation oci-native-ingress.oraclecloud.com/https-listener-port et ne crée pas de processus d'écoute HTTPS.
    • Si vous incluez à la fois des annotations oci-native-ingress.oraclecloud.com/http-listener-port et oci-native-ingress.oraclecloud.com/https-listener-port dans un manifeste de ressource Ingress qui définit uniquement les back-ends HTTPS, le contrôleur d'entrée natif OCI ignore l'annotation oci-native-ingress.oraclecloud.com/http-listener-port et ne crée pas de processus d'écoute HTTP.

Conservation de l'équilibreur de charge après la suppression de IngressClass

Vous pouvez indiquer que le contrôleur d'entrée natif OCI doit conserver l'équilibreur de charge pour une ressource IngressClass si vous supprimez le fichier IngressClass lui-même.

Utilisez l'annotation oci-native-ingress.oraclecloud.com/delete-protection-enabled dans le manifeste IngressClass pour indiquer si l'équilibreur de charge est supprimé. Définissez l'annotation sur true afin de conserver l'équilibreur de charge si vous supprimez IngressClass. Définissez l'annotation sur false (ou n'incluez pas l'annotation dans le manifeste) pour supprimer l'équilibreur de charge si vous supprimez IngressClass. Par exemple :

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: <ic-name>
  annotations:
    oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"
spec:
  ...

Si vous supprimez une ressource IngressClass et que vous utilisez l'annotation pour conserver l'équilibreur de charge, le contrôleur d'entrée natif OCI conserve l'équilibreur de charge lui-même, mais efface les associations avec d'autres ressources de prise en charge (telles que les groupes de sécurité réseau, les balises, un pare-feu d'application Web). Le contrôleur d'entrée natif OCI supprime également l'ensemble de back-ends default_ingress BackendSet qu'il a créé.

Cependant, le contrôleur d'entrée natif OCI ne supprime pas les ressources d'équilibreur de charge OCI (processus d'écoute, ensembles de back-ends) qu'il a créées pour les ressources Ingress qui référencent actuellement le fichier IngressClass supprimé. Par conséquent, avant de supprimer une ressource IngressClass, supprimez d'abord toute ressource Ingress qui référence IngressClass dans son manifeste. Si vous ne supprimez pas d'abord ces ressources Ingress, les ressources OCI créées pour elles continueront d'exister dans l'équilibreur de charge.

Application de balises à l'équilibreur de charge

Vous pouvez indiquer que le contrôleur d'entrée natif OCI doit appliquer des balises définies et des balises à format libre à un équilibreur de charge qu'il crée (pour une ressource IngressClass) ou gère (si indiqué par l'annotation oci-native-ingress.oraclecloud.com/id). Le balisage vous permet de regrouper des ressources disparates entre différents compartiments, ainsi que d'annoter des ressources avec vos propres métadonnées. Pour plus d'informations sur les balises, reportez-vous à Balisage des ressources liées aux clusters Kubernetes.

Application de balises définies à l'équilibreur de charge

Les balises définies sont configurées et gérées par un administrateur de balises. Une balise définie est composée d'un espace de noms de balise, d'une clé et d'une valeur. Pour pouvoir appliquer une balise définie à une ressource, vous devez configurer l'espace de noms de balise et la définition de clé de balise dans une location.

Pour indiquer que le contrôleur d'entrée natif OCI doit appliquer des balises définies à l'équilibreur de charge, utilisez l'annotation oci-native-ingress.oraclecloud.com/defined-tags dans le manifeste IngressClass, au format suivant :

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: <ic-name>
  annotations:
    oci-native-ingress.oraclecloud.com/defined-tags: '{"<tag-namespace>": {"<tag-key>": "<tag-value>"}}'
spec:
  ...

où :

  • <tag-namespace> est l'espace de noms de balise auquel la balise appartient.
  • <tag-key> est le nom d'une balise définie à appliquer à l'équilibreur de charge.
  • <tag-value> est soit une valeur pour la balise provenant d'une liste de valeurs prédéfinie, soit une nouvelle valeur, soit vide (selon la configuration de la balise définie).

La valeur de l'annotation oci-native-ingress.oraclecloud.com/defined-tags est une chaîne JSON, ce qui vous permet d'indiquer plusieurs espaces de noms de balise, clés de balise et valeurs de balise au format JSON.

Par exemple :

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: my-ingress-class
  annotations:
    oci-native-ingress.oraclecloud.com/defined-tags: '{"Operations": {"CostCenter": "42", "Department": "001"}, "Sales": {"Region": "US"}}'
spec:
  ...

Si vous modifiez l'une des balises de l'annotation oci-native-ingress.oraclecloud.com/defined-tags du manifeste IngressClass, le contrôleur d'entrée natif OCI réapplique à l'équilibreur de charge toutes les balises définies spécifiées par l'annotation. Toutefois, si une balise définie contient une variable de balise, le contrôleur d'entrée natif OCI applique uniquement la balise définie à l'équilibreur de charge si la balise n'est pas déjà présente.

Pour permettre au contrôleur d'entrée natif OCI d'appliquer des balises définies à un équilibreur de charge, une stratégie IAM appropriée doit exister afin de permettre au contrôleur d'entrée natif OCI d'utiliser l'espace de noms de balise approprié. Pour plus d'informations, reportez-vous à :

Application de balises à format libre à l'équilibreur de charge

Les balises à format libre ne sont pas gérées par un administrateur de balises. Une balise à format libre se compose d'une clé et d'une valeur. Contrairement aux balises définies, les balises à format libre ne font pas partie d'un espace de noms de balise.

Pour indiquer que le contrôleur d'entrée natif OCI doit appliquer des balises à format libre à l'équilibreur de charge, utilisez l'annotation oci-native-ingress.oraclecloud.com/freeform-tags dans le manifeste IngressClass, au format suivant :

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: <ic-name>
  annotations:
    oci-native-ingress.oraclecloud.com/freeform-tags: '{"<tag-key>": "<tag-value>"}'
spec:
  ...

où :

  • <tag-key> est le nom de la balise à format libre à appliquer à l'équilibreur de charge.
  • <tag-value> est la valeur de la balise à format libre à appliquer à l'équilibreur de charge.

La valeur de l'annotation oci-native-ingress.oraclecloud.com/freeform-tags est une chaîne JSON, ce qui vous permet d'indiquer plusieurs clés de balise et valeurs de balise au format JSON.

Par exemple :

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: my-ingress-class
  annotations:
    oci-native-ingress.oraclecloud.com/freeform-tags: '{"Project": "Red", "Version": "Alpha"}'
spec:
  ...

Si vous modifiez l'une des balises de l'annotation oci-native-ingress.oraclecloud.com/freeform-tags du manifeste IngressClass, le contrôleur d'entrée natif OCI réapplique à l'équilibreur de charge toutes les balises à format libre spécifiées par l'annotation.

Application des valeurs de balise par défaut à l'équilibreur de charge

Les valeurs de balise par défaut sont configurées pour un compartiment spécifique. Les valeurs de balise par défaut sont propres au compartiment. Les valeurs de balise par défaut indiquent les balises définies qui sont appliquées automatiquement à toutes les ressources créées dans un compartiment spécifique au moment de la création.

Lors de l'utilisation du contrôleur d'entrée natif OCI version 1.4.0 (ou ultérieure), les valeurs de balise par défaut sont automatiquement appliquées aux équilibreurs de charge créés par le contrôleur d'entrée natif OCI. Par la suite, le contrôleur d'entrée natif OCI conserve une valeur de balise par défaut appliquée à un équilibreur de charge, sauf si l'une des conditions suivantes est remplie :

  • Vous enlevez manuellement une valeur de balise par défaut qui a été automatiquement appliquée à un équilibreur de charge.
  • Vous indiquez une valeur de balise par défaut en tant que balise définie, à l'aide de l'annotation oci-native-ingress.oraclecloud.com/defined-tags (dans ce cas, le contrôleur d'entrée natif OCI traite la valeur de balise par défaut comme toute autre balise définie).

Notez que les valeurs par défaut de balise avec des valeurs appliquées par l'utilisateur ne sont pas prises en charge. Si une valeur de balise par défaut avec une valeur appliquée par l'utilisateur a été configurée pour un compartiment dans lequel le contrôleur d'entrée natif OCI doit créer ou gérer un équilibreur de charge, vous devez utiliser l'annotation oci-native-ingress.oraclecloud.com/defined-tags pour indiquer la valeur de balise par défaut en tant que balise définie.

Pour les équilibreurs de charge créés à l'aide d'une version de contrôleur d'entrée native OCI antérieure à la version 1.4.0, ou lorsque vous utilisez l'annotation oci-native-ingress.oraclecloud.com/id pour indiquer que le contrôleur d'entrée natif OCI doit gérer un équilibreur de charge existant, les valeurs de balise par défaut ne sont pas prises en charge. Dans les deux cas, pour appliquer ou conserver une valeur de balise par défaut, utilisez l'annotation oci-native-ingress.oraclecloud.com/defined-tags pour indiquer la valeur de balise par défaut en tant que balise définie.