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
- Personnalisation du comportement du contrôleur d'entrée natif OCI à l'aide d'annotations
- Configuration d'un point de contrôle de préparation des pods
- Configuration des processus d'écoute TCP
- Ajout de la prise en charge des demandes HTTPS/TLS
- Agrégation des ports de processus d'écoute HTTP/HTTPS
- Conservation de l'équilibreur de charge après la suppression de IngressClass
- Application de balises à l'équilibreur de charge
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 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 |
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
kubectl get pods -o wide -w
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 :
- Définissez une nouvelle ressource entrante dans un fichier .yaml. Reportez-vous à Création d'une ressource entrante.
- Dans la section
metadata:
, ajoutez un élémentannotations:
et définissez l'annotationoci-native-ingress.oraclecloud.com/protocol
surTCP
, au format suivant :kind: Ingress metadata: name: <i-name> annotations: oci-native-ingress.oraclecloud.com/protocol: TCP spec: ...
où
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: ...
- Dans la section
rules:
du manifeste de ressourceIngress
, ajoutez une règle pour chaque processus d'écoute qui doit recevoir le trafic TCP :- (recommandé) Définissez
paths.pathType
surImplementationSpecific
. - 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 versmy-second-svc:8081
, vous pouvez configurer un manifeste de ressourceIngress
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
- (recommandé) Définissez
-
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 :
- Option 1 : le contrôleur d'entrée natif OCI obtient un certificat du service Certificates à l'aide d'une clé secrète Kubernetes : vous créez une clé secrète Kubernetes et indiquez le nom de la clé secrète dans un manifeste de ressource
Ingress
. Le contrôleur d'entrée natif OCI utilise la clé secrète Kubernetes pour obtenir un certificat et un package d'autorité de certification (package d'autorité de certification) à partir du service OCI Certificates. Le contrôleur d'entrée natif OCI associe le certificat et le package d'autorité de certification au processus d'écoute et à l'ensemble de back-ends. - Option 2 : vous obtenez le certificat auprès du service Certificates : vous créez vous-même manuellement un certificat dans le service OCI Certificates. Vous indiquez ensuite l'OCID du certificat dans le manifeste de ressource
Ingress
en tant qu'annotation. Le contrôleur d'entrée natif OCI associe le certificat au processus d'écoute et à l'ensemble de back-ends.
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'annotationoci-native-ingress.oraclecloud.com/id
(sauf si vous avez définioci-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 ressourceIngress
, 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'annotationoci-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 :
- 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) :
-
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
-
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é.
-
- 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
:-
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 omettreca.cert
, à condition d'inclure toute la chaîne de certificats en tant que valeur detls.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
-
Créez la ressource de clé secrète en saisissant
kubectl create -f <filename>.yaml
-
-
- Ajoutez la clé secrète Kubernetes à un manifeste de ressource
Ingress
:- Définissez une nouvelle ressource entrante dans un fichier .yaml. Reportez-vous à Création d'une ressource entrante.
- Dans la section
spec:
du manifeste, ajoutez un élémenttls:
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
- 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
-
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 :
- 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.
- Notez l'OCID du certificat.
- Ajoutez l'OCID du certificat à un manifeste de ressource
Ingress
:- Définissez une nouvelle ressource entrante dans un fichier .yaml. Reportez-vous à Création d'une ressource entrante.
- Dans la section
metadata:
, ajoutez un élémentannotations:
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: ...
- Dans la section
rules:
du manifeste de ressourceIngress
, 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
-
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
etoci-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'annotationoci-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 ressourceIngress
) - applique l'annotation
oci-native-ingress.oraclecloud.com/https-listener-port
(si elle est présente dans le manifeste de ressourceIngress
) afin de créer un processus d'écoute unique pour tout le trafic
- ignore l'annotation
- Quelles que soient les annotations
oci-native-ingress.oraclecloud.com/http-listener-port
etoci-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 ressourceIngress
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 ressourceIngress
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
etoci-native-ingress.oraclecloud.com/https-listener-port
dans un manifeste de ressourceIngress
qui définit uniquement les back-ends HTTP, le contrôleur d'entrée natif OCI ignore l'annotationoci-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
etoci-native-ingress.oraclecloud.com/https-listener-port
dans un manifeste de ressourceIngress
qui définit uniquement les back-ends HTTPS, le contrôleur d'entrée natif OCI ignore l'annotationoci-native-ingress.oraclecloud.com/http-listener-port
et ne crée pas de processus d'écoute HTTP.
- Si vous incluez l'annotation
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.