Mise en réseau

OpenShift Container Platform 4.12

Configuration et gestion de la mise en réseau des clusters

Red Hat OpenShift Documentation Team

Résumé

Ce document fournit des instructions pour configurer et gérer le réseau de votre cluster OpenShift Container Platform, y compris le DNS, l'entrée et le réseau Pod.

Chapitre 1. About networking

Red Hat OpenShift Networking est un écosystème de fonctionnalités, de plugins et de capacités de mise en réseau avancées qui étendent la mise en réseau de Kubernetes avec les fonctionnalités avancées liées à la mise en réseau dont votre cluster a besoin pour gérer son trafic réseau pour un ou plusieurs clusters hybrides. Cet écosystème de capacités de mise en réseau intègre l'entrée, la sortie, l'équilibrage de charge, le débit haute performance, la sécurité, la gestion du trafic inter- et intra-cluster et fournit un outil d'observabilité basé sur les rôles pour réduire ses complexités naturelles.

La liste suivante met en évidence certaines des fonctionnalités de Red Hat OpenShift Networking les plus couramment utilisées et disponibles sur votre cluster :

  • Réseau primaire du cluster fourni par l'un des plugins Container Network Interface (CNI) suivants :

    • Plugin réseau OVN-Kubernetes, le plugin par défaut est le plugin réseau OVN-Kubernetes
    • Plugin réseau SDN OpenShift, une alternative optionnelle
  • Plugins de réseaux primaires alternatifs certifiés par des tiers
  • Opérateur de réseau en grappe pour la gestion des plugins de réseau
  • Opérateur d'entrée pour le trafic web crypté TLS
  • Opérateur DNS pour l'attribution des noms
  • MetalLB Operator pour l'équilibrage de la charge de trafic sur les clusters bare metal
  • Prise en charge du basculement IP pour une haute disponibilité
  • Prise en charge supplémentaire des réseaux matériels grâce à plusieurs plugins CNI, notamment pour les réseaux matériels macvlan, ipvlan et SR-IOV
  • IPv4, IPv6 et adressage double pile
  • Clusters hybrides Linux-Windows pour les charges de travail basées sur Windows
  • Red Hat OpenShift Service Mesh pour la découverte, l'équilibrage de charge, l'authentification de service à service, la reprise sur panne, les métriques et la surveillance des services
  • OpenShift à nœud unique
  • Opérateur d'observabilité du réseau pour le débogage et l'analyse du réseau
  • Technologies Submariner et Red Hat Application Interconnect pour la mise en réseau entre clusters

Chapitre 2. Comprendre la mise en réseau

Les administrateurs de clusters disposent de plusieurs options pour exposer au trafic externe les applications qui s'exécutent au sein d'un cluster et pour sécuriser les connexions réseau :

  • Types de services, tels que les ports de nœuds ou les équilibreurs de charge
  • Les ressources de l'API, telles que Ingress et Route

Par défaut, Kubernetes attribue à chaque pod une adresse IP interne pour les applications qui s'exécutent dans le pod. Les pods et leurs conteneurs peuvent fonctionner en réseau, mais les clients extérieurs au cluster n'ont pas accès au réseau. Lorsque vous exposez votre application au trafic externe, le fait de donner à chaque module sa propre adresse IP signifie que les modules peuvent être traités comme des hôtes physiques ou des machines virtuelles en termes d'allocation de ports, de mise en réseau, de nommage, de découverte de services, d'équilibrage de charge, de configuration d'applications et de migration.

Note

Certaines plateformes en nuage proposent des API de métadonnées qui écoutent l'adresse IP 169.254.169.254, une adresse IP locale dans le bloc CIDR d'IPv4 169.254.0.0/16.

Ce bloc CIDR n'est pas accessible depuis le réseau de pods. Les pods qui ont besoin d'accéder à ces adresses IP doivent recevoir un accès au réseau hôte en définissant le champ spec.hostNetwork dans la spécification du pod sur true.

Si vous autorisez un hôte pod à accéder au réseau, vous lui accordez un accès privilégié à l'infrastructure réseau sous-jacente.

2.1. OpenShift Container Platform DNS

Si vous exécutez plusieurs services, tels que des services front-end et back-end à utiliser avec plusieurs pods, des variables d'environnement sont créées pour les noms d'utilisateur, les IP de service, etc. afin que les pods front-end puissent communiquer avec les services back-end. Si le service est supprimé et recréé, une nouvelle adresse IP peut lui être attribuée, ce qui oblige à recréer les pods frontaux pour récupérer les valeurs mises à jour de la variable d'environnement IP du service. En outre, le service back-end doit être créé avant tous les pods front-end pour garantir que l'IP du service est générée correctement et qu'elle peut être fournie aux pods front-end en tant que variable d'environnement.

Pour cette raison, OpenShift Container Platform dispose d'un DNS intégré de sorte que les services peuvent être atteints par le DNS du service ainsi que par l'IP/port du service.

2.2. Opérateur Ingress de la plateforme de conteneurs OpenShift

Lorsque vous créez votre cluster OpenShift Container Platform, les pods et les services s'exécutant sur le cluster se voient attribuer chacun leur propre adresse IP. Les adresses IP sont accessibles aux autres pods et services fonctionnant à proximité, mais ne sont pas accessibles aux clients extérieurs. L'opérateur d'ingestion (Ingress Operator) met en œuvre l'API IngressController et est le composant responsable de l'activation de l'accès externe aux services de cluster d'OpenShift Container Platform.

L'opérateur d'ingestion permet aux clients externes d'accéder à votre service en déployant et en gérant un ou plusieurs contrôleurs d'ingestion basés sur HAProxy pour gérer le routage. Vous pouvez utiliser l'opérateur d'ingestion pour acheminer le trafic en spécifiant les ressources OpenShift Container Platform Route et Kubernetes Ingress. Les configurations au sein du contrôleur d'ingestion, telles que la possibilité de définir le type endpointPublishingStrategy et l'équilibrage de charge interne, fournissent des moyens de publier les points d'extrémité du contrôleur d'ingestion.

2.2.1. Comparaison des itinéraires et des entrées

La ressource Kubernetes Ingress dans OpenShift Container Platform met en œuvre le contrôleur Ingress avec un service de routeur partagé qui s'exécute en tant que pod dans le cluster. La façon la plus courante de gérer le trafic Ingress est d'utiliser le contrôleur Ingress. Vous pouvez faire évoluer et répliquer ce pod comme n'importe quel autre pod ordinaire. Ce service de routeur est basé sur HAProxy, qui est une solution d'équilibreur de charge open source.

La route OpenShift Container Platform fournit le trafic Ingress aux services dans le cluster. Les routes offrent des fonctionnalités avancées qui peuvent ne pas être prises en charge par les contrôleurs d'entrée Kubernetes standard, telles que le recryptage TLS, le passage TLS et le fractionnement du trafic pour les déploiements bleu-vert.

Le trafic entrant accède aux services du cluster par l'intermédiaire d'une route. Les routes et les entrées sont les principales ressources permettant de gérer le trafic entrant. Ingress offre des fonctionnalités similaires à celles d'une route, telles que l'acceptation de demandes externes et leur délégation en fonction de la route. Cependant, avec Ingress, vous ne pouvez autoriser que certains types de connexions : HTTP/2, HTTPS et identification du nom du serveur (SNI), et TLS avec certificat. Dans OpenShift Container Platform, les routes sont générées pour répondre aux conditions spécifiées par la ressource Ingress.

2.3. Glossaire des termes courants pour la mise en réseau de OpenShift Container Platform

Ce glossaire définit les termes courants utilisés dans le contenu des réseaux.

l'authentification
Pour contrôler l'accès à un cluster OpenShift Container Platform, un administrateur de cluster peut configurer l'authentification des utilisateurs et s'assurer que seuls les utilisateurs approuvés accèdent au cluster. Pour interagir avec un cluster OpenShift Container Platform, vous devez vous authentifier auprès de l'API OpenShift Container Platform. Vous pouvez vous authentifier en fournissant un jeton d'accès OAuth ou un certificat client X.509 dans vos demandes à l'API OpenShift Container Platform.
Opérateur d'équilibreur de charge AWS
L'opérateur AWS Load Balancer (ALB) déploie et gère une instance de aws-load-balancer-controller.
Opérateur de réseau en grappe
L'opérateur de réseau de cluster (CNO) déploie et gère les composants du réseau de cluster dans un cluster OpenShift Container Platform. Cela inclut le déploiement du plugin réseau Container Network Interface (CNI) sélectionné pour le cluster lors de l'installation.
carte de configuration
Une carte de configuration permet d'injecter des données de configuration dans les pods. Vous pouvez référencer les données stockées dans une carte de configuration dans un volume de type ConfigMap. Les applications fonctionnant dans un pod peuvent utiliser ces données.
ressource personnalisée (CR)
Un CR est une extension de l'API Kubernetes. Vous pouvez créer des ressources personnalisées.
DNS
Cluster DNS est un serveur DNS qui sert les enregistrements DNS pour les services Kubernetes. Les conteneurs démarrés par Kubernetes incluent automatiquement ce serveur DNS dans leurs recherches DNS.
Opérateur DNS
L'opérateur DNS déploie et gère CoreDNS pour fournir un service de résolution de noms aux pods. Cela permet la découverte de services Kubernetes basée sur le DNS dans OpenShift Container Platform.
déploiement
Un objet de ressource Kubernetes qui maintient le cycle de vie d'une application.
domaine
Le domaine est un nom DNS géré par le contrôleur d'entrée.
évacuation
Processus de partage de données vers l'extérieur par le biais du trafic sortant d'un réseau à partir d'un pod.
Opérateur DNS externe
L'opérateur DNS externe déploie et gère ExternalDNS pour fournir la résolution de nom pour les services et les routes du fournisseur DNS externe à OpenShift Container Platform.
Itinéraire basé sur HTTP
Une route basée sur HTTP est une route non sécurisée qui utilise le protocole de routage HTTP de base et expose un service sur un port d'application non sécurisé.
Entrée
La ressource Kubernetes Ingress dans OpenShift Container Platform met en œuvre le contrôleur Ingress avec un service de routeur partagé qui s'exécute en tant que pod dans le cluster.
Contrôleur d'entrée
L'opérateur d'ingestion gère les contrôleurs d'ingestion. L'utilisation d'un contrôleur d'ingestion est le moyen le plus courant d'autoriser l'accès externe à un cluster OpenShift Container Platform.
l'infrastructure fournie par l'installateur
Le programme d'installation déploie et configure l'infrastructure sur laquelle le cluster fonctionne.
kubelet
Un agent de nœud primaire qui s'exécute sur chaque nœud du cluster pour s'assurer que les conteneurs s'exécutent dans un pod.
Opérateur NMState de Kubernetes
L'opérateur Kubernetes NMState fournit une API Kubernetes pour effectuer une configuration réseau basée sur l'état à travers les nœuds du cluster OpenShift Container Platform avec NMState.
kube-proxy
Kube-proxy est un service proxy qui s'exécute sur chaque nœud et aide à mettre des services à la disposition de l'hôte externe. Il aide à transmettre les demandes aux bons conteneurs et est capable d'effectuer un équilibrage primitif de la charge.
équilibreurs de charge
OpenShift Container Platform utilise des répartiteurs de charge pour communiquer depuis l'extérieur du cluster avec les services s'exécutant dans le cluster.
Opérateur MetalLB
En tant qu'administrateur de cluster, vous pouvez ajouter l'opérateur MetalLB à votre cluster afin que lorsqu'un service de type LoadBalancer est ajouté au cluster, MetalLB puisse ajouter une adresse IP externe pour le service.
multidiffusion
Avec la multidiffusion IP, les données sont diffusées simultanément à de nombreuses adresses IP.
espaces nominatifs
Un espace de noms isole des ressources système spécifiques qui sont visibles par tous les processus. À l'intérieur d'un espace de noms, seuls les processus membres de cet espace peuvent voir ces ressources.
la mise en réseau
Informations sur le réseau d'un cluster OpenShift Container Platform.
nœud
Une machine de travail dans le cluster OpenShift Container Platform. Un nœud est soit une machine virtuelle (VM), soit une machine physique.
Opérateur Ingress de la plateforme de conteneurs OpenShift
L'opérateur d'ingestion met en œuvre l'API IngressController et est le composant responsable de l'accès externe aux services d'OpenShift Container Platform.
nacelle
Un ou plusieurs conteneurs avec des ressources partagées, telles que le volume et les adresses IP, fonctionnant dans votre cluster OpenShift Container Platform. Un pod est la plus petite unité de calcul définie, déployée et gérée.
Opérateur PTP
L'opérateur PTP crée et gère les services linuxptp.
itinéraire
La route OpenShift Container Platform fournit le trafic Ingress aux services dans le cluster. Les routes offrent des fonctionnalités avancées qui peuvent ne pas être prises en charge par les contrôleurs d'entrée Kubernetes standard, telles que le recryptage TLS, le passage TLS et le fractionnement du trafic pour les déploiements bleu-vert.
mise à l'échelle
Augmentation ou diminution de la capacité des ressources.
service
Expose une application en cours d'exécution sur un ensemble de pods.
Opérateur de réseau de virtualisation d'E/S à racine unique (SR-IOV)
L'opérateur de réseau SR-IOV (Single Root I/O Virtualization) gère les périphériques réseau SR-IOV et les attachements réseau dans votre cluster.
les réseaux définis par logiciel (SDN)
OpenShift Container Platform utilise une approche de mise en réseau définie par logiciel (SDN) pour fournir un réseau de cluster unifié qui permet la communication entre les pods à travers le cluster OpenShift Container Platform.
Protocole de transmission de contrôle de flux (SCTP)
SCTP est un protocole fiable basé sur des messages qui fonctionne sur un réseau IP.
souillure
Les taches et les tolérances garantissent que les pods sont planifiés sur les nœuds appropriés. Vous pouvez appliquer un ou plusieurs taints à un nœud.
tolérance
Vous pouvez appliquer des tolérances aux modules. Les tolérances permettent à l'ordonnanceur de programmer des pods dont les taches correspondent.
console web
Une interface utilisateur (UI) pour gérer OpenShift Container Platform.

Chapitre 3. Accès aux hôtes

Apprenez à créer un hôte bastion pour accéder aux instances OpenShift Container Platform et aux nœuds du plan de contrôle à l'aide d'un accès shell sécurisé (SSH).

3.1. Accès aux hôtes sur Amazon Web Services dans un cluster d'infrastructure provisionné par l'installateur

Le programme d'installation d'OpenShift Container Platform ne crée pas d'adresses IP publiques pour les instances Amazon Elastic Compute Cloud (Amazon EC2) qu'il provisionne pour votre cluster OpenShift Container Platform. Pour pouvoir accéder par SSH à vos hôtes OpenShift Container Platform, vous devez suivre cette procédure.

Procédure

  1. Créez un groupe de sécurité qui autorise l'accès SSH au nuage privé virtuel (VPC) créé par la commande openshift-install.
  2. Créez une instance Amazon EC2 sur l'un des sous-réseaux publics créés par le programme d'installation.
  3. Associez une adresse IP publique à l'instance Amazon EC2 que vous avez créée.

    Contrairement à l'installation d'OpenShift Container Platform, vous devez associer l'instance Amazon EC2 que vous avez créée à une paire de clés SSH. Le système d'exploitation que vous choisissez pour cette instance n'a pas d'importance, car elle servira simplement de bastion SSH pour relier l'internet au VPC de votre cluster OpenShift Container Platform. L'Amazon Machine Image (AMI) que vous utilisez a son importance. Avec Red Hat Enterprise Linux CoreOS (RHCOS), par exemple, vous pouvez fournir des clés via Ignition, comme le fait le programme d'installation.

  4. Une fois que vous avez provisionné votre instance Amazon EC2 et que vous pouvez y accéder par SSH, vous devez ajouter la clé SSH que vous avez associée à votre installation d'OpenShift Container Platform. Cette clé peut être différente de la clé de l'instance bastion, mais ce n'est pas obligatoire.

    Note

    L'accès SSH direct n'est recommandé que pour la reprise après sinistre. Lorsque l'API Kubernetes est réactive, exécutez plutôt des pods privilégiés.

  5. Exécutez oc get nodes, inspectez la sortie et choisissez l'un des nœuds qui est un maître. Le nom d'hôte ressemble à ip-10-0-1-163.ec2.internal.
  6. À partir de l'hôte SSH Bastion que vous avez déployé manuellement dans Amazon EC2, connectez-vous en SSH à l'hôte du plan de contrôle. Veillez à utiliser la même clé SSH que celle spécifiée lors de l'installation :

    $ ssh -i <ssh-key-path> core@<master-hostname>

Chapitre 4. Aperçu des opérateurs de réseaux

OpenShift Container Platform prend en charge plusieurs types d'opérateurs de mise en réseau. Vous pouvez gérer la mise en réseau du cluster à l'aide de ces opérateurs de mise en réseau.

4.1. Opérateur de réseau en grappe

L'opérateur de réseau de cluster (CNO) déploie et gère les composants du réseau de cluster dans un cluster OpenShift Container Platform. Cela inclut le déploiement du plugin réseau Container Network Interface (CNI) sélectionné pour le cluster lors de l'installation. Pour plus d'informations, voir Cluster Network Operator dans OpenShift Container Platform.

4.2. Opérateur DNS

L'opérateur DNS déploie et gère CoreDNS pour fournir un service de résolution de noms aux pods. Cela permet la découverte de services Kubernetes basés sur le DNS dans OpenShift Container Platform. Pour plus d'informations, voir DNS Operator dans OpenShift Container Platform.

4.3. Opérateur d'entrée

Lorsque vous créez votre cluster OpenShift Container Platform, les pods et les services fonctionnant sur le cluster se voient attribuer des adresses IP. Les adresses IP sont accessibles à d'autres pods et services fonctionnant à proximité, mais ne sont pas accessibles aux clients externes. L'opérateur d'ingestion met en œuvre l'API du contrôleur d'ingestion et est responsable de l'activation de l'accès externe aux services du cluster OpenShift Container Platform. Pour plus d'informations, voir Ingress Operator dans OpenShift Container Platform.

4.4. Opérateur DNS externe

L'opérateur DNS externe déploie et gère ExternalDNS pour fournir la résolution de nom pour les services et les routes du fournisseur DNS externe à OpenShift Container Platform. Pour plus d'informations, voir Comprendre l'opérateur DNS externe.

4.5. Opérateur du pare-feu du nœud d'entrée

L'opérateur du pare-feu du nœud d'entrée utilise un filtre de paquets Berkley étendu (eBPF) et un plugin eXpress Data Path (XDP) pour traiter les règles du pare-feu du nœud, mettre à jour les statistiques et générer des événements pour le trafic abandonné. L'opérateur gère les ressources du pare-feu du nœud d'entrée, vérifie la configuration du pare-feu, n'autorise pas les règles mal configurées susceptibles d'empêcher l'accès au cluster et charge les programmes XDP du pare-feu du nœud d'entrée sur les interfaces sélectionnées dans l'objet ou les objets de la règle. Pour plus d'informations, voir Comprendre l'opérateur de pare-feu de nœud d'entrée

Chapitre 5. Opérateur de réseau de clusters dans OpenShift Container Platform

Le Cluster Network Operator (CNO) déploie et gère les composants du réseau de cluster sur un cluster OpenShift Container Platform, y compris le plugin réseau Container Network Interface (CNI) sélectionné pour le cluster lors de l'installation.

5.1. Opérateur de réseau en grappe

L'opérateur de réseau de cluster met en œuvre l'API network du groupe d'API operator.openshift.io. L'opérateur déploie le plugin réseau OVN-Kubernetes, ou le plugin de fournisseur de réseau que vous avez sélectionné lors de l'installation du cluster, à l'aide d'un ensemble de démons.

Procédure

L'opérateur de réseau de cluster est déployé lors de l'installation en tant que Kubernetes Deployment.

  1. Exécutez la commande suivante pour afficher l'état du déploiement :

    $ oc get -n openshift-network-operator deployment/network-operator

    Exemple de sortie

    NAME               READY   UP-TO-DATE   AVAILABLE   AGE
    network-operator   1/1     1            1           56m

  2. Exécutez la commande suivante pour afficher l'état de l'opérateur de réseau de cluster :

    $ oc get clusteroperator/network

    Exemple de sortie

    NAME      VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
    network   4.5.4     True        False         False      50m

    Les champs suivants fournissent des informations sur l'état de l'opérateur : AVAILABLE, PROGRESSING, et DEGRADED. Le champ AVAILABLE est True lorsque l'opérateur de réseau de groupe signale un état de disponibilité.

5.2. Visualisation de la configuration du réseau de la grappe

Chaque nouvelle installation d'OpenShift Container Platform possède un objet network.config nommé cluster.

Procédure

  • Utilisez la commande oc describe pour afficher la configuration du réseau de la grappe :

    $ oc describe network.config/cluster

    Exemple de sortie

    Name:         cluster
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  config.openshift.io/v1
    Kind:         Network
    Metadata:
      Self Link:           /apis/config.openshift.io/v1/networks/cluster
    Spec: 1
      Cluster Network:
        Cidr:         10.128.0.0/14
        Host Prefix:  23
      Network Type:   OpenShiftSDN
      Service Network:
        172.30.0.0/16
    Status: 2
      Cluster Network:
        Cidr:               10.128.0.0/14
        Host Prefix:        23
      Cluster Network MTU:  8951
      Network Type:         OpenShiftSDN
      Service Network:
        172.30.0.0/16
    Events:  <none>

    1
    Le champ Spec affiche l'état configuré du réseau cluster.
    2
    Le champ Status affiche l'état actuel de la configuration du réseau de la grappe.

5.3. Visualisation du statut de l'opérateur de réseau de cluster

Vous pouvez inspecter l'état et afficher les détails de l'opérateur de réseau de cluster à l'aide de la commande oc describe.

Procédure

  • Exécutez la commande suivante pour afficher l'état de l'opérateur de réseau de cluster :

    $ oc describe clusteroperators/network

5.4. Visualisation des journaux de l'opérateur de réseau de clusters

Vous pouvez consulter les journaux de l'opérateur de réseau de cluster à l'aide de la commande oc logs.

Procédure

  • Exécutez la commande suivante pour afficher les journaux de l'opérateur de réseau de cluster :

    $ oc logs --namespace=openshift-network-operator deployment/network-operator

5.5. Cluster Network Operator configuration

The configuration for the cluster network is specified as part of the Cluster Network Operator (CNO) configuration and stored in a custom resource (CR) object that is named cluster. The CR specifies the fields for the Network API in the operator.openshift.io API group.

The CNO configuration inherits the following fields during cluster installation from the Network API in the Network.config.openshift.io API group and these fields cannot be changed:

clusterNetwork
IP address pools from which pod IP addresses are allocated.
serviceNetwork
IP address pool for services.
defaultNetwork.type
Cluster network plugin, such as OpenShift SDN or OVN-Kubernetes.
Note

Après l'installation du cluster, vous ne pouvez pas modifier les champs énumérés dans la section précédente.

You can specify the cluster network plugin configuration for your cluster by setting the fields for the defaultNetwork object in the CNO object named cluster.

5.5.1. Cluster Network Operator configuration object

The fields for the Cluster Network Operator (CNO) are described in the following table:

Tableau 5.1. Cluster Network Operator configuration object

FieldTypeDescription

metadata.name

string

The name of the CNO object. This name is always cluster.

spec.clusterNetwork

array

A list specifying the blocks of IP addresses from which pod IP addresses are allocated and the subnet prefix length assigned to each individual node in the cluster. For example:

spec:
  clusterNetwork:
  - cidr: 10.128.0.0/19
    hostPrefix: 23
  - cidr: 10.128.32.0/19
    hostPrefix: 23

Cette valeur est prête à l'emploi et héritée de l'objet Network.config.openshift.io nommé cluster lors de l'installation du cluster.

spec.serviceNetwork

array

A block of IP addresses for services. The OpenShift SDN and OVN-Kubernetes network plugins support only a single IP address block for the service network. For example:

spec:
  serviceNetwork:
  - 172.30.0.0/14

Cette valeur est prête à l'emploi et héritée de l'objet Network.config.openshift.io nommé cluster lors de l'installation du cluster.

spec.defaultNetwork

object

Configures the network plugin for the cluster network.

spec.kubeProxyConfig

object

The fields for this object specify the kube-proxy configuration. If you are using the OVN-Kubernetes cluster network plugin, the kube-proxy configuration has no effect.

defaultNetwork object configuration

The values for the defaultNetwork object are defined in the following table:

Tableau 5.2. defaultNetwork object

FieldTypeDescription

type

string

Either OpenShiftSDN or OVNKubernetes. The Red Hat OpenShift Networking network plugin is selected during installation. This value cannot be changed after cluster installation.

Note

OpenShift Container Platform uses the OVN-Kubernetes network plugin by default.

openshiftSDNConfig

object

This object is only valid for the OpenShift SDN network plugin.

ovnKubernetesConfig

object

This object is only valid for the OVN-Kubernetes network plugin.

Configuration for the OpenShift SDN network plugin

The following table describes the configuration fields for the OpenShift SDN network plugin:

Tableau 5.3. openshiftSDNConfig object

FieldTypeDescription

mode

string

Le mode d'isolation du réseau pour OpenShift SDN.

mtu

integer

L'unité de transmission maximale (MTU) pour le réseau superposé VXLAN. Cette valeur est normalement configurée automatiquement.

vxlanPort

integer

Le port à utiliser pour tous les paquets VXLAN. La valeur par défaut est 4789.

Note

Vous ne pouvez modifier la configuration du plugin réseau de votre cluster que lors de l'installation du cluster.

Example OpenShift SDN configuration

defaultNetwork:
  type: OpenShiftSDN
  openshiftSDNConfig:
    mode: NetworkPolicy
    mtu: 1450
    vxlanPort: 4789

Configuration for the OVN-Kubernetes network plugin

The following table describes the configuration fields for the OVN-Kubernetes network plugin:

Tableau 5.4. ovnKubernetesConfig object

FieldTypeDescription

mtu

integer

L'unité de transmission maximale (MTU) pour le réseau superposé Geneve (Generic Network Virtualization Encapsulation). Cette valeur est normalement configurée automatiquement.

genevePort

integer

Le port UDP pour le réseau superposé de Geneve.

ipsecConfig

object

Si le champ est présent, IPsec est activé pour le cluster.

policyAuditConfig

object

Specify a configuration object for customizing network policy audit logging. If unset, the defaults audit log settings are used.

gatewayConfig

object

Optional: Specify a configuration object for customizing how egress traffic is sent to the node gateway.

Note
While migrating egress traffic, you can expect some disruption to workloads and service traffic until the Cluster Network Operator (CNO) successfully rolls out the changes.

v4InternalSubnet

If your existing network infrastructure overlaps with the 100.64.0.0/16 IPv4 subnet, you can specify a different IP address range for internal use by OVN-Kubernetes. You must ensure that the IP address range does not overlap with any other subnet used by your OpenShift Container Platform installation. The IP address range must be larger than the maximum number of nodes that can be added to the cluster.

For example, if the clusterNetwork.cidr is 10.128.0.0/14 and the clusterNetwork.hostPrefix is /23, then the maximum number of nodes is 2^(23-14)=128. An IP address is also required for the gateway, network, and broadcast addresses. Therefore the internal IP address range must be at least a /24.

This field cannot be changed after installation.

The default value is 100.64.0.0/16.

v6InternalSubnet

If your existing network infrastructure overlaps with the fd98::/48 IPv6 subnet, you can specify a different IP address range for internal use by OVN-Kubernetes. You must ensure that the IP address range does not overlap with any other subnet used by your OpenShift Container Platform installation. The IP address range must be larger than the maximum number of nodes that can be added to the cluster.

This field cannot be changed after installation.

The default value is fd98::/48.

Tableau 5.5. policyAuditConfig object

FieldTypeDescription

rateLimit

entier

The maximum number of messages to generate every second per node. The default value is 20 messages per second.

maxFileSize

entier

The maximum size for the audit log in bytes. The default value is 50000000 or 50 MB.

destination

chaîne de caractères

One of the following additional audit log targets:

libc
The libc syslog() function of the journald process on the host.
udp:<host>:<port>
A syslog server. Replace <host>:<port> with the host and port of the syslog server.
unix:<file>
A Unix Domain Socket file specified by <file>.
null
Do not send the audit logs to any additional target.

syslogFacility

chaîne de caractères

The syslog facility, such as kern, as defined by RFC5424. The default value is local0.

Tableau 5.6. gatewayConfig object

FieldTypeDescription

routingViaHost

boolean

Set this field to true to send egress traffic from pods to the host networking stack. For highly-specialized installations and applications that rely on manually configured routes in the kernel routing table, you might want to route egress traffic to the host networking stack. By default, egress traffic is processed in OVN to exit the cluster and is not affected by specialized routes in the kernel routing table. The default value is false.

This field has an interaction with the Open vSwitch hardware offloading feature. If you set this field to true, you do not receive the performance benefits of the offloading because egress traffic is processed by the host networking stack.

Note

Vous ne pouvez modifier la configuration de votre plugin de réseau de cluster que lors de l'installation du cluster, à l'exception du champ gatewayConfig qui peut être modifié lors de l'exécution en tant qu'activité post-installation.

Example OVN-Kubernetes configuration with IPSec enabled

defaultNetwork:
  type: OVNKubernetes
  ovnKubernetesConfig:
    mtu: 1400
    genevePort: 6081
    ipsecConfig: {}

kubeProxyConfig object configuration

The values for the kubeProxyConfig object are defined in the following table:

Tableau 5.7. kubeProxyConfig object

FieldTypeDescription

iptablesSyncPeriod

string

The refresh period for iptables rules. The default value is 30s. Valid suffixes include s, m, and h and are described in the Go time package documentation.

Note

Because of performance improvements introduced in OpenShift Container Platform 4.3 and greater, adjusting the iptablesSyncPeriod parameter is no longer necessary.

proxyArguments.iptables-min-sync-period

array

The minimum duration before refreshing iptables rules. This field ensures that the refresh does not happen too frequently. Valid suffixes include s, m, and h and are described in the Go time package. The default value is:

kubeProxyConfig:
  proxyArguments:
    iptables-min-sync-period:
    - 0s

5.5.2. Exemple de configuration de l'opérateur de réseau en grappe

Une configuration CNO complète est spécifiée dans l'exemple suivant :

Exemple d'objet Opérateur de réseau en grappe

apiVersion: operator.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  clusterNetwork: 1
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  serviceNetwork: 2
  - 172.30.0.0/16
  defaultNetwork: 3
    type: OpenShiftSDN
    openshiftSDNConfig:
      mode: NetworkPolicy
      mtu: 1450
      vxlanPort: 4789
  kubeProxyConfig:
    iptablesSyncPeriod: 30s
    proxyArguments:
      iptables-min-sync-period:
      - 0s

1 2 3
Configuré uniquement lors de l'installation du cluster.

5.6. Ressources supplémentaires

Chapitre 6. Opérateur DNS dans OpenShift Container Platform

L'opérateur DNS déploie et gère CoreDNS pour fournir un service de résolution de noms aux pods, permettant la découverte de services Kubernetes basés sur le DNS dans OpenShift Container Platform.

6.1. Opérateur DNS

L'opérateur DNS met en œuvre l'API dns du groupe d'API operator.openshift.io. L'opérateur déploie CoreDNS à l'aide d'un ensemble de démons, crée un service pour l'ensemble de démons et configure le kubelet pour demander aux pods d'utiliser l'adresse IP du service CoreDNS pour la résolution de noms.

Procédure

L'opérateur DNS est déployé lors de l'installation avec un objet Deployment.

  1. Utilisez la commande oc get pour afficher l'état du déploiement :

    $ oc get -n openshift-dns-operator deployment/dns-operator

    Exemple de sortie

    NAME           READY     UP-TO-DATE   AVAILABLE   AGE
    dns-operator   1/1       1            1           23h

  2. Utilisez la commande oc get pour afficher l'état de l'opérateur DNS :

    $ oc get clusteroperator/dns

    Exemple de sortie

    NAME      VERSION     AVAILABLE   PROGRESSING   DEGRADED   SINCE
    dns       4.1.0-0.11  True        False         False      92m

    AVAILABLE PROGRESSING et fournissent des informations sur l'état de l'opérateur. est lorsqu'au moins un pod de l'ensemble de démons CoreDNS signale une condition d'état . DEGRADED AVAILABLE True Available

6.2. Modification de l'état de gestion de l'opérateur DNS

DNS gère le composant CoreDNS afin de fournir un service de résolution de noms pour les pods et les services dans le cluster. L'adresse managementState de l'opérateur DNS est définie par défaut sur Managed, ce qui signifie que l'opérateur DNS gère activement ses ressources. Vous pouvez le changer en Unmanaged, ce qui signifie que l'opérateur DNS ne gère pas ses ressources.

Les cas d'utilisation suivants concernent la modification de l'opérateur DNS managementState:

  • Vous êtes un développeur et vous voulez tester un changement de configuration pour voir s'il corrige un problème dans CoreDNS. Vous pouvez empêcher l'opérateur DNS d'écraser le correctif en définissant managementState sur Unmanaged.
  • Vous êtes un administrateur de cluster et vous avez signalé un problème avec CoreDNS, mais vous devez appliquer une solution de contournement jusqu'à ce que le problème soit résolu. Vous pouvez définir le champ managementState de l'opérateur DNS sur Unmanaged pour appliquer la solution de contournement.

Procédure

  • Changer managementState Opérateur DNS :

    oc patch dns.operator.openshift.io default --type merge --patch '{"spec":{"managementState":"Unmanaged"}}'

6.3. Contrôle du placement des pods DNS

L'opérateur DNS dispose de deux ensembles de démons : l'un pour CoreDNS et l'autre pour gérer le fichier /etc/hosts. Le jeu de démons pour /etc/hosts doit être exécuté sur chaque hôte de nœud afin d'ajouter une entrée au registre d'images de cluster pour prendre en charge l'extraction d'images. Les politiques de sécurité peuvent interdire la communication entre les paires de nœuds, ce qui empêche le jeu de démons pour CoreDNS de s'exécuter sur chaque nœud.

En tant qu'administrateur de cluster, vous pouvez utiliser un sélecteur de nœud personnalisé pour configurer le jeu de démons pour CoreDNS afin qu'il s'exécute ou non sur certains nœuds.

Conditions préalables

  • Vous avez installé le CLI oc.
  • Vous êtes connecté au cluster avec un utilisateur disposant des privilèges cluster-admin.

Procédure

  • Pour empêcher la communication entre certains nœuds, configurez le champ spec.nodePlacement.nodeSelector API :

    1. Modifier l'objet Opérateur DNS nommé default:

      $ oc edit dns.operator/default
    2. Spécifiez un sélecteur de nœuds qui n'inclut que les nœuds du plan de contrôle dans le champ spec.nodePlacement.nodeSelector API :

       spec:
         nodePlacement:
           nodeSelector:
             node-role.kubernetes.io/worker: ""
  • Pour permettre au démon défini pour CoreDNS de fonctionner sur les nœuds, configurez une taint et une toleration :

    1. Modifier l'objet Opérateur DNS nommé default:

      $ oc edit dns.operator/default
    2. Spécifier une clé d'altération et une tolérance pour l'altération :

       spec:
         nodePlacement:
           tolerations:
           - effect: NoExecute
             key: "dns-only"
             operators: Equal
             value: abc
             tolerationSeconds: 3600 1
      1
      Si l'erreur est dns-only, elle peut être tolérée indéfiniment. Vous pouvez omettre tolerationSeconds.

6.4. Afficher le DNS par défaut

Chaque nouvelle installation d'OpenShift Container Platform possède un site dns.operator nommé default.

Procédure

  1. Utilisez la commande oc describe pour afficher les paramètres par défaut dns:

    $ oc describe dns.operator/default

    Exemple de sortie

    Name:         default
    Namespace:
    Labels:       <none>
    Annotations:  <none>
    API Version:  operator.openshift.io/v1
    Kind:         DNS
    ...
    Status:
      Cluster Domain:  cluster.local 1
      Cluster IP:      172.30.0.10 2
    ...

    1
    Le champ Domaine de cluster est le domaine DNS de base utilisé pour construire des noms de pods et de domaines de service entièrement qualifiés.
    2
    L'IP du cluster est l'adresse que les pods interrogent pour la résolution des noms. L'IP est définie comme la 10e adresse de la plage CIDR du service.
  2. Pour connaître le CIDR de service de votre cluster, utilisez la commande oc get:

    $ oc get networks.config/cluster -o jsonpath='{$.status.serviceNetwork}'

Exemple de sortie

[172.30.0.0/16]

6.5. Utilisation de la redirection DNS

Vous pouvez utiliser la redirection DNS pour remplacer la configuration de la redirection par défaut dans le fichier /etc/resolv.conf de la manière suivante :

  • Spécifiez les serveurs de noms pour chaque zone. Si la zone transférée est le domaine Ingress géré par OpenShift Container Platform, le serveur de noms en amont doit être autorisé pour le domaine.
  • Fournir une liste de serveurs DNS en amont.
  • Modifier la politique de transfert par défaut.
Note

Une configuration de transfert DNS pour le domaine par défaut peut comporter à la fois les serveurs par défaut spécifiés dans le fichier /etc/resolv.conf et les serveurs DNS en amont.

Procédure

  1. Modifier l'objet Opérateur DNS nommé default:

    $ oc edit dns.operator/default

    Cela permet à l'opérateur de créer et de mettre à jour la carte de configuration nommée dns-default avec des blocs de configuration de serveur supplémentaires basés sur Server. Si aucun des serveurs ne dispose d'une zone correspondant à la requête, la résolution de noms revient aux serveurs DNS en amont.

    Configuration de la redirection DNS

    apiVersion: operator.openshift.io/v1
    kind: DNS
    metadata:
      name: default
    spec:
      servers:
      - name: example-server 1
        zones: 2
        - example.com
        forwardPlugin:
          policy: Random 3
          upstreams: 4
          - 1.1.1.1
          - 2.2.2.2:5353
      upstreamResolvers: 5
        policy: Random 6
        upstreams: 7
        - type: SystemResolvConf 8
        - type: Network
          address: 1.2.3.4 9
          port: 53 10

    1
    Doit être conforme à la syntaxe du nom de service rfc6335.
    2
    Doit être conforme à la définition d'un sous-domaine dans la syntaxe du nom de service rfc1123. Le domaine de cluster, cluster.local, n'est pas un sous-domaine valide pour le champ zones.
    3
    Définit la politique de sélection des résolveurs en amont. La valeur par défaut est Random. Vous pouvez également utiliser les valeurs RoundRobin, et Sequential.
    4
    Un maximum de 15 upstreams est autorisé par forwardPlugin.
    5
    Facultatif. Vous pouvez l'utiliser pour remplacer la stratégie par défaut et transmettre la résolution DNS aux résolveurs DNS spécifiés (résolveurs en amont) pour le domaine par défaut. Si vous ne fournissez pas de résolveurs en amont, les requêtes de nom DNS sont envoyées aux serveurs situés à l'adresse /etc/resolv.conf.
    6
    Détermine l'ordre dans lequel les serveurs en amont sont sélectionnés pour l'interrogation. Vous pouvez spécifier l'une de ces valeurs : Random RoundRobin , ou Sequential. La valeur par défaut est Sequential.
    7
    Facultatif. Vous pouvez l'utiliser pour fournir des résolveurs en amont.
    8
    Vous pouvez spécifier deux types de upstreams - SystemResolvConf et Network. SystemResolvConf configure l'amont pour utiliser /etc/resolv.conf et Network définit un Networkresolver. Vous pouvez spécifier l'un ou l'autre ou les deux.
    9
    Si le type spécifié est Network, vous devez fournir une adresse IP. Le champ address doit être une adresse IPv4 ou IPv6 valide.
    10
    Si le type spécifié est Network, vous pouvez éventuellement indiquer un port. Le champ port doit avoir une valeur comprise entre 1 et 65535. Si vous ne spécifiez pas de port pour l'amont, le port 853 est utilisé par défaut.

    Lorsque vous travaillez dans un environnement très réglementé, vous pouvez avoir besoin de sécuriser le trafic DNS lorsque vous transmettez des requêtes à des résolveurs en amont, afin de garantir un trafic DNS supplémentaire et la confidentialité des données. Les administrateurs de clusters peuvent configurer la sécurité de la couche transport (TLS) pour les requêtes DNS transmises.

    Configuration du transfert DNS avec TLS

    apiVersion: operator.openshift.io/v1
    kind: DNS
    metadata:
      name: default
    spec:
      servers:
      - name: example-server 1
        zones: 2
        - example.com
        forwardPlugin:
          transportConfig:
            transport: TLS 3
            tls:
              caBundle:
                name: mycacert
              serverName: dnstls.example.com  4
          policy: Random 5
          upstreams: 6
          - 1.1.1.1
          - 2.2.2.2:5353
      upstreamResolvers: 7
        transportConfig:
          transport: TLS
          tls:
            caBundle:
              name: mycacert
            serverName: dnstls.example.com
        upstreams:
        - type: Network 8
          address: 1.2.3.4 9
          port: 53 10

    1
    Doit être conforme à la syntaxe du nom de service rfc6335.
    2
    Doit être conforme à la définition d'un sous-domaine dans la syntaxe du nom de service rfc1123. Le domaine de cluster, cluster.local, n'est pas un sous-domaine valide pour le champ zones. Le domaine de cluster, cluster.local, est un subdomain non valide pour zones.
    3
    Lors de la configuration de TLS pour les requêtes DNS transférées, le champ transport doit avoir la valeur TLS. Par défaut, CoreDNS met en cache les connexions transférées pendant 10 secondes. CoreDNS maintiendra une connexion TCP ouverte pendant ces 10 secondes si aucune requête n'est émise. Dans le cas de clusters importants, assurez-vous que votre serveur DNS est conscient du fait qu'il pourrait recevoir de nombreuses nouvelles connexions à maintenir ouvertes, car vous pouvez initier une connexion par nœud. Configurez votre hiérarchie DNS en conséquence pour éviter les problèmes de performance.
    4
    Lors de la configuration de TLS pour les requêtes DNS transmises, il s'agit d'un nom de serveur obligatoire utilisé dans le cadre de l'indication du nom du serveur (SNI) pour valider le certificat du serveur TLS en amont.
    5
    Définit la politique de sélection des résolveurs en amont. La valeur par défaut est Random. Vous pouvez également utiliser les valeurs RoundRobin, et Sequential.
    6
    Il est obligatoire. Vous pouvez l'utiliser pour fournir des résolveurs en amont. Un maximum de 15 entrées upstreams est autorisé par entrée forwardPlugin.
    7
    Facultatif. Vous pouvez l'utiliser pour remplacer la stratégie par défaut et transmettre la résolution DNS aux résolveurs DNS spécifiés (résolveurs en amont) pour le domaine par défaut. Si vous ne fournissez pas de résolveurs en amont, les requêtes de nom DNS sont envoyées aux serveurs situés à l'adresse /etc/resolv.conf.
    8
    Network indique que ce résolveur en amont doit traiter les demandes transférées séparément des résolveurs en amont répertoriés dans /etc/resolv.conf. Seul le type Network est autorisé en cas d'utilisation de TLS et vous devez fournir une adresse IP.
    9
    Le champ address doit être une adresse IPv4 ou IPv6 valide.
    10
    Vous pouvez optionnellement fournir un port. La valeur de port doit être comprise entre 1 et 65535. Si vous ne spécifiez pas de port pour l'amont, le port 853 est utilisé par défaut.
    Note

    Si servers est indéfini ou invalide, la carte de configuration ne contient que le serveur par défaut.

  2. Afficher la carte de configuration :

    $ oc get configmap/dns-default -n openshift-dns -o yaml

    Exemple de ConfigMap DNS basé sur l'exemple précédent de DNS

    apiVersion: v1
    data:
      Corefile: |
        example.com:5353 {
            forward . 1.1.1.1 2.2.2.2:5353
        }
        bar.com:5353 example.com:5353 {
            forward . 3.3.3.3 4.4.4.4:5454 1
        }
        .:5353 {
            errors
            health
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                upstream
                fallthrough in-addr.arpa ip6.arpa
            }
            prometheus :9153
            forward . /etc/resolv.conf 1.2.3.4:53 {
                policy Random
            }
            cache 30
            reload
        }
    kind: ConfigMap
    metadata:
      labels:
        dns.operator.openshift.io/owning-dns: default
      name: dns-default
      namespace: openshift-dns

    1
    Les modifications apportées au site forwardPlugin déclenchent une mise à jour continue de l'ensemble des démons CoreDNS.

Ressources supplémentaires

6.6. Statut de l'opérateur DNS

Vous pouvez inspecter l'état et afficher les détails de l'opérateur DNS à l'aide de la commande oc describe.

Procédure

Consulter l'état de l'opérateur DNS :

$ oc describe clusteroperators/dns

6.7. Journaux de l'opérateur DNS

Vous pouvez consulter les journaux de l'opérateur DNS à l'aide de la commande oc logs.

Procédure

Consulter les journaux de l'opérateur DNS :

$ oc logs -n openshift-dns-operator deployment/dns-operator -c dns-operator

6.8. Configuration du niveau de journalisation de CoreDNS

Vous pouvez configurer le niveau du journal CoreDNS pour déterminer la quantité de détails dans les messages d'erreur enregistrés. Les valeurs valides pour le niveau de journalisation du CoreDNS sont Normal, Debug, et Trace. La valeur par défaut logLevel est Normal.

Note

Le plugin d'erreurs est toujours activé. Les paramètres suivants de logLevel donnent lieu à des réponses d'erreur différentes :

  • logLevel: Normal active la classe "erreurs" : log . { class error }.
  • logLevel: Debug active la classe "denial" : log . { class denial error }.
  • logLevel: Trace active la classe "all" : log . { class all }.

Procédure

  • Pour remplacer logLevel par Debug, entrez la commande suivante :

    $ oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Debug"}}' --type=merge
  • Pour remplacer logLevel par Trace, entrez la commande suivante :

    $ oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Trace"}}' --type=merge

Vérification

  • Pour s'assurer que le niveau de journalisation souhaité a été défini, vérifiez la carte de configuration :

    $ oc get configmap/dns-default -n openshift-dns -o yaml

6.9. Configuration du niveau de journalisation de l'opérateur CoreDNS

Les administrateurs de clusters peuvent configurer le niveau de journal de l'opérateur afin de localiser plus rapidement les problèmes DNS d'OpenShift. Les valeurs valides pour operatorLogLevel sont Normal, Debug, et Trace. Trace contient les informations les plus détaillées. La valeur par défaut de operatorlogLevel est Normal. Il existe sept niveaux de journalisation pour les problèmes : Trace, Debug, Info, Warning, Error, Fatal et Panic. Une fois le niveau de journalisation défini, les entrées de journal correspondant à ce niveau de gravité ou à un niveau supérieur seront enregistrées.

  • operatorLogLevel: "Normal" set logrus.SetLogLevel("Info").
  • operatorLogLevel: "Debug" set logrus.SetLogLevel("Debug").
  • operatorLogLevel: "Trace" set logrus.SetLogLevel("Trace").

Procédure

  • Pour remplacer operatorLogLevel par Debug, entrez la commande suivante :

    $ oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Debug"}}' --type=merge
  • Pour remplacer operatorLogLevel par Trace, entrez la commande suivante :

    $ oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Trace"}}' --type=merge

6.10. Optimisation du cache CoreDNS

Vous pouvez configurer la durée maximale de la mise en cache réussie ou non, également connue sous le nom de mise en cache positive ou négative, effectuée par CoreDNS. Le réglage de la durée de la mise en cache des réponses aux requêtes DNS peut réduire la charge des résolveurs DNS en amont.

Procédure

  1. Modifiez l'objet Opérateur DNS nommé default en exécutant la commande suivante :

    $ oc edit dns.operator.openshift.io/default
  2. Modifier les valeurs de mise en cache de la durée de vie (TTL) :

    Configuration de la mise en cache DNS

    apiVersion: operator.openshift.io/v1
    kind: DNS
    metadata:
      name: default
    spec:
      cache:
        positiveTTL: 1h 1
        negativeTTL: 0.5h10m 2

    1
    La valeur de la chaîne 1h est convertie en nombre de secondes par CoreDNS. Si ce champ est omis, la valeur est supposée être 0s et le cluster utilise la valeur interne par défaut de 900s comme solution de repli.
    2
    La valeur de la chaîne peut être une combinaison d'unités telles que 0.5h10m et est convertie en nombre de secondes par CoreDNS. Si ce champ est omis, la valeur est supposée être 0s et le cluster utilise la valeur interne par défaut de 30s comme solution de repli.
    Avertissement

    La définition de champs TTL de faible valeur peut entraîner une augmentation de la charge sur le cluster, sur les résolveurs en amont, ou sur les deux.

Chapitre 7. Opérateur Ingress dans OpenShift Container Platform

7.1. Opérateur Ingress de la plateforme de conteneurs OpenShift

Lorsque vous créez votre cluster OpenShift Container Platform, les pods et les services s'exécutant sur le cluster se voient attribuer chacun leur propre adresse IP. Les adresses IP sont accessibles aux autres pods et services fonctionnant à proximité, mais ne sont pas accessibles aux clients extérieurs. L'opérateur d'ingestion (Ingress Operator) met en œuvre l'API IngressController et est le composant responsable de l'activation de l'accès externe aux services de cluster d'OpenShift Container Platform.

L'opérateur d'ingestion permet aux clients externes d'accéder à votre service en déployant et en gérant un ou plusieurs contrôleurs d'ingestion basés sur HAProxy pour gérer le routage. Vous pouvez utiliser l'opérateur d'ingestion pour acheminer le trafic en spécifiant les ressources OpenShift Container Platform Route et Kubernetes Ingress. Les configurations au sein du contrôleur d'ingestion, telles que la possibilité de définir le type endpointPublishingStrategy et l'équilibrage de charge interne, fournissent des moyens de publier les points d'extrémité du contrôleur d'ingestion.

7.2. L'actif de configuration Ingress

Le programme d'installation génère un bien avec une ressource Ingress dans le groupe API config.openshift.io, cluster-ingress-02-config.yml.

Définition YAML de la ressource Ingress

apiVersion: config.openshift.io/v1
kind: Ingress
metadata:
  name: cluster
spec:
  domain: apps.openshiftdemos.com

Le programme d'installation stocke cette ressource dans le fichier cluster-ingress-02-config.yml du répertoire manifests/. Cette ressource Ingress définit la configuration de l'ensemble du cluster pour Ingress. Cette configuration d'Ingress est utilisée comme suit :

  • L'opérateur d'entrée utilise le domaine de la configuration d'entrée du cluster comme domaine pour le contrôleur d'entrée par défaut.
  • L'opérateur OpenShift API Server utilise le domaine de la configuration Ingress du cluster. Ce domaine est également utilisé lors de la génération d'un hôte par défaut pour une ressource Route qui ne spécifie pas d'hôte explicite.

7.3. Paramètres de configuration du contrôleur d'entrée

La ressource ingresscontrollers.operator.openshift.io offre les paramètres de configuration suivants.

ParamètresDescription

domain

domain est un nom DNS géré par le contrôleur d'entrée et est utilisé pour configurer plusieurs fonctions :

  • Pour la stratégie de publication des points finaux LoadBalancerService, domain est utilisé pour configurer les enregistrements DNS. Voir endpointPublishingStrategy.
  • Lors de l'utilisation d'un certificat par défaut généré, le certificat est valable pour domain et son subdomains. Voir defaultCertificate.
  • La valeur est publiée dans les statuts individuels de l'itinéraire afin que les utilisateurs sachent où cibler les enregistrements DNS externes.

La valeur domain doit être unique pour tous les contrôleurs d'entrée et ne peut pas être mise à jour.

S'il est vide, la valeur par défaut est ingress.config.openshift.io/cluster .spec.domain .

replicas

replicas est le nombre souhaité de répliques du contrôleur d'entrée. Si elle n'est pas définie, la valeur par défaut est 2.

endpointPublishingStrategy

endpointPublishingStrategy est utilisé pour publier les points d'extrémité du contrôleur d'entrée sur d'autres réseaux, permettre des intégrations d'équilibreurs de charge et fournir un accès à d'autres systèmes.

Sur GCP, AWS et Azure, vous pouvez configurer les champs endpointPublishingStrategy suivants :

  • loadBalancer.scope
  • loadBalancer.allowedSourceRanges

Si elle n'est pas définie, la valeur par défaut est basée sur infrastructure.config.openshift.io/cluster .status.platform :

  • Amazon Web Services (AWS) : LoadBalancerService (avec champ d'application externe)
  • Azure : LoadBalancerService (avec portée externe)
  • Google Cloud Platform (GCP) : LoadBalancerService (avec une portée externe)
  • Métal nu : NodePortService
  • Autre : HostNetwork

    Note

    HostNetwork possède un champ hostNetwork avec les valeurs par défaut suivantes pour les ports de liaison optionnels : httpPort: 80, httpsPort: 443, et statsPort: 1936. Avec les ports de liaison, vous pouvez déployer plusieurs contrôleurs d'entrée sur le même nœud pour la stratégie HostNetwork.

    Exemple :

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: internal
      namespace: openshift-ingress-operator
    spec:
      domain: example.com
      endpointPublishingStrategy:
        type: HostNetwork
        hostNetwork:
          httpPort: 80
          httpsPort: 443
          statsPort: 1936

    Note

    Sur Red Hat OpenStack Platform (RHOSP), la stratégie de publication des points d'extrémité LoadBalancerService n'est prise en charge que si un fournisseur de cloud est configuré pour créer des moniteurs de santé. Pour RHOSP 16.1 et 16.2, cette stratégie n'est possible que si vous utilisez le fournisseur Amphora Octavia.

    Pour plus d'informations, voir la section "Setting cloud provider options" de la documentation d'installation de RHOSP.

Pour la plupart des plateformes, la valeur endpointPublishingStrategy peut être mise à jour. Sur GCP, vous pouvez configurer les champs endpointPublishingStrategy suivants :

  • loadBalancer.scope
  • loadbalancer.providerParameters.gcp.clientAccess
  • hostNetwork.protocol
  • nodePort.protocol

defaultCertificate

La valeur defaultCertificate est une référence à un secret qui contient le certificat par défaut servi par le contrôleur d'entrée. Lorsque les itinéraires ne spécifient pas leur propre certificat, c'est la valeur defaultCertificate qui est utilisée.

The secret must contain the following keys and data: * tls.crt: certificate file contents * tls.key: key file contents

S'il n'est pas défini, un certificat générique est automatiquement généré et utilisé. Le certificat est valable pour le contrôleur d'entrée domain et subdomains, et l'autorité de certification du certificat généré est automatiquement intégrée à la liste de confiance du cluster.

Le certificat en cours d'utilisation, qu'il soit généré ou spécifié par l'utilisateur, est automatiquement intégré au serveur OAuth intégré à OpenShift Container Platform.

namespaceSelector

namespaceSelector est utilisé pour filtrer l'ensemble des espaces de noms gérés par le contrôleur d'entrée. Cette fonction est utile pour la mise en place des "shards".

routeSelector

routeSelector est utilisé pour filtrer l'ensemble des routes desservies par le contrôleur d'entrée. Cette fonction est utile pour la mise en place de zones de stockage.

nodePlacement

nodePlacement permet un contrôle explicite de la programmation du contrôleur d'entrée.

Si ce n'est pas le cas, les valeurs par défaut sont utilisées.

Note

Le paramètre nodePlacement comprend deux parties, nodeSelector et tolerations. Par exemple :

nodePlacement:
 nodeSelector:
   matchLabels:
     kubernetes.io/os: linux
 tolerations:
 - effect: NoSchedule
   operator: Exists

tlsSecurityProfile

tlsSecurityProfile spécifie les paramètres des connexions TLS pour les contrôleurs d'entrée.

Si elle n'est pas définie, la valeur par défaut est basée sur la ressource apiservers.config.openshift.io/cluster.

Lors de l'utilisation des types de profil Old, Intermediate et Modern, la configuration effective du profil est susceptible de changer entre les versions. Par exemple, compte tenu d'une spécification relative à l'utilisation du profil Intermediate déployé dans la version X.Y.Z, une mise à niveau vers la version X.Y.Z 1 peut entraîner l'application d'une nouvelle configuration de profil au contrôleur d'entrée, ce qui se traduit par un déploiement.

La version TLS minimale pour les contrôleurs d'entrée est 1.1, et la version TLS maximale est 1.3.

Note

Les codes et la version TLS minimale du profil de sécurité configuré sont reflétés dans l'état TLSProfile.

Important

L'opérateur d'entrée convertit le TLS 1.0 d'un profil Old ou Custom en 1.1.

clientTLS

clientTLS authentifie l'accès du client au cluster et aux services ; en conséquence, l'authentification mutuelle TLS est activée. S'il n'est pas défini, l'authentification TLS du client n'est pas activée.

clientTLS comporte les sous-zones requises, spec.clientTLS.clientCertificatePolicy et spec.clientTLS.ClientCA.

Le sous-champ ClientCertificatePolicy accepte l'une des deux valeurs suivantes : Required ou Optional. Le sous-champ ClientCA spécifie une carte de configuration qui se trouve dans l'espace de noms openshift-config. La carte de configuration doit contenir un paquet de certificats d'autorité de certification. Le champ AllowedSubjectPatterns est une valeur facultative qui spécifie une liste d'expressions régulières, qui sont comparées au nom distinctif d'un certificat client valide pour filtrer les demandes. Les expressions régulières doivent utiliser la syntaxe PCRE. Au moins un motif doit correspondre au nom distinctif d'un certificat client ; sinon, le contrôleur d'entrée rejette le certificat et refuse la connexion. S'il n'est pas spécifié, le contrôleur d'entrée ne rejette pas les certificats sur la base du nom distinctif.

routeAdmission

routeAdmission définit une politique de traitement des nouvelles demandes d'itinéraires, par exemple en autorisant ou en refusant les demandes entre espaces de noms.

namespaceOwnership décrit comment les demandes de noms d'hôtes dans les espaces de noms doivent être gérées. La valeur par défaut est Strict.

  • Strict: ne permet pas aux routes de revendiquer le même nom d'hôte dans plusieurs espaces de noms.
  • InterNamespaceAllowed: permet aux itinéraires de revendiquer différents chemins pour le même nom d'hôte à travers les espaces de noms.

wildcardPolicy décrit comment les routes avec des politiques de caractères génériques sont gérées par le contrôleur d'entrée.

  • WildcardsAllowed: Indique que les routes avec n'importe quelle politique de caractères génériques sont admises par le contrôleur d'entrée.
  • WildcardsDisallowed: Indique que seules les routes ayant une politique de wildcard de None sont admises par le contrôleur d'entrée. La mise à jour de wildcardPolicy de WildcardsAllowed à WildcardsDisallowed entraîne l'arrêt des itinéraires admis avec une politique de wildcard de Subdomain. Ces itinéraires doivent être recréés avec une politique de wildcard de None pour être réadmis par le contrôleur d'entrée. WildcardsDisallowed est le paramètre par défaut.

IngressControllerLogging

logging définit les paramètres de ce qui est enregistré et à quel endroit. Si ce champ est vide, les journaux opérationnels sont activés mais les journaux d'accès sont désactivés.

  • access décrit comment les demandes des clients sont enregistrées. Si ce champ est vide, l'enregistrement des accès est désactivé.

    • destination décrit une destination pour les messages du journal.

      • type est le type de destination des journaux :

        • Container spécifie que les journaux doivent être envoyés à un conteneur sidecar. L'opérateur d'ingestion configure le conteneur, nommé logs, sur le pod du contrôleur d'ingestion et configure le contrôleur d'ingestion pour qu'il écrive les journaux dans le conteneur. Il est prévu que l'administrateur configure une solution de journalisation personnalisée qui lit les journaux à partir de ce conteneur. L'utilisation de journaux de conteneurs signifie que les journaux peuvent être abandonnés si le taux de journaux dépasse la capacité d'exécution du conteneur ou la capacité de la solution de journalisation personnalisée.
        • Syslog spécifie que les journaux sont envoyés à un point de terminaison Syslog. L'administrateur doit spécifier un point de terminaison capable de recevoir des messages Syslog. L'administrateur est censé avoir configuré une instance Syslog personnalisée.
      • container décrit les paramètres du type de destination de l'enregistrement Container. Actuellement, il n'y a pas de paramètres pour la journalisation des conteneurs, ce champ doit donc être vide.
      • syslog décrit les paramètres du type de destination de la journalisation Syslog:

        • address est l'adresse IP du point de terminaison syslog qui reçoit les messages de journalisation.
        • port est le numéro de port UDP du point de terminaison syslog qui reçoit les messages de journalisation.
        • maxLength est la longueur maximale du message syslog. Elle doit être comprise entre 480 et 4096 octets. Si ce champ est vide, la longueur maximale est fixée à la valeur par défaut de 1024 bytes.
        • facility spécifie l'installation syslog des messages de journalisation. Si ce champ est vide, l'installation est local1. Sinon, il doit spécifier une installation syslog valide : kern user , mail, daemon, auth, syslog, lpr, news, uucp, cron, auth2, ftp, ntp, audit, alert, cron2, local0, local1, local2, local3. local4, local5, local6, ou local7.
    • httpLogFormat spécifie le format du message d'enregistrement pour une requête HTTP. Si ce champ est vide, les messages de journalisation utilisent le format de journalisation HTTP par défaut de l'implémentation. Pour connaître le format de journal HTTP par défaut de HAProxy, voir la documentation de HAProxy.

httpHeaders

httpHeaders définit la politique pour les en-têtes HTTP.

En définissant forwardedHeaderPolicy pour IngressControllerHTTPHeaders, vous spécifiez quand et comment le contrôleur d'entrée définit les en-têtes HTTP Forwarded, X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Proto, et X-Forwarded-Proto-Version.

Par défaut, la politique est définie sur Append.

  • Append spécifie que le contrôleur d'entrée ajoute les en-têtes, en préservant les en-têtes existants.
  • Replace spécifie que le contrôleur d'entrée définit les en-têtes, en supprimant tous les en-têtes existants.
  • IfNone spécifie que le contrôleur d'entrée définit les en-têtes s'ils ne le sont pas déjà.
  • Never spécifie que le contrôleur d'entrée ne définit jamais les en-têtes, préservant ainsi les en-têtes existants.

En définissant headerNameCaseAdjustments, vous pouvez spécifier les corrections de casse qui peuvent être appliquées aux noms d'en-tête HTTP. Chaque correction est spécifiée sous la forme d'un nom d'en-tête HTTP avec la majuscule souhaitée. Par exemple, en spécifiant X-Forwarded-For, vous indiquez que l'en-tête HTTP x-forwarded-for doit être ajusté pour avoir la majuscule spécifiée.

Ces ajustements ne s'appliquent qu'aux itinéraires en clair, terminés par les bords et recryptés, et uniquement lors de l'utilisation du protocole HTTP/1.

Pour les en-têtes de requête, ces ajustements ne sont appliqués qu'aux itinéraires qui ont l'annotation haproxy.router.openshift.io/h1-adjust-case=true. Pour les en-têtes de réponse, ces ajustements sont appliqués à toutes les réponses HTTP. Si ce champ est vide, aucun en-tête de requête n'est ajusté.

httpCompression

httpCompression définit la politique de compression du trafic HTTP.

  • mimeTypes définit une liste de types MIME auxquels la compression doit être appliquée. Par exemple, text/css; charset=utf-8, text/html, text/*, image/svg xml, application/octet-stream, X-custom/customsub, en utilisant le modèle de format type/subtype; [;attribute=value]. Les types sont : application, image, message, multipart, texte, vidéo, ou un type personnalisé précédé de X-; par exemple. Pour voir la notation complète des types et sous-types MIME, voir RFC1341

httpErrorCodePages

httpErrorCodePages spécifie des pages de réponse personnalisées pour le code d'erreur HTTP. Par défaut, un IngressController utilise les pages d'erreur intégrées à l'image IngressController.

httpCaptureCookies

httpCaptureCookies spécifie les cookies HTTP que vous souhaitez capturer dans les journaux d'accès. Si le champ httpCaptureCookies est vide, les journaux d'accès ne capturent pas les cookies.

Pour tout cookie que vous souhaitez capturer, les paramètres suivants doivent figurer dans votre configuration IngressController:

  • name spécifie le nom du cookie.
  • maxLength spécifie la longueur maximale du cookie.
  • matchType spécifie si le champ name du cookie correspond exactement à la configuration du cookie de capture ou s'il s'agit d'un préfixe de la configuration du cookie de capture. Le champ matchType utilise les paramètres Exact et Prefix.

Par exemple :

  httpCaptureCookies:
  - matchType: Exact
    maxLength: 128
    name: MYCOOKIE

httpCaptureHeaders

httpCaptureHeaders spécifie les en-têtes HTTP que vous souhaitez capturer dans les journaux d'accès. Si le champ httpCaptureHeaders est vide, les journaux d'accès ne capturent pas les en-têtes.

httpCaptureHeaders contient deux listes d'en-têtes à capturer dans les journaux d'accès. Les deux listes de champs d'en-tête sont request et response. Dans les deux listes, le champ name doit spécifier le nom de l'en-tête et le champ maxlength doit spécifier la longueur maximale de l'en-tête. Par exemple :

  httpCaptureHeaders:
    request:
    - maxLength: 256
      name: Connection
    - maxLength: 128
      name: User-Agent
    response:
    - maxLength: 256
      name: Content-Type
    - maxLength: 256
      name: Content-Length

tuningOptions

tuningOptions spécifie les options permettant de régler les performances des modules de contrôle d'entrée.

  • clientFinTimeout spécifie la durée pendant laquelle une connexion reste ouverte en attendant la réponse du client à la fermeture de la connexion par le serveur. Le délai par défaut est de 1s.
  • clientTimeout spécifie la durée pendant laquelle une connexion reste ouverte dans l'attente d'une réponse du client. Le délai par défaut est de 30s.
  • headerBufferBytes spécifie la quantité de mémoire réservée, en octets, pour les sessions de connexion du contrôleur d'entrée. Cette valeur doit être au moins égale à 16384 si HTTP/2 est activé pour le contrôleur d'entrée. Si elle n'est pas définie, la valeur par défaut est 32768 bytes. Il n'est pas recommandé de définir ce champ car les valeurs headerBufferBytes trop petites peuvent casser le contrôleur d'entrée, et les valeurs headerBufferBytes trop grandes peuvent amener le contrôleur d'entrée à utiliser beaucoup plus de mémoire que nécessaire.
  • headerBufferMaxRewriteBytes spécifie la quantité de mémoire à réserver, en octets, à partir de headerBufferBytes pour la réécriture et l'ajout d'en-têtes HTTP pour les sessions de connexion du contrôleur d'entrée. La valeur minimale de headerBufferMaxRewriteBytes est 4096. headerBufferBytes doit être supérieur à headerBufferMaxRewriteBytes pour les demandes HTTP entrantes. Si ce champ n'est pas défini, la valeur par défaut est 8192 bytes. Il n'est pas recommandé de définir ce champ, car les valeurs headerBufferMaxRewriteBytes trop petites peuvent interrompre le contrôleur d'ingestion et les valeurs headerBufferMaxRewriteBytes trop grandes peuvent entraîner l'utilisation par le contrôleur d'ingestion d'une quantité de mémoire beaucoup plus importante que nécessaire.
  • healthCheckInterval spécifie la durée d'attente entre les contrôles de santé du routeur. La valeur par défaut est 5s.
  • serverFinTimeout spécifie la durée pendant laquelle une connexion reste ouverte en attendant la réponse du serveur au client qui ferme la connexion. Le délai par défaut est de 1s.
  • serverTimeout spécifie la durée pendant laquelle une connexion reste ouverte dans l'attente d'une réponse du serveur. Le délai par défaut est de 30s.
  • threadCount spécifie le nombre de threads à créer par processus HAProxy. La création d'un plus grand nombre de threads permet à chaque contrôleur d'entrée de traiter davantage de connexions, au prix d'une utilisation accrue des ressources du système. HAProxy prend en charge jusqu'à 64 threads. Si ce champ est vide, le contrôleur d'entrée utilise la valeur par défaut de 4 threads. La valeur par défaut peut changer dans les prochaines versions. La définition de ce champ n'est pas recommandée car l'augmentation du nombre de threads HAProxy permet aux modules du contrôleur d'ingérence d'utiliser davantage de temps d'unité centrale en cas de charge et d'empêcher d'autres modules de recevoir les ressources d'unité centrale dont ils ont besoin pour fonctionner. La réduction du nombre de threads peut nuire aux performances du contrôleur d'ingérence.
  • tlsInspectDelay spécifie la durée pendant laquelle le routeur peut conserver les données pour trouver un itinéraire correspondant. Si cette valeur est trop courte, le routeur peut se rabattre sur le certificat par défaut pour les itinéraires terminés par les bords, recryptés ou traversants, même s'il utilise un certificat mieux adapté. Le délai d'inspection par défaut est de 5s.
  • tunnelTimeout spécifie combien de temps une connexion au tunnel, y compris les websockets, reste ouverte lorsque le tunnel est inactif. Le délai par défaut est de 1h.
  • maxConnections indique le nombre maximal de connexions simultanées pouvant être établies par processus HAProxy. L'augmentation de cette valeur permet à chaque module de contrôleur d'entrée de gérer davantage de connexions au prix de ressources système supplémentaires. Les valeurs autorisées sont 0, -1, toute valeur comprise entre 2000 et 2000000, ou le champ peut être laissé vide.

    • Si ce champ est vide ou a la valeur 0, le contrôleur d'entrée utilisera la valeur par défaut de 50000. Cette valeur est susceptible d'être modifiée dans les versions ultérieures.
    • Si le champ a la valeur -1, HAProxy calculera dynamiquement une valeur maximale basée sur la valeur ulimits disponible dans le conteneur en cours d'exécution. Ce processus aboutit à une valeur calculée élevée qui entraîne une utilisation importante de la mémoire par rapport à la valeur par défaut actuelle de 50000.
    • Si le champ a une valeur supérieure à la limite actuelle du système d'exploitation, le processus HAProxy ne démarrera pas.
    • Si vous choisissez une valeur discrète et que le router pod est migré vers un nouveau nœud, il est possible que le nouveau nœud n'ait pas une configuration ulimit identique. Dans ce cas, le pod ne démarre pas.
    • Si vous avez configuré des nœuds avec différents ulimits et que vous choisissez une valeur discrète, il est recommandé d'utiliser la valeur -1 pour ce champ afin que le nombre maximal de connexions soit calculé au moment de l'exécution.

logEmptyRequests

logEmptyRequests spécifie les connexions pour lesquelles aucune demande n'est reçue et enregistrée. Ces requêtes vides proviennent des sondes de santé de l'équilibreur de charge ou des connexions spéculatives du navigateur web (préconnexion) et l'enregistrement de ces requêtes peut s'avérer indésirable. Cependant, ces demandes peuvent être causées par des erreurs de réseau, auquel cas l'enregistrement des demandes vides peut être utile pour diagnostiquer les erreurs. Ces demandes peuvent être causées par des balayages de ports, et l'enregistrement des demandes vides peut aider à détecter les tentatives d'intrusion. Les valeurs autorisées pour ce champ sont Log et Ignore. La valeur par défaut est Log.

Le type LoggingPolicy accepte l'une des deux valeurs suivantes :

  • Log: La valeur Log indique qu'un événement doit être enregistré.
  • Ignore: La définition de cette valeur à Ignore définit l'option dontlognull dans la configuration de HAproxy.

HTTPEmptyRequestsPolicy

HTTPEmptyRequestsPolicy décrit comment les connexions HTTP sont gérées si la connexion est interrompue avant qu'une demande ne soit reçue. Les valeurs autorisées pour ce champ sont Respond et Ignore. La valeur par défaut est Respond.

Le type HTTPEmptyRequestsPolicy accepte l'une des deux valeurs suivantes :

  • Respond: Si le champ est défini sur Respond, le contrôleur d'entrée envoie une réponse HTTP 400 ou 408, enregistre la connexion si l'enregistrement des accès est activé et comptabilise la connexion dans les paramètres appropriés.
  • Ignore: La définition de cette option sur Ignore ajoute le paramètre http-ignore-probes dans la configuration de HAproxy. Si le champ est défini sur Ignore, le contrôleur d'entrée ferme la connexion sans envoyer de réponse, puis enregistre la connexion ou incrémente les mesures.

Ces connexions proviennent de sondes de santé d'équilibreurs de charge ou de connexions spéculatives de navigateurs web (préconnexion) et peuvent être ignorées sans risque. Cependant, ces demandes peuvent être causées par des erreurs de réseau, de sorte que la définition de ce champ à Ignore peut entraver la détection et le diagnostic des problèmes. Ces demandes peuvent être causées par des balayages de ports, auquel cas l'enregistrement des demandes vides peut aider à détecter les tentatives d'intrusion.

Note

Tous les paramètres sont facultatifs.

7.3.1. Profils de sécurité TLS du contrôleur d'entrée

Les profils de sécurité TLS permettent aux serveurs de déterminer les algorithmes de chiffrement qu'un client peut utiliser lorsqu'il se connecte au serveur.

7.3.1.1. Comprendre les profils de sécurité TLS

Vous pouvez utiliser un profil de sécurité TLS (Transport Layer Security) pour définir les algorithmes TLS requis par les différents composants d'OpenShift Container Platform. Les profils de sécurité TLS d'OpenShift Container Platform sont basés sur les configurations recommandées par Mozilla.

Vous pouvez spécifier l'un des profils de sécurité TLS suivants pour chaque composant :

Tableau 7.1. Profils de sécurité TLS

ProfileDescription

Old

Ce profil est destiné à être utilisé avec des clients ou des bibliothèques anciens. Il est basé sur l'ancienne configuration recommandée pour la rétrocompatibilité.

Le profil Old nécessite une version TLS minimale de 1.0.

Note

Pour le contrôleur d'entrée, la version minimale de TLS passe de 1.0 à 1.1.

Intermediate

Ce profil est la configuration recommandée pour la majorité des clients. Il s'agit du profil de sécurité TLS par défaut pour le contrôleur d'entrée, le kubelet et le plan de contrôle. Le profil est basé sur la configuration recommandée pour la compatibilité intermédiaire.

Le profil Intermediate nécessite une version TLS minimale de 1.2.

Modern

Ce profil est destiné à être utilisé avec des clients modernes qui n'ont pas besoin de rétrocompatibilité. Ce profil est basé sur la configuration recommandée pour la compatibilité moderne.

Le profil Modern nécessite une version TLS minimale de 1.3.

Custom

Ce profil permet de définir la version de TLS et les algorithmes de chiffrement à utiliser.

Avertissement

Soyez prudent lorsque vous utilisez un profil Custom, car des configurations non valides peuvent causer des problèmes.

Note

Lorsque l'on utilise l'un des types de profil prédéfinis, la configuration effective du profil est susceptible d'être modifiée entre les versions. Par exemple, si l'on spécifie l'utilisation du profil intermédiaire déployé dans la version X.Y.Z, une mise à niveau vers la version X.Y.Z 1 peut entraîner l'application d'une nouvelle configuration de profil, ce qui se traduit par un déploiement.

7.3.1.2. Configuration du profil de sécurité TLS pour le contrôleur d'entrée

Pour configurer un profil de sécurité TLS pour un contrôleur d'entrée, modifiez la ressource personnalisée (CR) IngressController afin de spécifier un profil de sécurité TLS prédéfini ou personnalisé. Si aucun profil de sécurité TLS n'est configuré, la valeur par défaut est basée sur le profil de sécurité TLS défini pour le serveur API.

Exemple de CR IngressController qui configure le profil de sécurité TLS Old

apiVersion: operator.openshift.io/v1
kind: IngressController
 ...
spec:
  tlsSecurityProfile:
    old: {}
    type: Old
 ...

Le profil de sécurité TLS définit la version minimale de TLS et les algorithmes de chiffrement TLS pour les connexions TLS des contrôleurs d'entrée.

Les chiffres et la version TLS minimale du profil de sécurité TLS configuré sont indiqués dans la ressource personnalisée (CR) IngressController sous Status.Tls Profile et dans le profil de sécurité TLS configuré sous Spec.Tls Security Profile. Pour le profil de sécurité TLS Custom, les algorithmes de chiffrement spécifiques et la version TLS minimale sont répertoriés sous les deux paramètres.

Note

L'image du contrôleur d'entrée HAProxy prend en charge TLS 1.3 et le profil Modern.

L'opérateur d'entrée convertit également le TLS 1.0 d'un profil Old ou Custom en 1.1.

Conditions préalables

  • Vous avez accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.

Procédure

  1. Modifiez le CR IngressController dans le projet openshift-ingress-operator pour configurer le profil de sécurité TLS :

    $ oc edit IngressController default -n openshift-ingress-operator
  2. Ajouter le champ spec.tlsSecurityProfile:

    Exemple de CR IngressController pour un profil Custom

    apiVersion: operator.openshift.io/v1
    kind: IngressController
     ...
    spec:
      tlsSecurityProfile:
        type: Custom 1
        custom: 2
          ciphers: 3
          - ECDHE-ECDSA-CHACHA20-POLY1305
          - ECDHE-RSA-CHACHA20-POLY1305
          - ECDHE-RSA-AES128-GCM-SHA256
          - ECDHE-ECDSA-AES128-GCM-SHA256
          minTLSVersion: VersionTLS11
     ...

    1
    Spécifiez le type de profil de sécurité TLS (Old, Intermediate, ou Custom). La valeur par défaut est Intermediate.
    2
    Spécifiez le champ approprié pour le type sélectionné :
    • old: {}
    • intermediate: {}
    • custom:
    3
    Pour le type custom, spécifiez une liste de chiffrements TLS et la version TLS minimale acceptée.
  3. Enregistrez le fichier pour appliquer les modifications.

Vérification

  • Vérifiez que le profil est défini dans le CR IngressController:

    $ oc describe IngressController default -n openshift-ingress-operator

    Exemple de sortie

    Name:         default
    Namespace:    openshift-ingress-operator
    Labels:       <none>
    Annotations:  <none>
    API Version:  operator.openshift.io/v1
    Kind:         IngressController
     ...
    Spec:
     ...
      Tls Security Profile:
        Custom:
          Ciphers:
            ECDHE-ECDSA-CHACHA20-POLY1305
            ECDHE-RSA-CHACHA20-POLY1305
            ECDHE-RSA-AES128-GCM-SHA256
            ECDHE-ECDSA-AES128-GCM-SHA256
          Min TLS Version:  VersionTLS11
        Type:               Custom
     ...

7.3.1.3. Configuration de l'authentification mutuelle TLS

Vous pouvez configurer le contrôleur d'entrée pour activer l'authentification mutuelle TLS (mTLS) en définissant une valeur spec.clientTLS. La valeur clientTLS configure le contrôleur d'entrée pour qu'il vérifie les certificats des clients. Cette configuration comprend la définition d'une valeur clientCA, qui est une référence à une carte de configuration. La carte de configuration contient le paquet de certificats CA codé PEM utilisé pour vérifier le certificat d'un client. En option, vous pouvez configurer une liste de filtres de sujet de certificat.

Si la valeur clientCA indique un point de distribution de liste de révocation de certificats (CRL) X509v3, l'opérateur d'entrée télécharge la CRL et configure le contrôleur d'entrée pour qu'il en prenne acte. Les demandes qui ne fournissent pas de certificats valides sont rejetées.

Conditions préalables

  • Vous avez accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.

Procédure

  1. Créer une carte de configuration dans l'espace de noms openshift-config:

    $ oc create configmap router-ca-certs-default --from-file=ca-bundle.pem=client-ca.crt -n openshift-config
    Note

    La clé de données de la carte de configuration doit être ca-bundle.pem, et la valeur des données doit être un certificat d'autorité de certification au format PEM.

  2. Modifiez la ressource IngressController dans le projet openshift-ingress-operator:

    $ oc edit IngressController default -n openshift-ingress-operator
  3. Ajoutez le champ spec.clientTLS et ses sous-champs pour configurer le TLS mutuel :

    Exemple de CR IngressController pour un profil clientTLS qui spécifie des modèles de filtrage

      apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: default
        namespace: openshift-ingress-operator
      spec:
        clientTLS:
          clientCertificatePolicy: Required
          clientCA:
            name: router-ca-certs-default
          allowedSubjectPatterns:
          - "^/CN=example.com/ST=NC/C=US/O=Security/OU=OpenShift$"

7.4. Afficher le contrôleur d'entrée par défaut

L'opérateur d'ingestion est une fonctionnalité essentielle d'OpenShift Container Platform et est activé d'emblée.

Chaque nouvelle installation d'OpenShift Container Platform a un ingresscontroller nommé default. Il peut être complété par des contrôleurs d'ingestion supplémentaires. Si l'adresse ingresscontroller par défaut est supprimée, l'opérateur d'ingestion la recréera automatiquement dans la minute qui suit.

Procédure

  • Affichez le contrôleur d'entrée par défaut :

    $ oc describe --namespace=openshift-ingress-operator ingresscontroller/default

7.5. Visualiser l'état de l'opérateur d'entrée

Vous pouvez visualiser et contrôler l'état de votre opérateur d'entrée.

Procédure

  • Consultez votre statut d'opérateur d'entrée :

    $ oc describe clusteroperators/ingress

7.6. Consulter les journaux du contrôleur d'entrée

Vous pouvez consulter les journaux du contrôleur d'ingérence.

Procédure

  • Consultez les journaux du contrôleur d'ingérence :

    oc logs --namespace=openshift-ingress-operator deployments/ingress-operator -c <container_name>

7.7. Afficher l'état du contrôleur d'entrée

Vous pouvez consulter l'état d'un contrôleur d'entrée particulier.

Procédure

  • Consulter l'état d'un contrôleur d'entrée :

    oc describe --namespace=openshift-ingress-operator ingresscontroller/<name> $ oc describe --namespace=openshift-ingress-operator ingresscontroller/<name>

7.8. Configuration du contrôleur d'entrée

7.8.1. Définition d'un certificat personnalisé par défaut

En tant qu'administrateur, vous pouvez configurer un contrôleur d'entrée pour qu'il utilise un certificat personnalisé en créant une ressource Secret et en modifiant la ressource personnalisée (CR) IngressController.

Conditions préalables

  • Vous devez disposer d'une paire certificat/clé dans des fichiers codés PEM, où le certificat est signé par une autorité de certification de confiance ou par une autorité de certification de confiance privée que vous avez configurée dans une infrastructure de clés publiques (PKI) personnalisée.
  • Votre certificat répond aux exigences suivantes :

    • Le certificat est valable pour le domaine d'entrée.
    • Le certificat utilise l'extension subjectAltName pour spécifier un domaine de remplacement, tel que *.apps.ocp4.example.com.
  • Vous devez avoir un CR IngressController. Vous pouvez utiliser le CR par défaut :

    $ oc --namespace openshift-ingress-operator get ingresscontrollers

    Exemple de sortie

    NAME      AGE
    default   10m

Note

Si vous avez des certificats intermédiaires, ils doivent être inclus dans le fichier tls.crt du secret contenant un certificat par défaut personnalisé. L'ordre est important lors de la spécification d'un certificat ; indiquez votre (vos) certificat(s) intermédiaire(s) après le(s) certificat(s) de serveur.

Procédure

Ce qui suit suppose que le certificat personnalisé et la paire de clés se trouvent dans les fichiers tls.crt et tls.key dans le répertoire de travail actuel. Remplacez les noms de chemin réels par tls.crt et tls.key. Vous pouvez également remplacer custom-certs-default par un autre nom lorsque vous créez la ressource Secret et que vous y faites référence dans le CR IngressController.

Note

Cette action entraînera le redéploiement du contrôleur d'entrée, à l'aide d'une stratégie de déploiement continu.

  1. Créez une ressource Secret contenant le certificat personnalisé dans l'espace de noms openshift-ingress à l'aide des fichiers tls.crt et tls.key.

    $ oc --namespace openshift-ingress create secret tls custom-certs-default --cert=tls.crt --key=tls.key
  2. Mettre à jour la CR du contrôleur d'ingestion pour qu'elle fasse référence au nouveau secret du certificat :

    $ oc patch --type=merge --namespace openshift-ingress-operator ingresscontrollers/default \
      --patch '{"spec":{"defaultCertificate":{"name":"custom-certs-default"}}}'
  3. Vérifier que la mise à jour a été effective :

    $ echo Q |\
      openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts 2>/dev/null |\
      openssl x509 -noout -subject -issuer -enddate

    où :

    <domain>
    Spécifie le nom de domaine de base pour votre cluster.

    Exemple de sortie

    subject=C = US, ST = NC, L = Raleigh, O = RH, OU = OCP4, CN = *.apps.example.com
    issuer=C = US, ST = NC, L = Raleigh, O = RH, OU = OCP4, CN = example.com
    notAfter=May 10 08:32:45 2022 GM

    Astuce

    Vous pouvez également appliquer le code YAML suivant pour définir un certificat par défaut personnalisé :

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: default
      namespace: openshift-ingress-operator
    spec:
      defaultCertificate:
        name: custom-certs-default

    Le nom du secret du certificat doit correspondre à la valeur utilisée pour mettre à jour le CR.

Une fois que le CR du contrôleur d'ingestion a été modifié, l'opérateur d'ingestion met à jour le déploiement du contrôleur d'ingestion afin d'utiliser le certificat personnalisé.

7.8.2. Suppression d'un certificat personnalisé par défaut

En tant qu'administrateur, vous pouvez supprimer un certificat personnalisé pour lequel vous avez configuré un contrôleur d'entrée.

Conditions préalables

  • Vous avez accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.
  • Vous avez installé l'OpenShift CLI (oc).
  • Vous avez précédemment configuré un certificat par défaut personnalisé pour le contrôleur d'entrée.

Procédure

  • Pour supprimer le certificat personnalisé et restaurer le certificat fourni avec OpenShift Container Platform, entrez la commande suivante :

    $ oc patch -n openshift-ingress-operator ingresscontrollers/default \
      --type json -p $'- op: remove\n  path: /spec/defaultCertificate'

    Il peut y avoir un délai pendant que le cluster réconcilie la nouvelle configuration du certificat.

Vérification

  • Pour confirmer que le certificat original du cluster est restauré, entrez la commande suivante :

    $ echo Q | \
      openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts 2>/dev/null | \
      openssl x509 -noout -subject -issuer -enddate

    où :

    <domain>
    Spécifie le nom de domaine de base pour votre cluster.

    Exemple de sortie

    subject=CN = *.apps.<domain>
    issuer=CN = ingress-operator@1620633373
    notAfter=May 10 10:44:36 2023 GMT

7.8.3. Mise à l'échelle automatique d'un contrôleur d'entrée

Mettre automatiquement à l'échelle un contrôleur d'entrée pour répondre dynamiquement aux exigences de performance ou de disponibilité du routage, telles que l'exigence d'augmenter le débit. La procédure suivante fournit un exemple de mise à l'échelle du contrôleur par défaut IngressController.

Important

Le Custom Metrics Autoscaler est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

Conditions préalables

  1. Vous avez installé l'OpenShift CLI (oc).
  2. Vous avez accès à un cluster OpenShift Container Platform en tant qu'utilisateur ayant le rôle cluster-admin.
  3. L'opérateur Custom Metrics Autoscaler est installé.

Procédure

  1. Créez un projet dans l'espace de noms openshift-ingress-operator en exécutant la commande suivante :

    $ oc project openshift-ingress-operator
  2. Activer la surveillance d'OpenShift pour des projets définis par l'utilisateur en créant et en appliquant une carte de configuration :

    1. Créez un nouvel objet ConfigMap, cluster-monitoring-config.yaml:

      cluster-monitoring-config.yaml

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: cluster-monitoring-config
        namespace: openshift-monitoring
      data:
        config.yaml: |
          enableUserWorkload: true 1

      1
      Lorsqu'il est défini sur true, le paramètre enableUserWorkload permet la surveillance de projets définis par l'utilisateur dans un cluster.
    2. Appliquez la carte de configuration en exécutant la commande suivante :

      $ oc apply -f cluster-monitoring-config.yaml
  3. Créez un compte de service pour vous authentifier auprès de Thanos en exécutant la commande suivante :

    $ oc create serviceaccount thanos && oc describe serviceaccount thanos

    Exemple de sortie

    Name:                thanos
    Namespace:           openshift-ingress-operator
    Labels:              <none>
    Annotations:         <none>
    Image pull secrets:  thanos-dockercfg-b4l9s
    Mountable secrets:   thanos-dockercfg-b4l9s
    Tokens:              thanos-token-c422q
    Events:              <none>

  4. Définir un objet TriggerAuthentication dans l'espace de noms openshift-ingress-operator en utilisant le jeton du compte de service.

    1. Définissez la variable secret qui contient le secret en exécutant la commande suivante :

      $ secret=$(oc get secret | grep thanos-token | head -n 1 | awk '{ print $1 }')
    2. Créez l'objet TriggerAuthentication et transmettez la valeur de la variable secret au paramètre TOKEN:

      $ oc process TOKEN="$secret" -f - <<EOF | oc apply -f -
      apiVersion: template.openshift.io/v1
      kind: Template
      parameters:
      - name: TOKEN
      objects:
      - apiVersion: keda.sh/v1alpha1
        kind: TriggerAuthentication
        metadata:
          name: keda-trigger-auth-prometheus
        spec:
          secretTargetRef:
          - parameter: bearerToken
            name: \${TOKEN}
            key: token
          - parameter: ca
            name: \${TOKEN}
            key: ca.crt
      EOF
  5. Créer et appliquer un rôle pour la lecture des métriques de Thanos :

    1. Créez un nouveau rôle, thanos-metrics-reader.yaml, qui lit les métriques des pods et des nœuds :

      thanos-metrics-reader.yaml

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: thanos-metrics-reader
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        - nodes
        verbs:
        - get
      - apiGroups:
        - metrics.k8s.io
        resources:
        - pods
        - nodes
        verbs:
        - get
        - list
        - watch
      - apiGroups:
        - ""
        resources:
        - namespaces
        verbs:
        - get

    2. Appliquez le nouveau rôle en exécutant la commande suivante :

      $ oc apply -f thanos-metrics-reader.yaml
  6. Ajoutez le nouveau rôle au compte de service en entrant les commandes suivantes :

    $ oc adm policy add-role-to-user thanos-metrics-reader -z thanos --role=namespace=openshift-ingress-operator
    $ oc adm policy -n openshift-ingress-operator add-cluster-role-to-user cluster-monitoring-view -z thanos
    Note

    L'argument add-cluster-role-to-user n'est requis que si vous utilisez des requêtes inter-espaces de noms. L'étape suivante utilise une requête de l'espace de noms kube-metrics qui nécessite cet argument.

  7. Créez un nouveau fichier YAML ScaledObject, ingress-autoscaler.yaml, qui cible le déploiement du contrôleur d'ingestion par défaut :

    Exemple ScaledObject définition

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: ingress-scaler
    spec:
      scaleTargetRef: 1
        apiVersion: operator.openshift.io/v1
        kind: IngressController
        name: default
        envSourceContainerName: ingress-operator
      minReplicaCount: 1
      maxReplicaCount: 20 2
      cooldownPeriod: 1
      pollingInterval: 1
      triggers:
      - type: prometheus
        metricType: AverageValue
        metadata:
          serverAddress: https://<example-cluster>:9091 3
          namespace: openshift-ingress-operator 4
          metricName: 'kube-node-role'
          threshold: '1'
          query: 'sum(kube_node_role{role="worker",service="kube-state-metrics"})' 5
          authModes: "bearer"
        authenticationRef:
          name: keda-trigger-auth-prometheus

    1
    La ressource personnalisée que vous ciblez. Dans ce cas, il s'agit du contrôleur Ingress.
    2
    Facultatif : Le nombre maximal de répliques. Si vous omettez ce champ, le maximum par défaut est fixé à 100 répliques.
    3
    L'adresse et le port du cluster.
    4
    L'espace de noms de l'opérateur d'entrée.
    5
    Cette expression correspond au nombre de nœuds de travail présents dans la grappe déployée.
    Important

    Si vous utilisez des requêtes inter-espace, vous devez cibler le port 9091 et non le port 9092 dans le champ serverAddress. Vous devez également disposer de privilèges élevés pour lire les métriques à partir de ce port.

  8. Appliquez la définition de ressource personnalisée en exécutant la commande suivante :

    $ oc apply -f ingress-autoscaler.yaml

Vérification

  • Vérifiez que le contrôleur d'entrée par défaut est mis à l'échelle pour correspondre à la valeur renvoyée par la requête kube-state-metrics en exécutant les commandes suivantes :

    • Utilisez la commande grep pour rechercher des répliques dans le fichier YAML du contrôleur d'entrée :

      $ oc get ingresscontroller/default -o yaml | grep replicas:

      Exemple de sortie

      replicas: 3

    • Obtenir les pods dans le projet openshift-ingress:

      $ oc get pods -n openshift-ingress

      Exemple de sortie

      NAME                             READY   STATUS    RESTARTS   AGE
      router-default-7b5df44ff-l9pmm   2/2     Running   0          17h
      router-default-7b5df44ff-s5sl5   2/2     Running   0          3d22h
      router-default-7b5df44ff-wwsth   2/2     Running   0          66s

7.8.4. Mise à l'échelle d'un contrôleur d'entrée

Mettre à l'échelle manuellement un contrôleur d'entrée pour répondre aux exigences de performance de routage ou de disponibilité telles que l'exigence d'augmenter le débit. Les commandes oc sont utilisées pour mettre à l'échelle la ressource IngressController. La procédure suivante fournit un exemple de mise à l'échelle de la ressource par défaut IngressController.

Note

La mise à l'échelle n'est pas une action immédiate, car il faut du temps pour créer le nombre souhaité de répliques.

Procédure

  1. Affichez le nombre actuel de répliques disponibles pour le site par défaut IngressController:

    $ oc get -n openshift-ingress-operator ingresscontrollers/default -o jsonpath='{$.status.availableReplicas}'

    Exemple de sortie

    2

  2. Adaptez la version par défaut IngressController au nombre de répliques souhaité à l'aide de la commande oc patch. L'exemple suivant met à l'échelle le serveur par défaut IngressController avec 3 réplicas :

    $ oc patch -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"replicas": 3}}' --type=merge

    Exemple de sortie

    ingresscontroller.operator.openshift.io/default patched

  3. Vérifiez que la valeur par défaut de IngressController est adaptée au nombre de répliques que vous avez spécifié :

    $ oc get -n openshift-ingress-operator ingresscontrollers/default -o jsonpath='{$.status.availableReplicas}'

    Exemple de sortie

    3

    Astuce

    Vous pouvez également appliquer le fichier YAML suivant pour adapter un contrôleur d'ingestion à trois répliques :

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: default
      namespace: openshift-ingress-operator
    spec:
      replicas: 3               1
    1
    Si vous avez besoin d'un nombre différent de répliques, modifiez la valeur de replicas.

7.8.5. Configuration de la journalisation des accès d'entrée

Vous pouvez configurer le contrôleur d'entrée pour activer les journaux d'accès. Si vous avez des clusters qui ne reçoivent pas beaucoup de trafic, vous pouvez enregistrer les logs dans un sidecar. Si vous avez des clusters à fort trafic, pour éviter de dépasser la capacité de la pile de journalisation ou pour intégrer une infrastructure de journalisation en dehors d'OpenShift Container Platform, vous pouvez transmettre les journaux à un point d'extrémité syslog personnalisé. Vous pouvez également spécifier le format des journaux d'accès.

La journalisation des conteneurs est utile pour activer les journaux d'accès sur les clusters à faible trafic lorsqu'il n'y a pas d'infrastructure de journalisation Syslog existante, ou pour une utilisation à court terme lors du diagnostic de problèmes avec le contrôleur d'entrée.

Syslog est nécessaire pour les clusters à fort trafic où les logs d'accès pourraient dépasser la capacité de la pile OpenShift Logging, ou pour les environnements où toute solution de logging doit s'intégrer à une infrastructure de logging Syslog existante. Les cas d'utilisation de Syslog peuvent se chevaucher.

Conditions préalables

  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

Configurer l'enregistrement des accès entrants à un sidecar.

  • Pour configurer la journalisation des accès entrants, vous devez spécifier une destination à l'aide de spec.logging.access.destination. Pour spécifier la journalisation vers un conteneur sidecar, vous devez spécifier Container spec.logging.access.destination.type . L'exemple suivant est une définition de contrôleur d'entrée qui enregistre vers une destination Container:

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: default
      namespace: openshift-ingress-operator
    spec:
      replicas: 2
      logging:
        access:
          destination:
            type: Container
  • Lorsque vous configurez le contrôleur d'entrée pour qu'il se connecte à un sidecar, l'opérateur crée un conteneur nommé logs dans le pod du contrôleur d'entrée :

    $ oc -n openshift-ingress logs deployment.apps/router-default -c logs

    Exemple de sortie

    2020-05-11T19:11:50.135710+00:00 router-default-57dfc6cd95-bpmk6 router-default-57dfc6cd95-bpmk6 haproxy[108]: 174.19.21.82:39654 [11/May/2020:19:11:50.133] public be_http:hello-openshift:hello-openshift/pod:hello-openshift:hello-openshift:10.128.2.12:8080 0/0/1/0/1 200 142 - - --NI 1/1/0/0/0 0/0 "GET / HTTP/1.1"

Configurer la journalisation de l'accès à l'entrée vers un point de terminaison Syslog.

  • Pour configurer la journalisation des accès d'entrée, vous devez spécifier une destination à l'aide de spec.logging.access.destination. Pour spécifier la journalisation vers un point de terminaison Syslog, vous devez spécifier Syslog pour spec.logging.access.destination.type. Si le type de destination est Syslog, vous devez également spécifier un point d'extrémité de destination à l'aide de spec.logging.access.destination.syslog.endpoint et vous pouvez spécifier une installation à l'aide de spec.logging.access.destination.syslog.facility. L'exemple suivant est une définition de contrôleur d'entrée qui enregistre vers une destination Syslog:

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: default
      namespace: openshift-ingress-operator
    spec:
      replicas: 2
      logging:
        access:
          destination:
            type: Syslog
            syslog:
              address: 1.2.3.4
              port: 10514
    Note

    Le port de destination de syslog doit être UDP.

Configurer l'enregistrement des accès d'entrée avec un format d'enregistrement spécifique.

  • Vous pouvez spécifier spec.logging.access.httpLogFormat pour personnaliser le format du journal. L'exemple suivant est une définition de contrôleur d'entrée qui enregistre sur un point d'extrémité syslog avec l'adresse IP 1.2.3.4 et le port 10514 :

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: default
      namespace: openshift-ingress-operator
    spec:
      replicas: 2
      logging:
        access:
          destination:
            type: Syslog
            syslog:
              address: 1.2.3.4
              port: 10514
          httpLogFormat: '%ci:%cp [%t] %ft %b/%s %B %bq %HM %HU %HV'

Désactiver la journalisation des accès entrants.

  • Pour désactiver la journalisation des accès entrants, laissez spec.logging ou spec.logging.access vide :

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: default
      namespace: openshift-ingress-operator
    spec:
      replicas: 2
      logging:
        access: null

7.8.6. Réglage du nombre de fils du contrôleur d'ingérence

Un administrateur de cluster peut définir le nombre de threads afin d'augmenter le nombre de connexions entrantes qu'un cluster peut gérer. Vous pouvez corriger un contrôleur d'entrée existant pour augmenter le nombre de threads.

Conditions préalables

  • La procédure suivante suppose que vous avez déjà créé un contrôleur d'entrée.

Procédure

  • Mettre à jour le contrôleur d'entrée pour augmenter le nombre de threads :

    $ oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"threadCount": 8}}}'
    Note

    Si vous disposez d'un nœud capable d'exécuter de grandes quantités de ressources, vous pouvez configurer spec.nodePlacement.nodeSelector avec des étiquettes correspondant à la capacité du nœud prévu et configurer spec.tuningOptions.threadCount avec une valeur élevée appropriée.

7.8.7. Configuration d'un contrôleur d'entrée pour utiliser un équilibreur de charge interne

Lors de la création d'un contrôleur d'ingestion sur des plateformes en nuage, le contrôleur d'ingestion est publié par un équilibreur de charge en nuage public par défaut. En tant qu'administrateur, vous pouvez créer un contrôleur d'entrée qui utilise un équilibreur de charge interne au nuage.

Avertissement

Si votre fournisseur de cloud est Microsoft Azure, vous devez avoir au moins un équilibreur de charge public qui pointe vers vos nœuds. Si ce n'est pas le cas, tous vos nœuds perdront la connectivité de sortie vers l'internet.

Important

Si vous souhaitez modifier le paramètre scope pour une ressource IngressController, vous pouvez modifier le paramètre .spec.endpointPublishingStrategy.loadBalancer.scope après la création de la ressource personnalisée (CR).

Figure 7.1. Diagramme de LoadBalancer

OpenShift Container Platform Ingress LoadBalancerService endpoint publishing strategy

Le graphique précédent illustre les concepts suivants relatifs à la stratégie de publication des points d'extrémité de OpenShift Container Platform Ingress LoadBalancerService :

  • Vous pouvez équilibrer la charge en externe, en utilisant l'équilibreur de charge du fournisseur de cloud, ou en interne, en utilisant l'équilibreur de charge du contrôleur d'ingestion OpenShift.
  • Vous pouvez utiliser l'adresse IP unique de l'équilibreur de charge et des ports plus familiers, tels que 8080 et 4200, comme le montre le cluster illustré dans le graphique.
  • Le trafic provenant de l'équilibreur de charge externe est dirigé vers les pods et géré par l'équilibreur de charge, comme le montre l'instance d'un nœud en panne. Voir la documentation de Kubernetes Services pour plus de détails sur la mise en œuvre.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Créez une ressource personnalisée (CR) IngressController dans un fichier nommé <name>-ingress-controller.yaml, comme dans l'exemple suivant :

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      namespace: openshift-ingress-operator
      name: <name> 1
    spec:
      domain: <domain> 2
      endpointPublishingStrategy:
        type: LoadBalancerService
        loadBalancer:
          scope: Internal 3
    1
    Remplacer <name> par un nom pour l'objet IngressController.
    2
    Spécifiez le site domain pour l'application publiée par le contrôleur.
    3
    Spécifiez une valeur de Internal pour utiliser un équilibreur de charge interne.
  2. Créez le contrôleur d'entrée défini à l'étape précédente en exécutant la commande suivante :

    oc create -f <name>-ingress-controller.yaml 1
    1
    Remplacez <name> par le nom de l'objet IngressController.
  3. Facultatif : Confirmez que le contrôleur d'entrée a été créé en exécutant la commande suivante :

    $ oc --all-namespaces=true get ingresscontrollers

7.8.8. Configuration de l'accès global pour un contrôleur d'entrée sur GCP

Un contrôleur d'entrée créé sur GCP avec un équilibreur de charge interne génère une adresse IP interne pour le service. Un administrateur de cluster peut spécifier l'option d'accès global, qui permet aux clients de n'importe quelle région du même réseau VPC et de la même région de calcul que l'équilibreur de charge, d'atteindre les charges de travail exécutées sur votre cluster.

Pour plus d'informations, voir la documentation GCP pour l'accès global.

Conditions préalables

  • Vous avez déployé un cluster OpenShift Container Platform sur une infrastructure GCP.
  • Vous avez configuré un contrôleur d'entrée pour utiliser un équilibreur de charge interne.
  • You installed the OpenShift CLI (oc).

Procédure

  1. Configurez la ressource Ingress Controller pour autoriser l'accès global.

    Note

    Vous pouvez également créer un contrôleur d'entrée et spécifier l'option d'accès global.

    1. Configurer la ressource Ingress Controller :

      $ oc -n openshift-ingress-operator edit ingresscontroller/default
    2. Modifiez le fichier YAML :

      Sample clientAccess configuration to Global

        spec:
          endpointPublishingStrategy:
            loadBalancer:
              providerParameters:
                gcp:
                  clientAccess: Global 1
                type: GCP
              scope: Internal
            type: LoadBalancerService

      1
      Set gcp.clientAccess to Global.
    3. Enregistrez le fichier pour appliquer les modifications.
  2. Exécutez la commande suivante pour vérifier que le service autorise l'accès global :

    $ oc -n openshift-ingress edit svc/router-default -o yaml

    La sortie montre que l'accès global est activé pour GCP avec l'annotation networking.gke.io/internal-load-balancer-allow-global-access.

7.8.9. Définition de l'intervalle de contrôle de santé du contrôleur d'entrée

L'administrateur d'un cluster peut définir l'intervalle de contrôle de santé afin de déterminer la durée d'attente du routeur entre deux contrôles de santé consécutifs. Cette valeur est appliquée globalement par défaut à toutes les routes. La valeur par défaut est de 5 secondes.

Conditions préalables

  • La procédure suivante suppose que vous avez déjà créé un contrôleur d'entrée.

Procédure

  • Mettre à jour le contrôleur d'entrée afin de modifier l'intervalle entre les contrôles de santé du back-end :

    $ oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"healthCheckInterval": "8s"}}}'
    Note

    Pour remplacer le site healthCheckInterval pour un seul itinéraire, utilisez l'annotation d'itinéraire router.openshift.io/haproxy.health.check.interval

7.8.10. Configurer le contrôleur d'entrée par défaut de votre cluster pour qu'il soit interne

Vous pouvez configurer le contrôleur d'entrée default de votre cluster pour qu'il soit interne en le supprimant et en le recréant.

Avertissement

Si votre fournisseur de cloud est Microsoft Azure, vous devez avoir au moins un équilibreur de charge public qui pointe vers vos nœuds. Si ce n'est pas le cas, tous vos nœuds perdront la connectivité de sortie vers l'internet.

Important

Si vous souhaitez modifier le paramètre scope pour une ressource IngressController, vous pouvez modifier le paramètre .spec.endpointPublishingStrategy.loadBalancer.scope après la création de la ressource personnalisée (CR).

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Configurez le contrôleur d'entrée default de votre cluster pour qu'il soit interne en le supprimant et en le recréant.

    $ oc replace --force --wait --filename - <<EOF
    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      namespace: openshift-ingress-operator
      name: default
    spec:
      endpointPublishingStrategy:
        type: LoadBalancerService
        loadBalancer:
          scope: Internal
    EOF

7.8.11. Configuration de la politique d'admission des routes

Les administrateurs et les développeurs d'applications peuvent exécuter des applications dans plusieurs espaces de noms avec le même nom de domaine. Cela s'adresse aux organisations où plusieurs équipes développent des microservices qui sont exposés sur le même nom d'hôte.

Avertissement

L'autorisation des revendications à travers les espaces de noms ne devrait être activée que pour les clusters avec confiance entre les espaces de noms, sinon un utilisateur malveillant pourrait prendre le contrôle d'un nom d'hôte. Pour cette raison, la politique d'admission par défaut interdit les demandes de noms d'hôtes entre espaces de noms.

Conditions préalables

  • Privilèges d'administrateur de cluster.

Procédure

  • Modifiez le champ .spec.routeAdmission de la variable de ressource ingresscontroller à l'aide de la commande suivante :

    $ oc -n openshift-ingress-operator patch ingresscontroller/default --patch '{"spec":{"routeAdmission":{"namespaceOwnership":"InterNamespaceAllowed"}}}' --type=merge

    Exemple de configuration du contrôleur d'entrée

    spec:
      routeAdmission:
        namespaceOwnership: InterNamespaceAllowed
    ...

    Astuce

    Vous pouvez également appliquer le langage YAML suivant pour configurer la politique d'admission des routes :

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: default
      namespace: openshift-ingress-operator
    spec:
      routeAdmission:
        namespaceOwnership: InterNamespaceAllowed

7.8.12. Utilisation d'itinéraires génériques

Le contrôleur d'entrée HAProxy prend en charge les itinéraires génériques. L'opérateur d'entrée utilise wildcardPolicy pour configurer la variable d'environnement ROUTER_ALLOW_WILDCARD_ROUTES du contrôleur d'entrée.

Le comportement par défaut du contrôleur d'entrée est d'admettre les itinéraires avec une politique de caractères génériques de None, ce qui est rétrocompatible avec les ressources IngressController existantes.

Procédure

  1. Configurer la politique des caractères génériques.

    1. Utilisez la commande suivante pour modifier la ressource IngressController:

      $ oc edit IngressController
    2. Sous spec, définissez le champ wildcardPolicy comme WildcardsDisallowed ou WildcardsAllowed:

      spec:
        routeAdmission:
          wildcardPolicy: WildcardsDisallowed # or WildcardsAllowed

7.8.13. Utilisation des en-têtes X-Forwarded

Vous configurez le contrôleur d'entrée HAProxy pour qu'il spécifie une stratégie de traitement des en-têtes HTTP, y compris Forwarded et X-Forwarded-For. L'opérateur d'entrée utilise le champ HTTPHeaders pour configurer la variable d'environnement ROUTER_SET_FORWARDED_HEADERS du contrôleur d'entrée.

Procédure

  1. Configurez le champ HTTPHeaders pour le contrôleur d'entrée.

    1. Utilisez la commande suivante pour modifier la ressource IngressController:

      $ oc edit IngressController
    2. Sous spec, définissez le champ de politique HTTPHeaders sur Append, Replace, IfNone ou Never:

      apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: default
        namespace: openshift-ingress-operator
      spec:
        httpHeaders:
          forwardedHeaderPolicy: Append
Exemples de cas d'utilisation

As a cluster administrator, you can:

  • Configurez un proxy externe qui injecte l'en-tête X-Forwarded-For dans chaque requête avant de la transmettre à un contrôleur d'entrée.

    Pour configurer le contrôleur d'entrée afin qu'il transmette l'en-tête sans modification, vous devez spécifier la politique never. Le contrôleur d'entrée ne définit alors jamais les en-têtes et les applications ne reçoivent que les en-têtes fournis par le proxy externe.

  • Configurez le contrôleur d'entrée pour qu'il transmette sans modification l'en-tête X-Forwarded-For que votre proxy externe définit sur les requêtes de clusters externes.

    Pour configurer le contrôleur d'entrée afin qu'il définisse l'en-tête X-Forwarded-For sur les requêtes internes du cluster, qui ne passent pas par le proxy externe, spécifiez la stratégie if-none. Si l'en-tête d'une requête HTTP est déjà défini via le proxy externe, le contrôleur d'entrée le conserve. Si l'en-tête est absent parce que la requête n'est pas passée par le proxy, le contrôleur d'entrée ajoute l'en-tête.

As an application developer, you can:

  • Configurer un proxy externe spécifique à l'application qui injecte l'en-tête X-Forwarded-For.

    Pour configurer un contrôleur d'entrée afin qu'il transmette l'en-tête sans modification pour la route d'une application, sans affecter la politique pour les autres routes, ajoutez une annotation haproxy.router.openshift.io/set-forwarded-headers: if-none ou haproxy.router.openshift.io/set-forwarded-headers: never sur la route de l'application.

    Note

    Vous pouvez définir l'annotation haproxy.router.openshift.io/set-forwarded-headers pour chaque itinéraire, indépendamment de la valeur définie globalement pour le contrôleur d'entrée.

7.8.14. Activation de la connectivité HTTP/2 Ingress

Vous pouvez activer la connectivité HTTP/2 transparente de bout en bout dans HAProxy. Cela permet aux propriétaires d'applications d'utiliser les fonctionnalités du protocole HTTP/2, notamment la connexion unique, la compression des en-têtes, les flux binaires, etc.

Vous pouvez activer la connectivité HTTP/2 pour un contrôleur d'entrée individuel ou pour l'ensemble du cluster.

Pour permettre l'utilisation de HTTP/2 pour la connexion du client à HAProxy, un itinéraire doit spécifier un certificat personnalisé. Une route qui utilise le certificat par défaut ne peut pas utiliser HTTP/2. Cette restriction est nécessaire pour éviter les problèmes liés à la coalescence des connexions, lorsque le client réutilise une connexion pour différents itinéraires qui utilisent le même certificat.

La connexion entre HAProxy et le module d'application ne peut utiliser HTTP/2 que pour le recryptage des itinéraires et non pour les itinéraires terminés ou non sécurisés. Cette restriction est due au fait que HAProxy utilise la négociation de protocole au niveau de l'application (ALPN), qui est une extension TLS, pour négocier l'utilisation de HTTP/2 avec le back-end. Il en résulte que le protocole HTTP/2 de bout en bout est possible avec passthrough et re-encrypt, mais pas avec des itinéraires non sécurisés ou terminés par un bord.

Avertissement

L'utilisation de WebSockets avec une route de recryptage et avec HTTP/2 activé sur un contrôleur d'entrée nécessite la prise en charge de WebSocket sur HTTP/2. WebSockets sur HTTP/2 est une fonctionnalité de HAProxy 2.4, qui n'est pas supportée par OpenShift Container Platform pour le moment.

Important

Pour les routes non passantes, le contrôleur d'entrée négocie sa connexion à l'application indépendamment de la connexion du client. Cela signifie qu'un client peut se connecter au contrôleur d'entrée et négocier HTTP/1.1, et que le contrôleur d'entrée peut ensuite se connecter à l'application, négocier HTTP/2, et transmettre la demande de la connexion HTTP/1.1 du client en utilisant la connexion HTTP/2 à l'application. Cela pose un problème si le client tente par la suite de faire passer sa connexion de HTTP/1.1 au protocole WebSocket, car le contrôleur d'entrée ne peut pas transmettre WebSocket à HTTP/2 et ne peut pas faire passer sa connexion HTTP/2 à WebSocket. Par conséquent, si vous avez une application destinée à accepter des connexions WebSocket, elle ne doit pas autoriser la négociation du protocole HTTP/2, sinon les clients ne parviendront pas à passer au protocole WebSocket.

Procédure

Activer HTTP/2 sur un seul contrôleur d'entrée.

  • Pour activer HTTP/2 sur un contrôleur d'entrée, entrez la commande oc annotate:

    oc -n openshift-ingress-operator annotate ingresscontrollers/<ingresscontroller_name> ingress.operator.openshift.io/default-enable-http2=true

    Remplacer <ingresscontroller_name> par le nom du contrôleur d'entrée à annoter.

Activer HTTP/2 sur l'ensemble du cluster.

  • Pour activer HTTP/2 pour l'ensemble du cluster, entrez la commande oc annotate:

    $ oc annotate ingresses.config/cluster ingress.operator.openshift.io/default-enable-http2=true
    Astuce

    Vous pouvez également appliquer le YAML suivant pour ajouter l'annotation :

    apiVersion: config.openshift.io/v1
    kind: Ingress
    metadata:
      name: cluster
      annotations:
        ingress.operator.openshift.io/default-enable-http2: "true"

7.8.15. Configuration du protocole PROXY pour un contrôleur d'entrée

Un administrateur de cluster peut configurer le protocole PROXY lorsqu'un contrôleur d'entrée utilise les types de stratégie de publication des points d'extrémité HostNetwork ou NodePortService. Le protocole PROXY permet à l'équilibreur de charge de conserver les adresses client d'origine pour les connexions que le contrôleur d'entrée reçoit. Les adresses client d'origine sont utiles pour la journalisation, le filtrage et l'injection d'en-têtes HTTP. Dans la configuration par défaut, les connexions que le contrôleur d'entrée reçoit ne contiennent que l'adresse source associée à l'équilibreur de charge.

Cette fonctionnalité n'est pas prise en charge dans les déploiements en nuage. Cette restriction s'explique par le fait que lorsque OpenShift Container Platform fonctionne sur une plateforme cloud et qu'un IngressController spécifie qu'un service d'équilibrage de charge doit être utilisé, l'opérateur d'ingestion configure le service d'équilibrage de charge et active le protocole PROXY en fonction de l'exigence de la plateforme en matière de préservation des adresses source.

Important

Vous devez configurer OpenShift Container Platform et l'équilibreur de charge externe pour qu'ils utilisent le protocole PROXY ou TCP.

Avertissement

Le protocole PROXY n'est pas pris en charge par le contrôleur d'entrée par défaut avec les clusters fournis par l'installateur sur des plates-formes non cloud qui utilisent un VIP d'entrée Keepalived.

Conditions préalables

  • Vous avez créé un contrôleur d'entrée.

Procédure

  1. Modifiez la ressource Ingress Controller :

    $ oc -n openshift-ingress-operator edit ingresscontroller/default
  2. Définir la configuration PROXY :

    • Si votre contrôleur d'entrée utilise le type de stratégie de publication des points d'extrémité hostNetwork, définissez le sous-champ spec.endpointPublishingStrategy.hostNetwork.protocol sur PROXY:

      Exemple de configuration de hostNetwork pour PROXY

        spec:
          endpointPublishingStrategy:
            hostNetwork:
              protocol: PROXY
            type: HostNetwork

    • Si votre contrôleur d'entrée utilise le type de stratégie de publication des points d'extrémité NodePortService, attribuez la valeur PROXY au sous-champ spec.endpointPublishingStrategy.nodePort.protocol:

      Exemple de configuration de nodePort pour PROXY

        spec:
          endpointPublishingStrategy:
            nodePort:
              protocol: PROXY
            type: NodePortService

7.8.16. Spécification d'un domaine de cluster alternatif à l'aide de l'option appsDomain

En tant qu'administrateur de cluster, vous pouvez spécifier une alternative au domaine de cluster par défaut pour les routes créées par l'utilisateur en configurant le champ appsDomain. Le champ appsDomain est un domaine optionnel pour OpenShift Container Platform à utiliser à la place du domaine par défaut, qui est spécifié dans le champ domain. Si vous spécifiez un domaine alternatif, il remplace le domaine de cluster par défaut afin de déterminer l'hôte par défaut pour une nouvelle route.

Par exemple, vous pouvez utiliser le domaine DNS de votre entreprise comme domaine par défaut pour les routes et les entrées des applications fonctionnant sur votre cluster.

Conditions préalables

  • You deployed an OpenShift Container Platform cluster.
  • Vous avez installé l'interface de ligne de commande oc.

Procédure

  1. Configurez le champ appsDomain en spécifiant un autre domaine par défaut pour les itinéraires créés par l'utilisateur.

    1. Modifiez la ressource ingress cluster:

      $ oc edit ingresses.config/cluster -o yaml
    2. Modifiez le fichier YAML :

      Exemple de configuration de appsDomain pour test.example.com

      apiVersion: config.openshift.io/v1
      kind: Ingress
      metadata:
        name: cluster
      spec:
        domain: apps.example.com            1
        appsDomain: <test.example.com>      2

      1
      Spécifie le domaine par défaut. Vous ne pouvez pas modifier le domaine par défaut après l'installation.
      2
      Facultatif : Domaine de l'infrastructure OpenShift Container Platform à utiliser pour les routes d'application. Au lieu du préfixe par défaut, apps, vous pouvez utiliser un autre préfixe comme test.
  2. Vérifiez qu'un itinéraire existant contient le nom de domaine spécifié dans le champ appsDomain en exposant l'itinéraire et en vérifiant le changement de domaine de l'itinéraire :

    Note

    Attendez que le site openshift-apiserver finisse de diffuser les mises à jour avant d'exposer l'itinéraire.

    1. Exposer l'itinéraire :

      $ oc expose service hello-openshift
      route.route.openshift.io/hello-openshift exposed

      Exemple de sortie :

      $ oc get routes
      NAME              HOST/PORT                                   PATH   SERVICES          PORT       TERMINATION   WILDCARD
      hello-openshift   hello_openshift-<my_project>.test.example.com
      hello-openshift   8080-tcp                 None

7.8.17. Conversion des en-têtes HTTP

HAProxy 2.2 met par défaut les noms d'en-tête HTTP en minuscules, par exemple en remplaçant Host: xyz.com par host: xyz.com. Si les applications existantes sont sensibles à la mise en majuscules des noms d'en-tête HTTP, utilisez le champ API spec.httpHeaders.headerNameCaseAdjustments du contrôleur d'entrée pour trouver une solution permettant d'accommoder les applications existantes jusqu'à ce qu'elles soient corrigées.

Important

Comme OpenShift Container Platform inclut HAProxy 2.2, assurez-vous d'ajouter la configuration nécessaire à l'aide de spec.httpHeaders.headerNameCaseAdjustments avant de procéder à la mise à niveau.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous avez accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.

Procédure

En tant qu'administrateur de cluster, vous pouvez convertir le cas de l'en-tête HTTP en entrant la commande oc patch ou en définissant le champ HeaderNameCaseAdjustments dans le fichier YAML du contrôleur d'entrée.

  • Spécifiez un en-tête HTTP à mettre en majuscules en entrant la commande oc patch.

    1. Entrez la commande oc patch pour remplacer l'en-tête HTTP host par Host:

      $ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"httpHeaders":{"headerNameCaseAdjustments":["Host"]}}}'
    2. Annoter l'itinéraire de la demande :

      $ oc annotate routes/my-application haproxy.router.openshift.io/h1-adjust-case=true

      Le contrôleur d'entrée ajuste ensuite l'en-tête de demande host comme spécifié.

  • Spécifiez les ajustements à l'aide du champ HeaderNameCaseAdjustments en configurant le fichier YAML du contrôleur d'entrée.

    1. L'exemple suivant de contrôleur d'entrée YAML ajuste l'en-tête host à Host pour les requêtes HTTP/1 vers des itinéraires correctement annotés :

      Exemple de contrôleur d'entrée YAML

      apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: default
        namespace: openshift-ingress-operator
      spec:
        httpHeaders:
          headerNameCaseAdjustments:
          - Host

    2. L'exemple de route suivant permet d'ajuster les cas de figure des en-têtes de réponse HTTP à l'aide de l'annotation haproxy.router.openshift.io/h1-adjust-case:

      Exemple de route YAML

      apiVersion: route.openshift.io/v1
      kind: Route
      metadata:
        annotations:
          haproxy.router.openshift.io/h1-adjust-case: true 1
        name: my-application
        namespace: my-application
      spec:
        to:
          kind: Service
          name: my-application

      1
      Fixer haproxy.router.openshift.io/h1-adjust-case à true (vrai).

7.8.18. Utilisation de la compression du routeur

Vous configurez le contrôleur d'entrée HAProxy pour spécifier globalement la compression du routeur pour des types MIME spécifiques. Vous pouvez utiliser la variable mimeTypes pour définir les formats des types MIME auxquels la compression est appliquée. Les types sont les suivants : application, image, message, multipart, texte, vidéo ou un type personnalisé précédé de "X-". Pour voir la notation complète des types et sous-types MIME, voir RFC1341.

Note

La mémoire allouée à la compression peut affecter le nombre maximal de connexions. En outre, la compression de tampons volumineux peut entraîner une certaine latence, comme c'est le cas pour les expressions rationnelles lourdes ou les longues listes d'expressions rationnelles.

Tous les types MIME ne bénéficient pas de la compression, mais HAProxy utilise tout de même des ressources pour essayer de les compresser si on le lui demande. En général, les formats de texte, tels que html, css et js, bénéficient de la compression, mais les formats déjà compressés, tels que les images, l'audio et la vidéo, bénéficient peu en échange du temps et des ressources consacrés à la compression.

Procédure

  1. Configurez le champ httpCompression pour le contrôleur d'entrée.

    1. Utilisez la commande suivante pour modifier la ressource IngressController:

      $ oc edit -n openshift-ingress-operator ingresscontrollers/default
    2. Sous spec, définissez le champ de politique httpCompression sur mimeTypes et indiquez une liste de types MIME pour lesquels la compression doit être appliquée :

      apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: default
        namespace: openshift-ingress-operator
      spec:
        httpCompression:
          mimeTypes:
          - "text/html"
          - "text/css; charset=utf-8"
          - "application/json"
         ...

7.8.19. Personnalisation des pages de réponse au code d'erreur de HAProxy

En tant qu'administrateur de cluster, vous pouvez spécifier un code d'erreur personnalisé pour la page de réponse 503, 404 ou les deux pages d'erreur. Le routeur HAProxy sert une page d'erreur 503 lorsque le module d'application ne fonctionne pas ou une page d'erreur 404 lorsque l'URL demandée n'existe pas. Par exemple, si vous personnalisez la page de réponse au code d'erreur 503, la page est servie lorsque le module d'application n'est pas en cours d'exécution et la page de réponse HTTP au code d'erreur 404 par défaut est servie par le routeur HAProxy en cas d'itinéraire incorrect ou inexistant.

Les pages de réponse aux codes d'erreur personnalisés sont spécifiées dans une carte de configuration, puis patchées sur le contrôleur d'entrée. Les clés de la carte de configuration ont deux noms de fichier disponibles : error-page-503.http et error-page-404.http.

Les pages de réponse de code d'erreur HTTP personnalisées doivent respecter les directives de configuration de la page d'erreur HTTP de HAProxy. Voici un exemple de la page de réponse par défaut du code d'erreur http 503 du routeur HAProxy de OpenShift Container Platform. Vous pouvez utiliser le contenu par défaut comme modèle pour créer votre propre page personnalisée.

Par défaut, le routeur HAProxy ne sert qu'une page d'erreur 503 lorsque l'application n'est pas en cours d'exécution ou lorsque la route est incorrecte ou inexistante. Ce comportement par défaut est le même que le comportement sur OpenShift Container Platform 4.8 et antérieur. Si une carte de configuration pour la personnalisation d'une réponse de code d'erreur HTTP n'est pas fournie et que vous utilisez une page de réponse de code d'erreur HTTP personnalisée, le routeur sert une page de réponse de code d'erreur 404 ou 503 par défaut.

Note

Si vous utilisez la page de code d'erreur 503 par défaut d'OpenShift Container Platform comme modèle pour vos personnalisations, les en-têtes du fichier nécessitent un éditeur qui peut utiliser les fins de ligne CRLF.

Procédure

  1. Créez une carte de configuration nommée my-custom-error-code-pages dans l'espace de noms openshift-config:

    $ oc -n openshift-config create configmap my-custom-error-code-pages \
    --from-file=error-page-503.http \
    --from-file=error-page-404.http
    Important

    Si vous ne spécifiez pas le format correct pour la page de réponse du code d'erreur personnalisé, une panne du module de routeur se produit. Pour résoudre cette panne, vous devez supprimer ou corriger la carte de configuration et supprimer les router pods concernés afin qu'ils puissent être recréés avec les informations correctes.

  2. Patch du contrôleur d'entrée pour référencer la carte de configuration my-custom-error-code-pages par son nom :

    $ oc patch -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"httpErrorCodePages":{"name":"my-custom-error-code-pages"}}}' --type=merge

    L'opérateur d'entrée copie la carte de configuration my-custom-error-code-pages de l'espace de noms openshift-config vers l'espace de noms openshift-ingress. L'opérateur nomme la carte de configuration selon le modèle <your_ingresscontroller_name>-errorpages, dans l'espace de noms openshift-ingress.

  3. Afficher la copie :

    $ oc get cm default-errorpages -n openshift-ingress

    Exemple de sortie

    NAME                       DATA   AGE
    default-errorpages         2      25s  1

    1
    L'exemple de nom de carte de configuration est default-errorpages car la ressource personnalisée (CR) du contrôleur d'entrée default a été corrigée.
  4. Confirmez que la carte de configuration contenant la page de réponse d'erreur personnalisée est montée sur le volume du routeur, la clé de la carte de configuration étant le nom du fichier contenant la réponse du code d'erreur HTTP personnalisé :

    • Pour la réponse au code d'erreur personnalisé HTTP 503 :

      oc -n openshift-ingress rsh <router_pod> cat /var/lib/haproxy/conf/error_code_pages/error-page-503.http
    • Pour la réponse au code d'erreur HTTP personnalisé 404 :

      oc -n openshift-ingress rsh <router_pod> cat /var/lib/haproxy/conf/error_code_pages/error-page-404.http

Vérification

Vérifiez votre code d'erreur personnalisé dans la réponse HTTP :

  1. Créez un projet et une application de test :

     $ oc new-project test-ingress
    $ oc new-app django-psql-example
  2. Pour la réponse au code d'erreur http personnalisé 503 :

    1. Arrêter tous les pods pour l'application.
    2. Exécutez la commande curl suivante ou visitez le nom d'hôte de la route dans le navigateur :

      $ curl -vk <route_hostname>
  3. Pour la réponse au code d'erreur http personnalisé 404 :

    1. Visiter un itinéraire inexistant ou un itinéraire incorrect.
    2. Exécutez la commande curl suivante ou visitez le nom d'hôte de la route dans le navigateur :

      $ curl -vk <route_hostname>
  4. Vérifier que l'attribut errorfile figure bien dans le fichier haproxy.config:

    oc -n openshift-ingress rsh <router> cat /var/lib/haproxy/conf/haproxy.config | grep errorfile

7.8.20. Définition du nombre maximum de connexions du contrôleur d'entrée

Un administrateur de cluster peut définir le nombre maximum de connexions simultanées pour les déploiements de routeurs OpenShift. Vous pouvez corriger un contrôleur d'entrée existant pour augmenter le nombre maximum de connexions.

Conditions préalables

  • La procédure suivante suppose que vous avez déjà créé un contrôleur d'entrée

Procédure

  • Mettez à jour le contrôleur d'entrée afin de modifier le nombre maximal de connexions pour HAProxy :

    $ oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"maxConnections": 7500}}}'
    Avertissement

    Si la valeur de spec.tuningOptions.maxConnections est supérieure à la limite actuelle du système d'exploitation, le processus HAProxy ne démarrera pas. Voir le tableau de la section "Paramètres de configuration du contrôleur d'entrée" pour plus d'informations sur ce paramètre.

7.9. Ressources supplémentaires

Chapitre 8. Ingress sharding dans OpenShift Container Platform

Dans OpenShift Container Platform, un Ingress Controller peut servir toutes les routes ou un sous-ensemble de routes. Par défaut, le contrôleur d'ingestion sert toutes les routes créées dans n'importe quel espace de noms du cluster. Vous pouvez ajouter des contrôleurs d'entrée supplémentaires à votre cluster pour optimiser le routage en créant shards, qui sont des sous-ensembles d'itinéraires basés sur des caractéristiques sélectionnées. Pour marquer un itinéraire comme membre d'une grappe, utilisez des étiquettes dans le champ de l'itinéraire ou de l'espace de noms metadata. Le contrôleur d'entrée utilise selectors, également connu sous le nom de selection expression, pour sélectionner un sous-ensemble d'itinéraires à partir de l'ensemble des itinéraires à desservir.

La répartition des entrées est utile lorsque vous souhaitez équilibrer la charge du trafic entrant entre plusieurs contrôleurs d'entrée, lorsque vous souhaitez isoler le trafic à acheminer vers un contrôleur d'entrée spécifique, ou pour toute une série d'autres raisons décrites dans la section suivante.

Par défaut, chaque route utilise le domaine par défaut du cluster. Toutefois, les itinéraires peuvent être configurés pour utiliser le domaine du routeur à la place. Pour plus d'informations, voir Création d'un itinéraire pour le sharding de contrôleur d'entrée.

8.1. Regroupement des contrôleurs d'entrée

Vous pouvez utiliser le partage d'entrée, également connu sous le nom de partage de routeur, pour distribuer un ensemble d'itinéraires sur plusieurs routeurs en ajoutant des étiquettes aux itinéraires, aux espaces de noms ou aux deux. Le contrôleur d'entrée utilise un ensemble correspondant de sélecteurs pour n'admettre que les itinéraires dotés d'une étiquette spécifique. Chaque groupe d'entrée comprend les itinéraires filtrés à l'aide d'une expression de sélection donnée.

En tant que principal mécanisme d'entrée du trafic dans la grappe, le contrôleur d'entrée peut être fortement sollicité. En tant qu'administrateur de la grappe, vous pouvez répartir les routes pour :

  • Équilibrer les contrôleurs d'entrée, ou routeurs, avec plusieurs itinéraires pour accélérer les réponses aux changements.
  • Attribuer à certains itinéraires des garanties de fiabilité différentes de celles des autres itinéraires.
  • Permettre à certains contrôleurs d'entrée de définir des politiques différentes.
  • Ne permettre qu'à des itinéraires spécifiques d'utiliser des fonctionnalités supplémentaires.
  • Exposer des itinéraires différents sur des adresses différentes afin que les utilisateurs internes et externes puissent voir des itinéraires différents, par exemple.
  • Transférer le trafic d'une version d'une application à une autre lors d'un déploiement bleu-vert.

Lorsque les contrôleurs d'entrée sont groupés, une route donnée est admise par zéro ou plusieurs contrôleurs d'entrée du groupe. L'état d'une route indique si un contrôleur d'entrée l'a admise ou non. Un contrôleur d'entrée n'admettra une route que si elle est unique à son groupe.

Un contrôleur d'entrée peut utiliser trois méthodes de répartition :

  • Ajout d'un sélecteur d'espace de noms au contrôleur d'ingestion, de sorte que tous les itinéraires d'un espace de noms dont les étiquettes correspondent au sélecteur d'espace de noms se trouvent dans la grappe d'ingestion.
  • Ajout d'un sélecteur d'itinéraires au contrôleur d'entrée, de sorte que tous les itinéraires dont les étiquettes correspondent au sélecteur d'itinéraires se trouvent dans le groupe d'entrée.
  • Ajout d'un sélecteur d'espace de noms et d'un sélecteur d'itinéraires au contrôleur d'ingestion, de sorte que les itinéraires dont les étiquettes correspondent au sélecteur d'itinéraires dans un espace de noms dont les étiquettes correspondent au sélecteur d'espace de noms se trouvent dans la grappe d'ingestion.

Avec la répartition, vous pouvez distribuer des sous-ensembles d'itinéraires sur plusieurs contrôleurs d'entrée. Ces sous-ensembles peuvent ne pas se chevaucher ( traditional sharding) ou se chevaucher ( overlapped sharding).

8.1.1. Exemple de partage traditionnel

Un contrôleur d'entrée finops-router est configuré avec le sélecteur d'étiquettes spec.namespaceSelector.matchLabels.name réglé sur finance et ops:

Exemple de définition YAML pour finops-router

apiVersion: v1
items:
- apiVersion: operator.openshift.io/v1
  kind: IngressController
  metadata:
    name: finops-router
    namespace: openshift-ingress-operator
  spec:
    namespaceSelector:
      matchLabels:
        name:
          - finance
          - ops

Un deuxième contrôleur d'entrée dev-router est configuré avec le sélecteur d'étiquettes spec.namespaceSelector.matchLabels.name réglé sur dev:

Exemple de définition YAML pour dev-router

apiVersion: v1
items:
- apiVersion: operator.openshift.io/v1
  kind: IngressController
  metadata:
    name: dev-router
    namespace: openshift-ingress-operator
  spec:
    namespaceSelector:
      matchLabels:
        name: dev

Si toutes les routes d'application sont dans des espaces de noms séparés, chacun étiqueté avec name:finance, name:ops, et name:dev respectivement, cette configuration distribue efficacement vos routes entre les deux contrôleurs d'entrée. Les routes de OpenShift Container Platform pour la console, l'authentification et d'autres objectifs ne doivent pas être gérées.

Dans le scénario ci-dessus, la répartition devient un cas particulier de partitionnement, sans que les sous-ensembles ne se chevauchent. Les routes sont réparties entre les routeurs.

Avertissement

Le contrôleur d'entrée default continue à servir toutes les routes à moins que les champs namespaceSelector ou routeSelector ne contiennent des routes à exclure. Consultez cette solution de la base de connaissances de Red Hat et la section "Sharding the default Ingress Controller" pour plus d'informations sur la manière d'exclure les itinéraires du contrôleur d'entrée par défaut.

8.1.2. Exemple de partage superposé

Outre finops-router et dev-router dans l'exemple ci-dessus, vous avez également devops-router, qui est configuré avec le sélecteur d'étiquettes spec.namespaceSelector.matchLabels.name défini sur dev et ops:

Exemple de définition YAML pour devops-router

apiVersion: v1
items:
- apiVersion: operator.openshift.io/v1
  kind: IngressController
  metadata:
    name: devops-router
    namespace: openshift-ingress-operator
  spec:
    namespaceSelector:
      matchLabels:
        name:
          - dev
          - ops

Les routes des espaces de noms intitulés name:dev et name:ops sont maintenant gérées par deux contrôleurs d'entrée différents. Avec cette configuration, les sous-ensembles d'itinéraires se chevauchent.

Le chevauchement de sous-ensembles d'itinéraires permet de créer des règles de routage plus complexes. Par exemple, vous pouvez détourner le trafic hautement prioritaire vers le site dédié finops-router tout en envoyant le trafic moins prioritaire vers devops-router.

8.1.3. Partage du contrôleur d'entrée par défaut

Après la création d'un nouveau shard d'ingestion, il se peut que des routes admises dans votre nouveau shard d'ingestion soient également admises par le contrôleur d'ingestion par défaut. En effet, le contrôleur d'entrée par défaut n'a pas de sélecteurs et admet tous les itinéraires par défaut.

Vous pouvez empêcher un contrôleur d'entrée de desservir des itinéraires avec des étiquettes spécifiques à l'aide de sélecteurs d'espace de noms ou de sélecteurs d'itinéraires. La procédure suivante empêche le contrôleur d'entrée par défaut de desservir les itinéraires finance, ops et dev, nouvellement partagés, à l'aide d'un sélecteur d'espace de noms. Cette procédure permet d'isoler davantage les groupes de serveurs d'entrée.

Important

Vous devez conserver toutes les routes d'administration d'OpenShift Container Platform sur le même Ingress Controller. Par conséquent, évitez d'ajouter des sélecteurs supplémentaires au contrôleur d'ingestion par défaut qui excluent ces routes essentielles.

Conditions préalables

  • You installed the OpenShift CLI (oc).
  • Vous êtes connecté en tant qu'administrateur de projet.

Procédure

  1. Modifiez le contrôleur d'entrée par défaut en exécutant la commande suivante :

    $ oc edit ingresscontroller -n openshift-ingress-operator default
  2. Modifiez le contrôleur d'entrée pour qu'il contienne une adresse namespaceSelector qui exclut les itinéraires portant l'une des étiquettes finance, ops et dev:

    apiVersion: v1
    items:
    - apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: default
        namespace: openshift-ingress-operator
      spec:
      namespaceSelector:
        matchExpressions:
        - key: type
          operator: NotIn
          values:
          - finance
          - ops
          - dev

Le contrôleur d'entrée par défaut ne desservira plus les espaces de noms intitulés name:finance, name:ops, et name:dev.

8.1.4. Sharding d'entrée et DNS

L'administrateur de la grappe est chargé de créer une entrée DNS distincte pour chaque routeur d'un projet. Un routeur ne transmettra pas de routes inconnues à un autre routeur.

Prenons l'exemple suivant :

  • Le routeur A se trouve sur l'hôte 192.168.0.5 et a des routes avec *.foo.com.
  • Le routeur B se trouve sur l'hôte 192.168.1.9 et a des routes avec *.example.com.

Des entrées DNS séparées doivent résoudre *.foo.com en nœud hébergeant le routeur A et *.example.com en nœud hébergeant le routeur B :

  • *.foo.com A IN 192.168.0.5
  • *.example.com A IN 192.168.1.9

8.1.5. Configuration de la répartition des contrôleurs d'entrée à l'aide d'étiquettes d'itinéraires

La répartition du contrôleur d'entrée à l'aide d'étiquettes d'itinéraires signifie que le contrôleur d'entrée dessert n'importe quel itinéraire dans n'importe quel espace de noms sélectionné par le sélecteur d'itinéraires.

Figure 8.1. Répartition des entrées à l'aide d'étiquettes d'itinéraires

A diagram showing multiple Ingress Controllers with different route selectors serving any route containing a label that matches a given route selector regardless of the namespace a route belongs to

La répartition des contrôleurs d'entrée est utile pour équilibrer la charge du trafic entrant entre un ensemble de contrôleurs d'entrée et pour isoler le trafic vers un contrôleur d'entrée spécifique. Par exemple, l'entreprise A s'adresse à un contrôleur d'entrée et l'entreprise B à un autre.

Procédure

  1. Modifiez le fichier router-internal.yaml:

    # cat router-internal.yaml
    apiVersion: v1
    items:
    - apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: sharded
        namespace: openshift-ingress-operator
      spec:
        domain: <apps-sharded.basedomain.example.net> 1
        nodePlacement:
          nodeSelector:
            matchLabels:
              node-role.kubernetes.io/worker: ""
        routeSelector:
          matchLabels:
            type: sharded
      status: {}
    kind: List
    metadata:
      resourceVersion: ""
      selfLink: ""
    1
    Indiquez un domaine à utiliser par le contrôleur d'entrée. Ce domaine doit être différent du domaine par défaut du contrôleur d'entrée.
  2. Appliquer le fichier du contrôleur d'entrée router-internal.yaml:

    # oc apply -f router-internal.yaml

    Le contrôleur d'entrée sélectionne les routes dans n'importe quel espace de noms qui ont l'étiquette type: sharded.

  3. Créez une nouvelle route en utilisant le domaine configuré dans le site router-internal.yaml:

    oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net

8.1.6. Configuration de la répartition des contrôleurs d'entrée à l'aide d'étiquettes d'espace de noms

La répartition du contrôleur d'entrée à l'aide d'étiquettes d'espace de noms signifie que le contrôleur d'entrée dessert n'importe quelle route dans n'importe quel espace de noms sélectionné par le sélecteur d'espace de noms.

Figure 8.2. La mise en commun à l'entrée à l'aide d'étiquettes d'espace de noms

A diagram showing multiple Ingress Controllers with different namespace selectors serving routes that belong to the namespace containing a label that matches a given namespace selector

La répartition des contrôleurs d'entrée est utile pour équilibrer la charge du trafic entrant entre un ensemble de contrôleurs d'entrée et pour isoler le trafic vers un contrôleur d'entrée spécifique. Par exemple, l'entreprise A s'adresse à un contrôleur d'entrée et l'entreprise B à un autre.

Procédure

  1. Modifiez le fichier router-internal.yaml:

    # cat router-internal.yaml

    Exemple de sortie

    apiVersion: v1
    items:
    - apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: sharded
        namespace: openshift-ingress-operator
      spec:
        domain: <apps-sharded.basedomain.example.net> 1
        nodePlacement:
          nodeSelector:
            matchLabels:
              node-role.kubernetes.io/worker: ""
        namespaceSelector:
          matchLabels:
            type: sharded
      status: {}
    kind: List
    metadata:
      resourceVersion: ""
      selfLink: ""

    1
    Indiquez un domaine à utiliser par le contrôleur d'entrée. Ce domaine doit être différent du domaine par défaut du contrôleur d'entrée.
  2. Appliquer le fichier du contrôleur d'entrée router-internal.yaml:

    # oc apply -f router-internal.yaml

    Le contrôleur d'entrée sélectionne les itinéraires dans tout espace de noms sélectionné par le sélecteur d'espace de noms et portant l'étiquette type: sharded.

  3. Créez une nouvelle route en utilisant le domaine configuré dans le site router-internal.yaml:

    oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net

8.2. Création d'une route pour le sharding du contrôleur d'entrée

Une route vous permet d'héberger votre application à une URL. Dans ce cas, le nom d'hôte n'est pas défini et la route utilise un sous-domaine à la place. Lorsque vous spécifiez un sous-domaine, vous utilisez automatiquement le domaine du contrôleur d'entrée qui expose l'itinéraire. Lorsqu'un itinéraire est exposé par plusieurs contrôleurs d'ingestion, l'itinéraire est hébergé sur plusieurs URL.

La procédure suivante décrit comment créer une route pour le sharding du contrôleur d'entrée, en utilisant l'application hello-openshift comme exemple.

La répartition des contrôleurs d'entrée est utile pour équilibrer la charge du trafic entrant entre un ensemble de contrôleurs d'entrée et pour isoler le trafic vers un contrôleur d'entrée spécifique. Par exemple, l'entreprise A s'adresse à un contrôleur d'entrée et l'entreprise B à un autre.

Conditions préalables

  • You installed the OpenShift CLI (oc).
  • Vous êtes connecté en tant qu'administrateur de projet.
  • Vous avez une application web qui expose un port et un point d'extrémité HTTP ou TLS qui écoute le trafic sur le port.
  • Vous avez configuré le contrôleur d'entrée pour le partage.

Procédure

  1. Créez un projet appelé hello-openshift en exécutant la commande suivante :

    $ oc new-project hello-openshift
  2. Créez un pod dans le projet en exécutant la commande suivante :

    $ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.json
  3. Créez un service appelé hello-openshift en exécutant la commande suivante :

    $ oc expose pod/hello-openshift
  4. Créez une définition de route appelée hello-openshift-route.yaml:

    Définition YAML de la route créée pour le sharding :

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      labels:
        type: sharded 1
      name: hello-openshift-edge
      namespace: hello-openshift
    spec:
      subdomain: hello-openshift 2
      tls:
        termination: edge
      to:
        kind: Service
        name: hello-openshift

    1
    La clé d'étiquette et la valeur d'étiquette correspondante doivent toutes deux correspondre à celles spécifiées dans le contrôleur d'entrée. Dans cet exemple, le contrôleur d'entrée a la clé et la valeur d'étiquette type: sharded.
    2
    La route sera exposée en utilisant la valeur du champ subdomain. Lorsque vous spécifiez le champ subdomain, vous devez laisser le nom d'hôte non défini. Si vous spécifiez à la fois les champs host et subdomain, l'itinéraire utilisera la valeur du champ host et ignorera le champ subdomain.
  5. Utilisez hello-openshift-route.yaml pour créer une route vers l'application hello-openshift en exécutant la commande suivante :

    $ oc -n hello-openshift create -f hello-openshift-route.yaml

Vérification

  • Obtenez l'état de la route à l'aide de la commande suivante :

    $ oc -n hello-openshift get routes/hello-openshift-edge -o yaml

    La ressource Route qui en résulte devrait ressembler à ce qui suit :

    Exemple de sortie

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      labels:
        type: sharded
      name: hello-openshift-edge
      namespace: hello-openshift
    spec:
      subdomain: hello-openshift
      tls:
        termination: edge
      to:
        kind: Service
        name: hello-openshift
    status:
      ingress:
      - host: hello-openshift.<apps-sharded.basedomain.example.net> 1
        routerCanonicalHostname: router-sharded.<apps-sharded.basedomain.example.net> 2
        routerName: sharded 3

    1
    Le nom d'hôte que le contrôleur d'entrée, ou le routeur, utilise pour exposer l'itinéraire. La valeur du champ host est automatiquement déterminée par le contrôleur d'entrée et utilise son domaine. Dans cet exemple, le domaine du contrôleur d'entrée est <apps-sharded.basedomain.example.net>.
    2
    Le nom d'hôte du contrôleur d'entrée.
    3
    Le nom du contrôleur d'entrée. Dans cet exemple, le contrôleur d'entrée porte le nom sharded.

Ressources complémentaires

Chapitre 9. Opérateur de pare-feu Ingress Node dans OpenShift Container Platform

L'opérateur de pare-feu du nœud d'entrée permet aux administrateurs de gérer les configurations de pare-feu au niveau du nœud.

9.1. Installation de l'opérateur de pare-feu du nœud d'entrée

En tant qu'administrateur de cluster, vous pouvez installer l'opérateur de pare-feu du nœud d'entrée à l'aide de la CLI d'OpenShift Container Platform ou de la console Web.

9.1.1. Installation de l'opérateur de pare-feu du nœud d'entrée à l'aide de la CLI

En tant qu'administrateur de cluster, vous pouvez installer l'Opérateur à l'aide de la CLI.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous disposez d'un compte avec des privilèges d'administrateur.

Procédure

  1. Pour créer l'espace de noms openshift-ingress-node-firewall, entrez la commande suivante :

    $ cat << EOF| oc create -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        pod-security.kubernetes.io/enforce: privileged
        pod-security.kubernetes.io/enforce-version: v1.24
      name: openshift-ingress-node-firewall
    EOF
  2. Pour créer un CR OperatorGroup, entrez la commande suivante :

    $ cat << EOF| oc create -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: ingress-node-firewall-operators
      namespace: openshift-ingress-node-firewall
    EOF
  3. S'abonner à l'opérateur de pare-feu du nœud d'entrée.

    1. Pour créer un CR Subscription pour l'opérateur de pare-feu du nœud d'entrée, entrez la commande suivante :

      $ cat << EOF| oc create -f -
      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: ingress-node-firewall-sub
        namespace: openshift-ingress-node-firewall
      spec:
        name: ingress-node-firewall
        channel: stable
        source: redhat-operators
        sourceNamespace: openshift-marketplace
      EOF
  4. Pour vérifier que l'opérateur est installé, entrez la commande suivante :

    $ oc get ip -n openshift-ingress-node-firewall

    Exemple de sortie

    NAME            CSV                                         APPROVAL    APPROVED
    install-5cvnz   ingress-node-firewall.4.12.0-202211122336   Automatic   true

  5. Pour vérifier la version de l'opérateur, entrez la commande suivante :

    $ oc get csv -n openshift-ingress-node-firewall

    Exemple de sortie

    NAME                                        DISPLAY                          VERSION               REPLACES                                    PHASE
    ingress-node-firewall.4.12.0-202211122336   Ingress Node Firewall Operator   4.12.0-202211122336   ingress-node-firewall.4.12.0-202211102047   Succeeded

9.1.2. Installation de l'opérateur de pare-feu du nœud d'entrée à l'aide de la console web

En tant qu'administrateur de cluster, vous pouvez installer l'Opérateur à l'aide de la console web.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous disposez d'un compte avec des privilèges d'administrateur.

Procédure

  1. Installer l'opérateur de pare-feu du nœud d'entrée :

    1. Dans la console Web OpenShift Container Platform, cliquez sur OperatorsOperatorHub.
    2. Sélectionnez Ingress Node Firewall Operator dans la liste des opérateurs disponibles, puis cliquez sur Install.
    3. Sur la page Install Operator, sous Installed Namespace, sélectionnez Operator recommended Namespace.
    4. Cliquez sur Install.
  2. Vérifiez que l'opérateur de pare-feu du nœud d'entrée a été installé avec succès :

    1. Naviguez jusqu'à la page OperatorsInstalled Operators.
    2. Assurez-vous que Ingress Node Firewall Operator est listé dans le projet openshift-ingress-node-firewall avec un Status de InstallSucceeded.

      Note

      Pendant l'installation, un opérateur peut afficher un état Failed. Si l'installation réussit par la suite avec un message InstallSucceeded, vous pouvez ignorer le message Failed.

      Si l'Opérateur n'a pas de Status de InstallSucceeded, dépanner en suivant les étapes suivantes :

      • Inspectez les onglets Operator Subscriptions et Install Plans pour vérifier qu'il n'y a pas de défaillances ou d'erreurs sous Status.
      • Naviguez vers la page WorkloadsPods et vérifiez les journaux pour les pods dans le projet openshift-ingress-node-firewall.
      • Vérifiez l'espace de noms du fichier YAML. Si l'annotation est manquante, vous pouvez ajouter l'annotation workload.openshift.io/allowed=management à l'espace de noms de l'opérateur à l'aide de la commande suivante :

        $ oc annotate ns/openshift-ingress-node-firewall workload.openshift.io/allowed=management
        Note

        Pour les clusters OpenShift à nœud unique, l'espace de noms openshift-ingress-node-firewall nécessite l'annotation workload.openshift.io/allowed=management.

9.2. Opérateur du pare-feu du nœud d'entrée

L'opérateur de pare-feu de nœud d'entrée fournit des règles de pare-feu d'entrée au niveau d'un nœud en déployant l'ensemble de démons sur les nœuds que vous spécifiez et gérez dans les configurations de pare-feu. Pour déployer le jeu de démons, vous créez une ressource personnalisée (CR) IngressNodeFirewallConfig. L'opérateur applique la CR IngressNodeFirewallConfig pour créer l'ensemble de démons de pare-feu de nœuds d'entrée daemon, qui s'exécute sur tous les nœuds correspondant à la CR nodeSelector.

Vous configurez rules de la CR IngressNodeFirewall et les appliquez aux clusters en utilisant nodeSelector et en fixant les valeurs à "true".

Important

L'opérateur de pare-feu du nœud d'entrée ne prend en charge que les règles de pare-feu sans état.

Le paramètre des unités de transmission maximale (MTU) est de 4Kb (kilo-octets) dans OpenShift Container Platform 4.12.

Les contrôleurs d'interface réseau (NIC) qui ne prennent pas en charge les pilotes XDP natifs fonctionneront à des performances moindres.

9.3. Déploiement de l'opérateur de pare-feu du nœud d'entrée

Prérequis

  • L'opérateur de pare-feu du nœud d'entrée est installé.

Procédure

Pour déployer l'opérateur de pare-feu du nœud d'entrée, créez une ressource personnalisée IngressNodeFirewallConfig qui déploiera l'ensemble de démons de l'opérateur. Vous pouvez déployer un ou plusieurs CRD IngressNodeFirewall sur des nœuds en appliquant des règles de pare-feu.

  1. Créez le site IngressNodeFirewallConfig à l'intérieur de l'espace de noms openshift-ingress-node-firewall nommé ingressnodefirewallconfig.
  2. Exécutez la commande suivante pour déployer les règles de l'opérateur de pare-feu du nœud d'entrée :

    $ oc apply -f rule.yaml

9.3.1. Objet de configuration du pare-feu du nœud d'entrée

Les champs de l'objet de configuration Ingress Node Firewall sont décrits dans le tableau suivant :

Tableau 9.1. Objet de configuration du pare-feu du nœud d'entrée

FieldTypeDescription

metadata.name

string

Le nom de l'objet CR. Le nom de l'objet règles de pare-feu doit être ingressnodefirewallconfig.

metadata.namespace

string

Espace de noms pour l'objet CR de l'opérateur du pare-feu d'entrée. Le CR IngressNodeFirewallConfig doit être créé dans l'espace de noms openshift-ingress-node-firewall.

spec.nodeSelector

string

Une contrainte de sélection de nœuds utilisée pour cibler les nœuds par le biais d'étiquettes de nœuds spécifiées. Par exemple :

spec:
  nodeSelector:
    node-role.kubernetes.io/worker: ""
Note

L'une des étiquettes utilisées dans nodeSelector doit correspondre à une étiquette sur les nœuds pour que l'ensemble de démons démarre. Par exemple, si les étiquettes de nœuds node-role.kubernetes.io/worker et node-type.kubernetes.io/vm sont appliquées à un nœud, au moins une étiquette doit être définie à l'aide de nodeSelector pour que le jeu de démons démarre.

Note

L'opérateur consomme le CR et crée un ensemble de démons de pare-feu de nœuds d'entrée sur tous les nœuds qui correspondent à nodeSelector.

Exemple de configuration de l'opérateur de pare-feu du nœud d'entrée

L'exemple suivant présente une configuration complète du pare-feu du nœud d'entrée :

Exemple d'objet de configuration du pare-feu du nœud d'entrée

apiVersion: ingressnodefirewall.openshift.io/v1alpha1
kind: IngressNodeFirewallConfig
metadata:
  name: ingressnodefirewallconfig
  namespace: openshift-ingress-node-firewall
spec:
  nodeSelector:
    node-role.kubernetes.io/worker: ""

Note

L'opérateur consomme le CR et crée un ensemble de démons de pare-feu de nœuds d'entrée sur tous les nœuds qui correspondent à nodeSelector.

9.3.2. Objet "règles de pare-feu" du nœud d'entrée

Les champs de l'objet Règles de pare-feu du nœud d'entrée sont décrits dans le tableau suivant :

Tableau 9.2. Objet "règles de pare-feu" du nœud d'entrée

FieldTypeDescription

metadata.name

string

Le nom de l'objet CR.

interfaces

array

Les champs de cet objet spécifient les interfaces auxquelles appliquer les règles de pare-feu. Par exemple, - en0 et - en1.

nodeSelector

array

Vous pouvez utiliser nodeSelector pour sélectionner les nœuds auxquels appliquer les règles de pare-feu. Définissez la valeur de vos étiquettes nodeselector à true pour appliquer la règle.

ingress

object

ingress vous permet de configurer les règles qui autorisent l'accès extérieur aux services de votre cluster.

Configuration de l'objet d'entrée

Les valeurs de l'objet ingress sont définies dans le tableau suivant :

Tableau 9.3. ingress objet

FieldTypeDescription

sourceCIDRs

array

Permet de définir le bloc CIDR. Vous pouvez configurer plusieurs CIDR de différentes familles d'adresses.

Note

Des CIDR différents vous permettent d'utiliser la même règle d'ordre. S'il existe plusieurs objets IngressNodeFirewall pour les mêmes nœuds et interfaces avec des CIDR qui se chevauchent, le champ order indiquera la règle à appliquer en premier. Les règles sont appliquées par ordre croissant.

rules

array

Les objets du pare-feu d'entrée rules.order sont classés en commençant par 1 pour chaque source.CIDR, avec un maximum de 100 règles par CIDR. Les règles d'ordre inférieur sont exécutées en premier.

rules.protocolConfig.protocol prend en charge les protocoles suivants : TCP, UDP, SCTP, ICMP et ICMPv6. Les règles ICMP et ICMPv6 peuvent correspondre à des types ou des codes ICMP et ICMPv6. Les règles TCP, UDP et SCTP peuvent correspondre à un seul port de destination ou à une série de ports au format <start : end-1>.

Définissez rules.action sur allow pour appliquer la règle ou deny pour l'interdire.

Note

Les règles de pare-feu en entrée sont vérifiées à l'aide d'un webhook de vérification qui bloque toute configuration invalide. Le webhook de vérification vous empêche de bloquer les services critiques du cluster tels que le serveur API ou SSH.

Exemple d'objet de règles de pare-feu pour le nœud d'entrée

L'exemple suivant présente une configuration complète du pare-feu du nœud d'entrée :

Exemple de configuration du pare-feu du nœud d'entrée

apiVersion: ingressnodefirewall.openshift.io/v1alpha1
kind: IngressNodeFirewall
metadata:
  name: ingressnodefirewall
spec:
  interfaces:
  - eth0
  nodeSelector:
    matchLabels:
      <do_node_ingress_firewall>: 'true'
  ingress:
  - sourceCIDRs:
       - 172.16.0.0/12
    rules:
    - order: 10
      protocolConfig:
        protocol: ICMP
        icmp:
          icmpType: 8 #ICMP Echo request
      action: Deny
    - order: 20
      protocolConfig:
        protocol: TCP
        tcp:
          ports: "8000-9000"
      action: Deny
  - sourceCIDRs:
       - fc00:f853:ccd:e793::0/64
    rules:
    - order: 10
      protocolConfig:
        protocol: ICMPv6
        icmpv6:
          icmpType: 128 #ICMPV6 Echo request
      action: Deny

Exemple d'objet de règles de pare-feu de nœud d'entrée à confiance zéro

Les règles de pare-feu de nœud d'entrée à confiance zéro peuvent fournir une sécurité supplémentaire aux clusters à interfaces multiples. Par exemple, vous pouvez utiliser des règles de pare-feu de nœud d'entrée à confiance zéro pour supprimer tout le trafic sur une interface spécifique, à l'exception de SSH.

L'exemple suivant présente une configuration complète d'un ensemble de règles de pare-feu de nœud d'entrée à confiance zéro :

Important

Les utilisateurs doivent ajouter tous les ports que leur application utilisera à leur liste d'autorisations dans le cas suivant afin de garantir un fonctionnement correct.

Exemple de règles de pare-feu de nœud d'entrée à confiance zéro

apiVersion: ingressnodefirewall.openshift.io/v1alpha1
kind: IngressNodeFirewall
metadata:
 name: ingressnodefirewall-zero-trust
spec:
 interfaces:
 - eth1 1
 nodeSelector:
   matchLabels:
     <do_node_ingress_firewall>: 'true'
 ingress:
 - sourceCIDRs:
      - 0.0.0.0/0 2
   rules:
   - order: 10
     protocolConfig:
       protocol: TCP
       tcp:
         ports: 22
     action: Allow
   - order: 20
     action: Deny 3

1
Cluster multi-interface
2
0.0.0.0/0 défini pour correspondre à n'importe quel CIDR
3
action fixé à deny

9.4. Affichage des règles de l'opérateur de pare-feu du nœud d'entrée

Procédure

  1. Exécutez la commande suivante pour afficher toutes les règles en vigueur :

    $ oc get ingressnodefirewall
  2. Choisissez l'un des noms de <resource> et exécutez la commande suivante pour afficher les règles ou les configurations :

    $ oc get <resource> <name> -o yaml

9.5. Dépannage de l'opérateur de pare-feu du nœud d'entrée

  • Exécutez la commande suivante pour répertorier les définitions de ressources personnalisées (CRD) installées sur le pare-feu du nœud d'entrée :

    $ oc get crds | grep ingressnodefirewall

    Exemple de sortie

    NAME               READY   UP-TO-DATE   AVAILABLE   AGE
    ingressnodefirewallconfigs.ingressnodefirewall.openshift.io       2022-08-25T10:03:01Z
    ingressnodefirewallnodestates.ingressnodefirewall.openshift.io    2022-08-25T10:03:00Z
    ingressnodefirewalls.ingressnodefirewall.openshift.io             2022-08-25T10:03:00Z

  • Exécutez la commande suivante pour afficher l'état de l'opérateur de pare-feu du nœud d'entrée :

    $ oc get pods -n openshift-ingress-node-firewall

    Exemple de sortie

    NAME                                       READY  STATUS         RESTARTS  AGE
    ingress-node-firewall-controller-manager   2/2    Running        0         5d21h
    ingress-node-firewall-daemon-pqx56         3/3    Running        0         5d21h

    Les champs suivants fournissent des informations sur l'état de l'opérateur : READY, STATUS, AGE, et RESTARTS. Le champ STATUS est Running lorsque l'opérateur de pare-feu du nœud d'entrée déploie un ensemble de démons sur les nœuds attribués.

  • Exécutez la commande suivante pour collecter tous les journaux des nœuds de pare-feu entrants :

    $ oc adm must-gather – gather_ingress_node_firewall

    Les journaux sont disponibles dans le rapport du nœud sos contenant les sorties eBPF bpftool à l'adresse /sos_commands/ebpf. Ces rapports comprennent les tables de consultation utilisées ou mises à jour lorsque le pare-feu d'entrée XDP traite les paquets, met à jour les statistiques et émet des événements.

Chapitre 10. Configuration d'un contrôleur d'entrée pour la gestion manuelle du DNS

En tant qu'administrateur de cluster, lorsque vous créez un contrôleur d'entrée, l'opérateur gère automatiquement les enregistrements DNS. Cela présente certaines limites lorsque la zone DNS requise est différente de la zone DNS du cluster ou lorsque la zone DNS est hébergée en dehors du fournisseur de cloud.

En tant qu'administrateur de cluster, vous pouvez configurer un contrôleur d'entrée pour qu'il arrête la gestion automatique du DNS et démarre la gestion manuelle du DNS. Définissez dnsManagementPolicy pour spécifier quand il doit être géré automatiquement ou manuellement.

Lorsque vous modifiez un contrôleur d'entrée de Managed à Unmanaged, l'opérateur ne nettoie pas l'ancien enregistrement DNS wildcard provisionné sur le nuage. Lorsque vous modifiez un contrôleur d'entrée de Unmanaged à Managed, l'opérateur tente de créer l'enregistrement DNS sur le fournisseur de cloud s'il n'existe pas ou met à jour l'enregistrement DNS s'il existe déjà.

Important

Lorsque vous remplacez dnsManagementPolicy par unmanaged, vous devez gérer manuellement le cycle de vie de l'enregistrement DNS générique sur le fournisseur de services en nuage.

10.1. Managed Politique de gestion du DNS

La politique de gestion DNS de Managed pour les contrôleurs d'entrée garantit que le cycle de vie de l'enregistrement DNS sauvage sur le fournisseur d'informatique en nuage est automatiquement géré par l'opérateur.

10.2. Unmanaged Politique de gestion du DNS

La politique de gestion DNS de Unmanaged pour les contrôleurs d'entrée garantit que le cycle de vie de l'enregistrement DNS wildcard sur le fournisseur de cloud n'est pas géré automatiquement, mais qu'il relève de la responsabilité de l'administrateur du cluster.

Note

Sur la plateforme cloud AWS, si le domaine du contrôleur d'entrée ne correspond pas à dnsConfig.Spec.BaseDomain, la politique de gestion DNS est automatiquement définie sur Unmanaged.

10.3. Création d'un contrôleur d'entrée personnalisé avec la politique de gestion DNS Unmanaged

En tant qu'administrateur de cluster, vous pouvez créer un nouveau contrôleur d'entrée personnalisé avec la politique de gestion DNS Unmanaged.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Créez un fichier de ressources personnalisées (CR) nommé sample-ingress.yaml contenant les éléments suivants :

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      namespace: openshift-ingress-operator
      name: <name> 1
    spec:
      domain: <domain> 2
      endpointPublishingStrategy:
        type: LoadBalancerService
        loadBalancer:
          scope: External 3
          dnsManagementPolicy: Unmanaged 4
    1
    Spécifiez l'objet <name> avec un nom pour l'objet IngressController.
    2
    Spécifiez l'adresse domain en fonction de l'enregistrement DNS qui a été créé en tant que condition préalable.
    3
    Spécifiez l'adresse scope comme External pour exposer l'équilibreur de charge à l'extérieur.
    4
    dnsManagementPolicy indique si le contrôleur d'entrée gère le cycle de vie de l'enregistrement DNS générique associé à l'équilibreur de charge. Les valeurs valides sont Managed et Unmanaged. La valeur par défaut est Managed.
  2. Enregistrez le fichier pour appliquer les modifications.

    oc apply -f <name>.yaml 1

10.4. Modification d'un contrôleur d'entrée existant

En tant qu'administrateur de cluster, vous pouvez modifier un contrôleur d'entrée existant pour gérer manuellement le cycle de vie des enregistrements DNS.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Modifiez le choix de IngressController pour définir dnsManagementPolicy:

    SCOPE=$(oc -n openshift-ingress-operator get ingresscontroller <name> -o=jsonpath="{.status.endpointPublishingStrategy.loadBalancer.scope}")
    
    oc -n openshift-ingress-operator patch ingresscontrollers/<name> --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"dnsManagementPolicy":"Unmanaged", "scope":"${SCOPE}"}}}}'
  2. Facultatif : vous pouvez supprimer l'enregistrement DNS associé dans le fournisseur de cloud.

10.5. Ressources supplémentaires

Chapitre 11. Configuration de la stratégie de publication des points d'extrémité du contrôleur d'entrée

11.1. Stratégie de publication des points d'extrémité du contrôleur d'entrée

NodePortService endpoint publishing strategy

La stratégie de publication des points d'extrémité NodePortService publie le contrôleur d'ingestion à l'aide d'un service NodePort de Kubernetes.

Dans cette configuration, le déploiement du contrôleur d'entrée utilise un réseau de conteneurs. Un site NodePortService est créé pour publier le déploiement. Les ports de nœuds spécifiques sont alloués dynamiquement par OpenShift Container Platform ; toutefois, pour prendre en charge les allocations de ports statiques, les modifications apportées au champ node port du site NodePortService géré sont conservées.

Figure 11.1. Diagramme de NodePortService

OpenShift Container Platform Ingress NodePort endpoint publishing strategy

Le graphique précédent illustre les concepts suivants relatifs à la stratégie de publication des points d'extrémité Ingress NodePort d'OpenShift Container Platform :

  • Tous les nœuds disponibles dans la grappe ont leur propre adresse IP, accessible de l'extérieur. Le service fonctionnant dans la grappe est lié à l'unique NodePort de tous les nœuds.
  • Lorsque le client se connecte à un nœud en panne, par exemple en connectant l'adresse IP 10.0.128.4 dans le graphique, le port du nœud connecte directement le client à un nœud disponible qui exécute le service. Dans ce scénario, aucun équilibrage de charge n'est nécessaire. Comme le montre l'image, l'adresse 10.0.128.4 est hors service et une autre adresse IP doit être utilisée à la place.
Note

L'opérateur d'entrée ignore toute mise à jour des champs .spec.ports[].nodePort du service.

Par défaut, les ports sont attribués automatiquement et vous pouvez accéder aux attributions de ports pour les intégrations. Cependant, il est parfois nécessaire d'allouer des ports statiques pour s'intégrer à l'infrastructure existante, qui peut ne pas être facilement reconfigurée en réponse aux ports dynamiques. Pour réaliser des intégrations avec des ports de nœuds statiques, vous pouvez mettre à jour la ressource de service géré directement.

Pour plus d'informations, consultez la documentation sur les services Kubernetes à l'adresse NodePort.

HostNetwork endpoint publishing strategy

La stratégie de publication des points d'extrémité HostNetwork publie le contrôleur d'entrée sur les ports des nœuds où le contrôleur d'entrée est déployé.

Un contrôleur d'entrée doté de la stratégie de publication de points finaux HostNetwork ne peut avoir qu'une seule réplique de pod par nœud. Si vous voulez des répliques n, vous devez utiliser au moins des nœuds n où ces répliques peuvent être planifiées. Étant donné que chaque réplique de pod demande les ports 80 et 443 sur l'hôte du nœud où elle est planifiée, une réplique ne peut pas être planifiée sur un nœud si un autre pod sur le même nœud utilise ces ports.

11.1.1. Configuration de l'étendue de la publication du contrôleur d'entrée sur Interne

Lorsqu'un administrateur de cluster installe un nouveau cluster sans spécifier qu'il s'agit d'un cluster privé, le contrôleur d'entrée par défaut est créé avec un scope défini sur External. Les administrateurs de clusters peuvent modifier un contrôleur d'entrée à portée External en Internal.

Conditions préalables

  • Vous avez installé le CLI oc.

Procédure

  • Pour modifier un contrôleur d'entrée à portée de External en Internal, entrez la commande suivante :

    $ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'
  • Pour vérifier l'état du contrôleur d'entrée, entrez la commande suivante :

    $ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
    • La condition d'état Progressing indique si vous devez prendre d'autres mesures. Par exemple, la condition d'état peut indiquer que vous devez supprimer le service en entrant la commande suivante :

      $ oc -n openshift-ingress delete services/router-default

      Si vous supprimez le service, l'opérateur d'entrée le recrée en tant que Internal.

11.1.2. Configuration de l'étendue de la publication du point d'extrémité du contrôleur d'entrée sur Externe

Lorsqu'un administrateur de cluster installe un nouveau cluster sans spécifier qu'il s'agit d'un cluster privé, le contrôleur d'entrée par défaut est créé avec une adresse scope définie sur External.

La portée du contrôleur d'entrée peut être configurée pour être Internal pendant l'installation ou après, et les administrateurs de clusters peuvent changer un contrôleur d'entrée Internal en External.

Important

Sur certaines plateformes, il est nécessaire de supprimer et de recréer le service.

La modification de l'étendue peut perturber le trafic Ingress, potentiellement pendant plusieurs minutes. Cela s'applique aux plateformes où il est nécessaire de supprimer et de recréer le service, car la procédure peut amener OpenShift Container Platform à déprovisionner l'équilibreur de charge du service existant, à en provisionner un nouveau et à mettre à jour le DNS.

Conditions préalables

  • Vous avez installé le CLI oc.

Procédure

  • Pour modifier un contrôleur d'entrée à portée de Internal en External, entrez la commande suivante :

    $ oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'
  • Pour vérifier l'état du contrôleur d'entrée, entrez la commande suivante :

    $ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
    • La condition d'état Progressing indique si vous devez prendre d'autres mesures. Par exemple, la condition d'état peut indiquer que vous devez supprimer le service en entrant la commande suivante :

      $ oc -n openshift-ingress delete services/router-default

      Si vous supprimez le service, l'opérateur d'entrée le recrée en tant que External.

11.2. Ressources supplémentaires

Chapitre 12. Vérification de la connectivité à un point d'extrémité

L'opérateur de réseau de cluster (CNO) exécute un contrôleur, le contrôleur de contrôle de connectivité, qui effectue un contrôle de l'état des connexions entre les ressources de votre cluster. En examinant les résultats des contrôles de santé, vous pouvez diagnostiquer les problèmes de connexion ou éliminer la connectivité réseau comme cause d'un problème que vous étudiez.

12.1. Vérification de l'état des connexions

Pour vérifier que les ressources de la grappe sont accessibles, une connexion TCP est établie avec chacun des services API de grappe suivants :

  • Service de serveur API Kubernetes
  • Points d'extrémité du serveur API Kubernetes
  • Service de serveur API OpenShift
  • Points d'extrémité du serveur API OpenShift
  • Équilibreurs de charge

Pour vérifier que les services et les points de terminaison des services sont accessibles sur chaque nœud de la grappe, une connexion TCP est établie avec chacune des cibles suivantes :

  • Service cible de bilan de santé
  • Points finaux cibles du bilan de santé

12.2. Mise en œuvre des bilans de santé des connexions

Le contrôleur de vérification de la connectivité orchestre les vérifications de connexion dans votre cluster. Les résultats des tests de connexion sont stockés dans les objets PodNetworkConnectivity de l'espace de noms openshift-network-diagnostics. Les tests de connexion sont effectués en parallèle toutes les minutes.

L'opérateur de réseau de grappe (CNO) déploie plusieurs ressources dans la grappe pour envoyer et recevoir des contrôles de santé de la connectivité :

Bilan de santé source
Ce programme se déploie dans un seul ensemble de répliques de pods géré par un objet Deployment. Le programme consomme des objets PodNetworkConnectivity et se connecte au site spec.targetEndpoint spécifié dans chaque objet.
Objectif du bilan de santé
Un module déployé dans le cadre d'un ensemble de démons sur chaque nœud du cluster. Ce module est à l'écoute des contrôles de santé entrants. La présence de ce module sur chaque nœud permet de tester la connectivité de chaque nœud.

12.3. Champs de l'objet PodNetworkConnectivityCheck

Les champs de l'objet PodNetworkConnectivityCheck sont décrits dans les tableaux suivants.

Tableau 12.1. Champs de l'objet PodNetworkConnectivityCheck

FieldTypeDescription

metadata.name

string

Le nom de l'objet au format suivant : <source>-to-<target>. La destination décrite par <target> comprend l'une des chaînes suivantes :

  • load-balancer-api-external
  • load-balancer-api-internal
  • kubernetes-apiserver-endpoint
  • kubernetes-apiserver-service-cluster
  • network-check-target
  • openshift-apiserver-endpoint
  • openshift-apiserver-service-cluster

metadata.namespace

string

L'espace de noms auquel l'objet est associé. Cette valeur est toujours openshift-network-diagnostics.

spec.sourcePod

string

Le nom du pod d'où provient le contrôle de connexion, par exemple network-check-source-596b4c6566-rgh92.

spec.targetEndpoint

string

La cible de la vérification de la connexion, telle que api.devcluster.example.com:6443.

spec.tlsClientCert

object

Configuration du certificat TLS à utiliser.

spec.tlsClientCert.name

string

Le nom du certificat TLS utilisé, le cas échéant. La valeur par défaut est une chaîne vide.

status

object

Un objet représentant l'état du test de connexion et les journaux des succès et échecs récents de la connexion.

status.conditions

array

Le dernier état de la vérification de la connexion et tous les états précédents.

status.failures

array

Journaux des tests de connexion pour les tentatives infructueuses.

status.outages

array

Connecter les journaux de tests couvrant les périodes de pannes éventuelles.

status.successes

array

Journaux de tests de connexion pour les tentatives réussies.

Le tableau suivant décrit les champs des objets du tableau status.conditions:

Tableau 12.2. statut.conditions

FieldTypeDescription

lastTransitionTime

string

Moment où l'état de la connexion est passé d'un état à un autre.

message

string

Les détails de la dernière transition dans un format lisible par l'homme.

reason

string

Le dernier état de la transition dans un format lisible par machine.

status

string

L'état de la condition.

type

string

Le type d'affection.

Le tableau suivant décrit les champs des objets du tableau status.conditions:

Tableau 12.3. statut.pannes

FieldTypeDescription

end

string

Date à laquelle l'échec de la connexion a été résolu.

endLogs

array

Entrées du journal de connexion, y compris l'entrée du journal relative à la fin réussie de la panne.

message

string

Un résumé des détails de la panne dans un format lisible par l'homme.

start

string

Date à laquelle l'échec de la connexion a été détecté pour la première fois.

startLogs

array

Entrées du journal de connexion, y compris l'échec initial.

Champs du journal des connexions

Les champs d'une entrée du journal des connexions sont décrits dans le tableau suivant. L'objet est utilisé dans les champs suivants :

  • status.failures[]
  • status.successes[]
  • status.outages[].startLogs[]
  • status.outages[].endLogs[]

Tableau 12.4. Objet du journal des connexions

FieldTypeDescription

latency

string

Enregistre la durée de l'action.

message

string

Fournit l'état dans un format lisible par l'homme.

reason

string

Fournit la raison de l'état dans un format lisible par la machine. La valeur est l'une des suivantes : TCPConnect, TCPConnectError, DNSResolve, DNSError.

success

boolean

Indique si l'entrée du journal est un succès ou un échec.

time

string

Heure de début de la vérification de la connexion.

12.4. Vérification de la connectivité réseau d'un terminal

En tant qu'administrateur de cluster, vous pouvez vérifier la connectivité d'un point d'extrémité, tel qu'un serveur API, un équilibreur de charge, un service ou un pod.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.

Procédure

  1. Pour dresser la liste des objets PodNetworkConnectivityCheck en cours, entrez la commande suivante :

    $ oc get podnetworkconnectivitycheck -n openshift-network-diagnostics

    Exemple de sortie

    NAME                                                                                                                                AGE
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0   75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-1   73m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-2   75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-service-cluster                               75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-default-service-cluster                                 75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-load-balancer-api-external                                         75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-load-balancer-api-internal                                         75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-master-0            75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-master-1            75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-master-2            75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh      74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-worker-c-n8mbf      74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-worker-d-4hnrz      74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-service-cluster                               75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0    75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-1    75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-2    74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-service-cluster                                75m

  2. Consulter les journaux des tests de connexion :

    1. À partir de la sortie de la commande précédente, identifiez le point d'extrémité pour lequel vous souhaitez consulter les journaux de connectivité.
    2. Pour visualiser l'objet, entrez la commande suivante :

      $ oc get podnetworkconnectivitycheck <name> \
        -n openshift-network-diagnostics -o yaml

      <name> indique le nom de l'objet PodNetworkConnectivityCheck.

      Exemple de sortie

      apiVersion: controlplane.operator.openshift.io/v1alpha1
      kind: PodNetworkConnectivityCheck
      metadata:
        name: network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0
        namespace: openshift-network-diagnostics
        ...
      spec:
        sourcePod: network-check-source-7c88f6d9f-hmg2f
        targetEndpoint: 10.0.0.4:6443
        tlsClientCert:
          name: ""
      status:
        conditions:
        - lastTransitionTime: "2021-01-13T20:11:34Z"
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnectSuccess
          status: "True"
          type: Reachable
        failures:
        - latency: 2.241775ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
            to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
            connection refused'
          reason: TCPConnectError
          success: false
          time: "2021-01-13T20:10:34Z"
        - latency: 2.582129ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
            to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
            connection refused'
          reason: TCPConnectError
          success: false
          time: "2021-01-13T20:09:34Z"
        - latency: 3.483578ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
            to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
            connection refused'
          reason: TCPConnectError
          success: false
          time: "2021-01-13T20:08:34Z"
        outages:
        - end: "2021-01-13T20:11:34Z"
          endLogs:
          - latency: 2.032018ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              tcp connection to 10.0.0.4:6443 succeeded'
            reason: TCPConnect
            success: true
            time: "2021-01-13T20:11:34Z"
          - latency: 2.241775ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:10:34Z"
          - latency: 2.582129ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:09:34Z"
          - latency: 3.483578ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:08:34Z"
          message: Connectivity restored after 2m59.999789186s
          start: "2021-01-13T20:08:34Z"
          startLogs:
          - latency: 3.483578ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:08:34Z"
        successes:
        - latency: 2.845865ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:14:34Z"
        - latency: 2.926345ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:13:34Z"
        - latency: 2.895796ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:12:34Z"
        - latency: 2.696844ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:11:34Z"
        - latency: 1.502064ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:10:34Z"
        - latency: 1.388857ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:09:34Z"
        - latency: 1.906383ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:08:34Z"
        - latency: 2.089073ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:07:34Z"
        - latency: 2.156994ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:06:34Z"
        - latency: 1.777043ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:05:34Z"

Chapitre 13. Modification du MTU pour le réseau de la grappe

En tant qu'administrateur de grappe, vous pouvez modifier le MTU du réseau de la grappe après l'installation de la grappe. Ce changement est perturbant car les nœuds du cluster doivent être redémarrés pour finaliser le changement de MTU. Vous ne pouvez modifier le MTU que pour les clusters utilisant les plugins réseau OVN-Kubernetes ou OpenShift SDN.

13.1. À propos du MTU du cluster

Lors de l'installation, l'unité de transmission maximale (MTU) du réseau de la grappe est détectée automatiquement sur la base du MTU de l'interface réseau primaire des nœuds de la grappe. Normalement, il n'est pas nécessaire de remplacer le MTU détecté.

Il est possible que vous souhaitiez modifier le MTU du réseau de la grappe pour plusieurs raisons :

  • Le MTU détecté lors de l'installation du cluster n'est pas correct pour votre infrastructure
  • L'infrastructure de votre cluster nécessite désormais un MTU différent, par exemple suite à l'ajout de nœuds nécessitant un MTU différent pour des performances optimales

Vous pouvez modifier le MTU du cluster uniquement pour les plugins de réseau de cluster OVN-Kubernetes et OpenShift SDN.

13.1.1. Considérations relatives à l'interruption de service

Lorsque vous initiez un changement de MTU sur votre cluster, les effets suivants peuvent avoir un impact sur la disponibilité du service :

  • Au moins deux redémarrages en continu sont nécessaires pour achever la migration vers un nouveau MTU. Pendant cette période, certains nœuds ne sont pas disponibles car ils redémarrent.
  • Les applications spécifiques déployées sur le cluster avec des intervalles de temporisation plus courts que l'intervalle de temporisation TCP absolu peuvent subir des perturbations pendant le changement de MTU.

13.1.2. Sélection de la valeur MTU

Lorsque vous planifiez votre migration MTU, il y a deux valeurs MTU liées mais distinctes à prendre en compte.

  • Hardware MTU: Cette valeur MTU est définie en fonction des spécificités de votre infrastructure réseau.
  • Cluster network MTU: Cette valeur MTU est toujours inférieure à la valeur MTU de votre matériel pour tenir compte de l'overlay du réseau cluster. L'overhead spécifique est déterminé par votre plugin réseau :

    • OVN-Kubernetes: 100 octets
    • OpenShift SDN: 50 octets

Si votre cluster requiert des valeurs MTU différentes pour les différents nœuds, vous devez soustraire la valeur overhead de votre plugin réseau de la valeur MTU la plus basse utilisée par n'importe quel nœud de votre cluster. Par exemple, si certains nœuds de votre grappe ont un MTU de 9001, et d'autres de 1500, vous devez fixer cette valeur à 1400.

13.1.3. Comment fonctionne le processus de migration

Le tableau suivant résume le processus de migration en distinguant les étapes du processus initiées par l'utilisateur et les actions que la migration exécute en réponse.

Tableau 13.1. Migration en direct du MTU du cluster

Étapes initiées par l'utilisateurActivité OpenShift Container Platform

Définissez les valeurs suivantes dans la configuration de l'opérateur de réseau de cluster :

  • spec.migration.mtu.machine.to
  • spec.migration.mtu.network.from
  • spec.migration.mtu.network.to

Cluster Network Operator (CNO): Confirme que chaque champ a une valeur valide.

  • Le site mtu.machine.to doit être défini sur le nouveau MTU du matériel ou sur le MTU actuel du matériel si le MTU du matériel ne change pas. Cette valeur est transitoire et est utilisée dans le cadre du processus de migration. Par ailleurs, si vous spécifiez un MTU matériel différent de votre MTU matériel actuel, vous devez configurer manuellement le MTU pour qu'il persiste par d'autres moyens, tels qu'une configuration de machine, un paramètre DHCP ou une ligne de commande du noyau Linux.
  • Le champ mtu.network.from doit être égal au champ network.status.clusterNetworkMTU, qui est le MTU actuel du réseau cluster.
  • Le champ mtu.network.to doit être défini sur le MTU du réseau du cluster cible et doit être inférieur au MTU matériel pour permettre l'overlay du plugin réseau. Pour OVN-Kubernetes, l'overhead est de 100 bytes et pour OpenShift SDN, l'overhead est de 50 bytes.

Si les valeurs fournies sont valides, le CNO écrit une nouvelle configuration temporaire avec le MTU pour le réseau cluster fixé à la valeur du champ mtu.network.to.

Machine Config Operator (MCO): Effectue un redémarrage progressif de chaque nœud de la grappe.

Reconfigurez le MTU de l'interface réseau principale pour les nœuds de la grappe. Pour ce faire, vous pouvez utiliser différentes méthodes, notamment

  • Déploiement d'un nouveau profil de connexion NetworkManager avec changement de MTU
  • Modification du MTU par le biais d'un serveur DHCP
  • Modification du MTU par les paramètres de démarrage

N/A

Définissez la valeur mtu dans la configuration CNO pour le plugin réseau et définissez spec.migration à null.

Machine Config Operator (MCO): Effectue un redémarrage progressif de chaque nœud du cluster avec la nouvelle configuration MTU.

13.2. Modifier le MTU du cluster

En tant qu'administrateur de cluster, vous pouvez modifier l'unité de transmission maximale (MTU) de votre cluster. La migration est perturbatrice et les nœuds de votre cluster peuvent être temporairement indisponibles pendant la mise à jour du MTU.

La procédure suivante décrit comment modifier le MTU de la grappe en utilisant les configurations de machine, le DHCP ou une ISO. Si vous utilisez l'approche DHCP ou ISO, vous devez vous référer aux artefacts de configuration que vous avez conservés après l'installation de votre cluster pour compléter la procédure.

Conditions préalables

  • You installed the OpenShift CLI (oc).
  • Vous êtes connecté au cluster avec un utilisateur disposant des privilèges cluster-admin.
  • Vous avez identifié le MTU cible pour votre cluster. Le MTU correct varie en fonction du plugin réseau utilisé par votre cluster :

    • OVN-Kubernetes: Le MTU du cluster doit être défini à 100 de moins que la valeur MTU matérielle la plus basse de votre cluster.
    • OpenShift SDN: Le MTU du cluster doit être défini à 50 de moins que la valeur MTU matérielle la plus basse de votre cluster.

Procédure

Pour augmenter ou diminuer le MTU pour le réseau cluster, suivez la procédure suivante.

  1. Pour obtenir le MTU actuel du réseau de la grappe, entrez la commande suivante :

    $ oc describe network.config cluster

    Exemple de sortie

    ...
    Status:
      Cluster Network:
        Cidr:               10.217.0.0/22
        Host Prefix:        23
      Cluster Network MTU:  1400
      Network Type:         OpenShiftSDN
      Service Network:
        10.217.4.0/23
    ...

  2. Préparez votre configuration pour le MTU matériel :

    • Si votre MTU matériel est spécifié avec DHCP, mettez à jour votre configuration DHCP, par exemple avec la configuration dnsmasq suivante :

      dhcp-option-force=26,<mtu>

      où :

      <mtu>
      Spécifie le MTU matériel que le serveur DHCP doit annoncer.
    • Si le MTU de votre matériel est spécifié par une ligne de commande du noyau avec PXE, mettez à jour cette configuration en conséquence.
    • Si votre MTU matériel est spécifié dans une configuration de connexion NetworkManager, effectuez les étapes suivantes. Cette approche est la valeur par défaut d'OpenShift Container Platform si vous ne spécifiez pas explicitement votre configuration réseau avec DHCP, une ligne de commande du noyau ou une autre méthode. Vos nœuds de cluster doivent tous utiliser la même configuration réseau sous-jacente pour que la procédure suivante fonctionne sans modification.

      1. Recherchez l'interface réseau principale :

        • Si vous utilisez le plugin réseau OpenShift SDN, entrez la commande suivante :

          $ oc debug node/<node_name> -- chroot /host ip route list match 0.0.0.0/0 | awk '{print $5 }'

          où :

          <node_name>
          Spécifie le nom d'un nœud dans votre cluster.
        • Si vous utilisez le plugin réseau OVN-Kubernetes, entrez la commande suivante :

          oc debug node/<node_name> -- chroot /host nmcli -g connection.interface-name c show ovs-if-phys0

          où :

          <node_name>
          Spécifie le nom d'un nœud dans votre cluster.
      2. Créez la configuration NetworkManager suivante dans le fichier <interface>-mtu.conf:

        Exemple de configuration de la connexion NetworkManager

        [connection-<interface>-mtu]
        match-device=interface-name:<interface>
        ethernet.mtu=<mtu>

        où :

        <mtu>
        Spécifie la nouvelle valeur du MTU matériel.
        <interface>
        Spécifie le nom de l'interface réseau primaire.
      3. Créez deux objets MachineConfig, l'un pour les nœuds du plan de contrôle et l'autre pour les nœuds de travail de votre cluster :

        1. Créez la configuration Butane suivante dans le fichier control-plane-interface.bu:

          variant: openshift
          version: 4.12.0
          metadata:
            name: 01-control-plane-interface
            labels:
              machineconfiguration.openshift.io/role: master
          storage:
            files:
              - path: /etc/NetworkManager/conf.d/99-<interface>-mtu.conf 1
                contents:
                  local: <interface>-mtu.conf 2
                mode: 0600
          1 1
          Spécifiez le nom de la connexion NetworkManager pour l'interface réseau primaire.
          2
          Spécifiez le nom de fichier local pour le fichier de configuration NetworkManager mis à jour à l'étape précédente.
        2. Créez la configuration Butane suivante dans le fichier worker-interface.bu:

          variant: openshift
          version: 4.12.0
          metadata:
            name: 01-worker-interface
            labels:
              machineconfiguration.openshift.io/role: worker
          storage:
            files:
              - path: /etc/NetworkManager/conf.d/99-<interface>-mtu.conf 1
                contents:
                  local: <interface>-mtu.conf 2
                mode: 0600
          1
          Spécifiez le nom de la connexion NetworkManager pour l'interface réseau primaire.
          2
          Spécifiez le nom de fichier local pour le fichier de configuration NetworkManager mis à jour à l'étape précédente.
        3. Créez des objets MachineConfig à partir des configurations Butane en exécutant la commande suivante :

          $ for manifest in control-plane-interface worker-interface; do
              butane --files-dir . $manifest.bu > $manifest.yaml
            done
  3. Pour commencer la migration du MTU, spécifiez la configuration de la migration en entrant la commande suivante. L'opérateur Machine Config effectue un redémarrage progressif des nœuds de la grappe pour préparer le changement de MTU.

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": <overlay_from>, "to": <overlay_to> } , "machine": { "to" : <machine_to> } } } } }'

    où :

    <overlay_from>
    Spécifie la valeur actuelle du MTU du réseau cluster.
    <overlay_to>
    Spécifie le MTU cible pour le réseau du cluster. Cette valeur est définie par rapport à la valeur de <machine_to> et pour OVN-Kubernetes doit être 100 moins et pour OpenShift SDN doit être 50 moins.
    <machine_to>
    Spécifie le MTU pour l'interface réseau primaire sur le réseau hôte sous-jacent.

    Exemple d'augmentation du MTU du cluster

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": 1400, "to": 9000 } , "machine": { "to" : 9100} } } } }'

  4. Lorsque le MCO met à jour les machines de chaque pool de configuration, il redémarre chaque nœud un par un. Vous devez attendre que tous les nœuds soient mis à jour. Vérifiez l'état du pool de configuration des machines en entrant la commande suivante :

    $ oc get mcp

    Un nœud mis à jour avec succès a le statut suivant : UPDATED=true, UPDATING=false, DEGRADED=false.

    Note

    Par défaut, le MCO met à jour une machine par pool à la fois, ce qui fait que la durée totale de la migration augmente avec la taille du cluster.

  5. Confirmer l'état de la configuration de la nouvelle machine sur les hôtes :

    1. Pour répertorier l'état de la configuration de la machine et le nom de la configuration de la machine appliquée, entrez la commande suivante :

      $ oc describe node | egrep "hostname|machineconfig"

      Exemple de sortie

      kubernetes.io/hostname=master-0
      machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/reason:
      machineconfiguration.openshift.io/state: Done

      Vérifiez que les affirmations suivantes sont vraies :

      • La valeur du champ machineconfiguration.openshift.io/state est Done.
      • La valeur du champ machineconfiguration.openshift.io/currentConfig est égale à la valeur du champ machineconfiguration.openshift.io/desiredConfig.
    2. Pour confirmer que la configuration de la machine est correcte, entrez la commande suivante :

      oc get machineconfig <config_name> -o yaml | grep ExecStart

      <config_name> est le nom de la machine configurée dans le champ machineconfiguration.openshift.io/currentConfig.

      La configuration de la machine doit inclure la mise à jour suivante de la configuration de systemd :

      ExecStart=/usr/local/bin/mtu-migration.sh
  6. Mettre à jour la valeur MTU de l'interface réseau sous-jacente :

    • Si vous spécifiez le nouveau MTU avec une configuration de connexion NetworkManager, entrez la commande suivante. L'opérateur MachineConfig effectue automatiquement un redémarrage des nœuds de votre cluster.

      $ for manifest in control-plane-interface worker-interface; do
          oc create -f $manifest.yaml
        done
    • Si vous spécifiez le nouveau MTU avec une option de serveur DHCP ou une ligne de commande du noyau et PXE, apportez les modifications nécessaires à votre infrastructure.
  7. Lorsque le MCO met à jour les machines de chaque pool de configuration, il redémarre chaque nœud un par un. Vous devez attendre que tous les nœuds soient mis à jour. Vérifiez l'état du pool de configuration des machines en entrant la commande suivante :

    $ oc get mcp

    Un nœud mis à jour avec succès a le statut suivant : UPDATED=true, UPDATING=false, DEGRADED=false.

    Note

    Par défaut, le MCO met à jour une machine par pool à la fois, ce qui fait que la durée totale de la migration augmente avec la taille du cluster.

  8. Confirmer l'état de la configuration de la nouvelle machine sur les hôtes :

    1. Pour répertorier l'état de la configuration de la machine et le nom de la configuration de la machine appliquée, entrez la commande suivante :

      $ oc describe node | egrep "hostname|machineconfig"

      Exemple de sortie

      kubernetes.io/hostname=master-0
      machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/reason:
      machineconfiguration.openshift.io/state: Done

      Vérifiez que les affirmations suivantes sont vraies :

      • La valeur du champ machineconfiguration.openshift.io/state est Done.
      • La valeur du champ machineconfiguration.openshift.io/currentConfig est égale à la valeur du champ machineconfiguration.openshift.io/desiredConfig.
    2. Pour confirmer que la configuration de la machine est correcte, entrez la commande suivante :

      oc get machineconfig <config_name> -o yaml | grep path :

      <config_name> est le nom de la machine configurée dans le champ machineconfiguration.openshift.io/currentConfig.

      Si la configuration de la machine est déployée avec succès, la sortie précédente contient le chemin d'accès au fichier /etc/NetworkManager/system-connections/<connection_name>.

      La configuration de la machine ne doit pas contenir la ligne ExecStart=/usr/local/bin/mtu-migration.sh.

  9. Pour finaliser la migration du MTU, entrez l'une des commandes suivantes :

    • Si vous utilisez le plugin réseau OVN-Kubernetes :

      $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
        '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'

      où :

      <mtu>
      Spécifie le nouveau MTU du réseau cluster que vous avez spécifié avec <overlay_to>.
    • Si vous utilisez le plugin réseau OpenShift SDN :

      $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
        '{"spec": { "migration": null, "defaultNetwork":{ "openshiftSDNConfig": { "mtu": <mtu> }}}}'

      où :

      <mtu>
      Spécifie le nouveau MTU du réseau cluster que vous avez spécifié avec <overlay_to>.

Vérification

Vous pouvez vérifier qu'un nœud de votre cluster utilise un MTU que vous avez spécifié dans la procédure précédente.

  1. Pour obtenir le MTU actuel du réseau de la grappe, entrez la commande suivante :

    $ oc describe network.config cluster
  2. Obtenir le MTU actuel de l'interface réseau principale d'un nœud.

    1. Pour dresser la liste des nœuds de votre cluster, entrez la commande suivante :

      $ oc get nodes
    2. Pour obtenir le paramètre MTU actuel de l'interface réseau principale d'un nœud, entrez la commande suivante :

      $ oc debug node/<node> -- chroot /host ip address show <interface>

      où :

      <node>
      Spécifie un nœud à partir de la sortie de l'étape précédente.
      <interface>
      Spécifie le nom de l'interface réseau primaire pour le nœud.

      Exemple de sortie

      ens3 : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8051

13.3. Ressources supplémentaires

Chapitre 14. Configuration de la plage de service du port de nœud

En tant qu'administrateur de grappe, vous pouvez étendre la plage de ports de nœuds disponibles. Si votre grappe utilise un grand nombre de ports de nœuds, vous devrez peut-être augmenter le nombre de ports disponibles.

La plage de ports par défaut est 30000-32767. Vous ne pouvez jamais réduire la plage de ports, même si vous l'étendez d'abord au-delà de la plage par défaut.

14.1. Conditions préalables

  • Votre infrastructure de cluster doit autoriser l'accès aux ports que vous spécifiez dans la plage étendue. Par exemple, si vous étendez la plage de ports du nœud à 30000-32900, la plage de ports inclusive de 32768-32900 doit être autorisée par votre pare-feu ou votre configuration de filtrage de paquets.

14.2. Extension de la plage de ports du nœud

Vous pouvez étendre la plage de ports du nœud pour le cluster.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous au cluster avec un utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Pour étendre la plage de ports du nœud, entrez la commande suivante. Remplacez <port> par le plus grand numéro de port de la nouvelle plage.

    $ oc patch network.config.openshift.io cluster --type=merge -p \
      '{
        "spec":
          { "serviceNodePortRange": "30000-<port>" }
      }'
    Astuce

    Vous pouvez également appliquer le fichier YAML suivant pour mettre à jour la plage de ports du nœud :

    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      serviceNodePortRange: "30000-<port>"

    Exemple de sortie

    network.config.openshift.io/cluster patched

  2. Pour confirmer que la configuration est active, entrez la commande suivante. L'application de la mise à jour peut prendre plusieurs minutes.

    $ oc get configmaps -n openshift-kube-apiserver config \
      -o jsonpath="{.data['config\.yaml']}" | \
      grep -Eo '"service-node-port-range":["[[:digit:]]+-[[:digit:]]+"]'

    Exemple de sortie

    "service-node-port-range":["30000-33000"]

14.3. Ressources supplémentaires

Chapitre 15. Configuration du basculement IP

Cette rubrique décrit la configuration du basculement IP pour les pods et les services sur votre cluster OpenShift Container Platform.

Le basculement IP gère un pool d'adresses IP virtuelles (VIP) sur un ensemble de nœuds. Chaque adresse VIP de l'ensemble est desservie par un nœud sélectionné dans l'ensemble. Tant qu'un seul nœud est disponible, les VIP sont desservis. Il n'existe aucun moyen de répartir explicitement les adresses VIP entre les nœuds, de sorte qu'il peut y avoir des nœuds sans adresses VIP et d'autres nœuds avec de nombreuses adresses VIP. S'il n'y a qu'un seul nœud, tous les VIP s'y trouvent.

Note

Les VIP doivent être routables depuis l'extérieur du cluster.

Le basculement IP surveille un port sur chaque VIP afin de déterminer si le port est accessible sur le nœud. Si le port n'est pas accessible, le VIP n'est pas affecté au nœud. Si le port est défini sur 0, cette vérification est supprimée. Le script de contrôle effectue les tests nécessaires.

Le basculement IP utilise Keepalived pour héberger un ensemble d'adresses VIP accessibles de l'extérieur sur un ensemble d'hôtes. Chaque VIP n'est desservi que par un seul hôte à la fois. Keepalived utilise le protocole VRRP (Virtual Router Redundancy Protocol) pour déterminer quel hôte, parmi l'ensemble des hôtes, dessert quel VIP. Si un hôte devient indisponible, ou si le service que Keepalived surveille ne répond pas, le VIP est basculé sur un autre hôte de l'ensemble. Cela signifie qu'un VIP est toujours servi tant qu'un hôte est disponible.

Lorsqu'un nœud exécutant Keepalived passe le script de contrôle, le VIP sur ce nœud peut entrer dans l'état master en fonction de sa priorité et de la priorité du maître actuel et selon la stratégie de préemption.

Un administrateur de cluster peut fournir un script via la variable OPENSHIFT_HA_NOTIFY_SCRIPT, et ce script est appelé chaque fois que l'état du VIP sur le nœud change. Keepalived utilise l'état master lorsqu'il gère le VIP, l'état backup lorsqu'un autre noeud gère le VIP, ou l'état fault lorsque le script de vérification échoue. Le script de notification est appelé avec le nouvel état à chaque fois que l'état change.

Vous pouvez créer une configuration de déploiement de basculement IP sur OpenShift Container Platform. La configuration de déploiement de basculement IP spécifie l'ensemble des adresses VIP et l'ensemble des nœuds sur lesquels ils sont gérés. Un cluster peut avoir plusieurs configurations de déploiement de basculement IP, chacune gérant son propre ensemble d'adresses VIP uniques. Chaque nœud de la configuration de basculement IP exécute un pod de basculement IP, et ce pod exécute Keepalived.

Lorsque l'on utilise des VIP pour accéder à un pod avec un réseau hôte, le pod d'application s'exécute sur tous les nœuds qui exécutent les pods de basculement IP. Cela permet à n'importe quel nœud de basculement IP de devenir le maître et de desservir les VIP en cas de besoin. Si les modules d'application ne sont pas exécutés sur tous les nœuds avec basculement IP, certains nœuds de basculement IP ne desservent jamais les VIP ou certains modules d'application ne reçoivent jamais de trafic. Utilisez le même sélecteur et le même nombre de réplications, à la fois pour le basculement IP et pour les modules d'application, afin d'éviter cette incohérence.

Lorsque l'on utilise des VIP pour accéder à un service, n'importe quel nœud peut faire partie de l'ensemble de nœuds de basculement IP, puisque le service est accessible sur tous les nœuds, quel que soit l'endroit où s'exécute le module d'application. N'importe lequel des nœuds de basculement IP peut devenir maître à tout moment. Le service peut soit utiliser des IP externes et un port de service, soit utiliser une adresse NodePort.

Lors de l'utilisation d'IP externes dans la définition du service, les VIP sont définis sur les IP externes et le port de surveillance du basculement d'IP est défini sur le port du service. Lors de l'utilisation d'un port de nœud, le port est ouvert sur chaque nœud du cluster et le service équilibre le trafic à partir du nœud qui dessert actuellement le VIP. Dans ce cas, le port de surveillance du basculement IP est défini sur NodePort dans la définition du service.

Important

La mise en place d'un site NodePort est une opération privilégiée.

Important

Même si un service VIP est hautement disponible, les performances peuvent encore être affectées. Keepalived s'assure que chaque VIP est desservi par un nœud de la configuration, et plusieurs VIP peuvent se retrouver sur le même nœud même si d'autres nœuds n'en ont pas. Les stratégies qui équilibrent la charge de manière externe sur un ensemble de VIP peuvent être contrecarrées lorsque le basculement IP place plusieurs VIP sur le même nœud.

Lorsque vous utilisez ingressIP, vous pouvez configurer le basculement IP pour avoir la même plage VIP que la plage ingressIP. Vous pouvez également désactiver le port de surveillance. Dans ce cas, tous les VIP apparaissent sur le même nœud du cluster. Tout utilisateur peut configurer un service avec ingressIP et le rendre hautement disponible.

Important

Il y a un maximum de 254 VIP dans le cluster.

15.1. Variables d'environnement pour le basculement IP

Le tableau suivant contient les variables utilisées pour configurer le basculement IP.

Tableau 15.1. Variables d'environnement pour le basculement IP

Nom de la variableDéfautDescription

OPENSHIFT_HA_MONITOR_PORT

80

Le module de basculement IP tente d'ouvrir une connexion TCP à ce port sur chaque IP virtuelle (VIP). Si la connexion est établie, le service est considéré comme étant en cours d'exécution. Si ce port est défini sur 0, le test est toujours réussi.

OPENSHIFT_HA_NETWORK_INTERFACE

 

Nom de l'interface que le basculement IP utilise pour envoyer le trafic VRRP (Virtual Router Redundancy Protocol). La valeur par défaut est eth0.

OPENSHIFT_HA_REPLICA_COUNT

2

Le nombre de répliques à créer. Il doit correspondre à la valeur spec.replicas dans la configuration du déploiement du basculement IP.

OPENSHIFT_HA_VIRTUAL_IPS

 

La liste des plages d'adresses IP à répliquer. Elle doit être fournie. Par exemple, 1.2.3.4-6,1.2.3.9.

OPENSHIFT_HA_VRRP_ID_OFFSET

0

La valeur de décalage utilisée pour définir les ID des routeurs virtuels. L'utilisation de différentes valeurs de décalage permet à plusieurs configurations de basculement IP d'exister au sein d'un même cluster. Le décalage par défaut est 0, et la plage autorisée va de 0 à 255.

OPENSHIFT_HA_VIP_GROUPS

 

Le nombre de groupes à créer pour VRRP. S'il n'est pas défini, un groupe est créé pour chaque plage IP virtuelle spécifiée avec la variable OPENSHIFT_HA_VIP_GROUPS.

OPENSHIFT_HA_IPTABLES_CHAIN

ENTRÉE

Le nom de la chaîne iptables, pour ajouter automatiquement une règle iptables pour autoriser le trafic VRRP. Si la valeur n'est pas définie, une règle iptables n'est pas ajoutée. Si la chaîne n'existe pas, elle n'est pas créée.

OPENSHIFT_HA_CHECK_SCRIPT

 

Le nom du chemin complet dans le système de fichiers pod d'un script qui est périodiquement exécuté pour vérifier que l'application fonctionne.

OPENSHIFT_HA_CHECK_INTERVAL

2

Période, en secondes, pendant laquelle le script de contrôle est exécuté.

OPENSHIFT_HA_NOTIFY_SCRIPT

 

Le nom du chemin complet dans le système de fichiers pod d'un script qui est exécuté chaque fois que l'état change.

OPENSHIFT_HA_PREEMPTION

preempt_nodelay 300

La stratégie de gestion d'un nouvel hôte de priorité supérieure. La stratégie nopreempt ne déplace pas le maître de l'hôte de priorité inférieure vers l'hôte de priorité supérieure.

15.2. Configuration du basculement IP

En tant qu'administrateur de grappe, vous pouvez configurer le basculement IP sur une grappe entière ou sur un sous-ensemble de nœuds, comme défini par le sélecteur d'étiquettes. Vous pouvez également configurer plusieurs configurations de déploiement du basculement IP dans votre grappe, chacune étant indépendante des autres.

La configuration du déploiement du basculement IP garantit qu'un pod de basculement s'exécute sur chacun des nœuds correspondant aux contraintes ou à l'étiquette utilisée.

Ce pod exécute Keepalived, qui peut surveiller un point d'extrémité et utiliser le protocole VRRP (Virtual Router Redundancy Protocol) pour basculer l'IP virtuelle (VIP) d'un nœud à l'autre si le premier nœud ne peut pas atteindre le service ou le point d'extrémité.

Pour une utilisation en production, définissez un selector qui sélectionne au moins deux nœuds, et définissez replicas égal au nombre de nœuds sélectionnés.

Conditions préalables

  • Vous êtes connecté au cluster avec un utilisateur disposant des privilèges cluster-admin.
  • Vous avez créé un secret de fabrication.

Procédure

  1. Créez un compte de service de basculement IP :

    $ oc create sa ipfailover
  2. Mise à jour des contraintes de contexte de sécurité (SCC) pour hostNetwork:

    $ oc adm policy add-scc-to-user privileged -z ipfailover
    $ oc adm policy add-scc-to-user hostnetwork -z ipfailover
  3. Créer un fichier YAML de déploiement pour configurer le basculement IP :

    Exemple de déploiement YAML pour la configuration du basculement IP

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ipfailover-keepalived 1
      labels:
        ipfailover: hello-openshift
    spec:
      strategy:
        type: Recreate
      replicas: 2
      selector:
        matchLabels:
          ipfailover: hello-openshift
      template:
        metadata:
          labels:
            ipfailover: hello-openshift
        spec:
          serviceAccountName: ipfailover
          privileged: true
          hostNetwork: true
          nodeSelector:
            node-role.kubernetes.io/worker: ""
          containers:
          - name: openshift-ipfailover
            image: quay.io/openshift/origin-keepalived-ipfailover
            ports:
            - containerPort: 63000
              hostPort: 63000
            imagePullPolicy: IfNotPresent
            securityContext:
              privileged: true
            volumeMounts:
            - name: lib-modules
              mountPath: /lib/modules
              readOnly: true
            - name: host-slash
              mountPath: /host
              readOnly: true
              mountPropagation: HostToContainer
            - name: etc-sysconfig
              mountPath: /etc/sysconfig
              readOnly: true
            - name: config-volume
              mountPath: /etc/keepalive
            env:
            - name: OPENSHIFT_HA_CONFIG_NAME
              value: "ipfailover"
            - name: OPENSHIFT_HA_VIRTUAL_IPS 2
              value: "1.1.1.1-2"
            - name: OPENSHIFT_HA_VIP_GROUPS 3
              value: "10"
            - name: OPENSHIFT_HA_NETWORK_INTERFACE 4
              value: "ens3" #The host interface to assign the VIPs
            - name: OPENSHIFT_HA_MONITOR_PORT 5
              value: "30060"
            - name: OPENSHIFT_HA_VRRP_ID_OFFSET 6
              value: "0"
            - name: OPENSHIFT_HA_REPLICA_COUNT 7
              value: "2" #Must match the number of replicas in the deployment
            - name: OPENSHIFT_HA_USE_UNICAST
              value: "false"
            #- name: OPENSHIFT_HA_UNICAST_PEERS
              #value: "10.0.148.40,10.0.160.234,10.0.199.110"
            - name: OPENSHIFT_HA_IPTABLES_CHAIN 8
              value: "INPUT"
            #- name: OPENSHIFT_HA_NOTIFY_SCRIPT 9
            #  value: /etc/keepalive/mynotifyscript.sh
            - name: OPENSHIFT_HA_CHECK_SCRIPT 10
              value: "/etc/keepalive/mycheckscript.sh"
            - name: OPENSHIFT_HA_PREEMPTION 11
              value: "preempt_delay 300"
            - name: OPENSHIFT_HA_CHECK_INTERVAL 12
              value: "2"
            livenessProbe:
              initialDelaySeconds: 10
              exec:
                command:
                - pgrep
                - keepalived
          volumes:
          - name: lib-modules
            hostPath:
              path: /lib/modules
          - name: host-slash
            hostPath:
              path: /
          - name: etc-sysconfig
            hostPath:
              path: /etc/sysconfig
          # config-volume contains the check script
          # created with `oc create configmap keepalived-checkscript --from-file=mycheckscript.sh`
          - configMap:
              defaultMode: 0755
              name: keepalived-checkscript
            name: config-volume
          imagePullSecrets:
            - name: openshift-pull-secret 13

    1
    Le nom du déploiement du basculement IP.
    2
    La liste des plages d'adresses IP à répliquer. Elle doit être fournie. Par exemple, 1.2.3.4-6,1.2.3.9.
    3
    Le nombre de groupes à créer pour VRRP. S'il n'est pas défini, un groupe est créé pour chaque plage IP virtuelle spécifiée avec la variable OPENSHIFT_HA_VIP_GROUPS.
    4
    Nom de l'interface que le basculement IP utilise pour envoyer le trafic VRRP. Par défaut, eth0 est utilisé.
    5
    Le module de basculement IP tente d'ouvrir une connexion TCP à ce port sur chaque VIP. Si la connexion est établie, le service est considéré comme étant en cours d'exécution. Si ce port est défini sur 0, le test est toujours réussi. La valeur par défaut est 80.
    6
    La valeur de décalage utilisée pour définir les ID des routeurs virtuels. L'utilisation de différentes valeurs de décalage permet à plusieurs configurations de basculement IP d'exister au sein d'un même cluster. Le décalage par défaut est 0, et la plage autorisée va de 0 à 255.
    7
    Le nombre de répliques à créer. Il doit correspondre à la valeur spec.replicas dans la configuration du déploiement du basculement IP. La valeur par défaut est 2.
    8
    Le nom de la chaîne iptables pour ajouter automatiquement une règle iptables afin d'autoriser le trafic VRRP. Si la valeur n'est pas définie, une règle iptables n'est pas ajoutée. Si la chaîne n'existe pas, elle n'est pas créée et Keepalived fonctionne en mode unicast. La valeur par défaut est INPUT.
    9
    Le nom du chemin complet dans le système de fichiers pod d'un script qui est exécuté chaque fois que l'état change.
    10
    Le nom du chemin complet dans le système de fichiers pod d'un script qui est périodiquement exécuté pour vérifier que l'application fonctionne.
    11
    La stratégie de gestion d'un nouvel hôte de priorité supérieure. La valeur par défaut est preempt_delay 300, ce qui fait qu'une instance Keepalived prend en charge un VIP après 5 minutes si un maître de priorité inférieure détient le VIP.
    12
    Période, en secondes, pendant laquelle le script de vérification est exécuté. La valeur par défaut est 2.
    13
    Créez le secret d'extraction avant de créer le déploiement, sinon vous obtiendrez une erreur lors de la création du déploiement.

15.3. À propos des adresses IP virtuelles

Keepalived gère un ensemble d'adresses IP virtuelles (VIP). L'administrateur doit s'assurer que toutes ces adresses :

  • Sont accessibles sur les hôtes configurés depuis l'extérieur du cluster.
  • Ne sont pas utilisés à d'autres fins au sein du groupe.

Keepalived sur chaque nœud détermine si le service nécessaire est en cours d'exécution. Si c'est le cas, les VIP sont pris en charge et Keepalived participe à la négociation pour déterminer quel nœud dessert le VIP. Pour qu'un nœud puisse participer, le service doit être à l'écoute sur le port de surveillance d'un VIP ou le contrôle doit être désactivé.

Note

Chaque VIP de l'ensemble peut être desservi par un nœud différent.

15.4. Configuration des scripts de contrôle et de notification

Keepalived surveille la santé de l'application en exécutant périodiquement un script de vérification optionnel fourni par l'utilisateur. Par exemple, le script peut tester un serveur web en émettant une requête et en vérifiant la réponse.

Lorsqu'un script de contrôle n'est pas fourni, un simple script par défaut est exécuté pour tester la connexion TCP. Ce test par défaut est supprimé lorsque le port du moniteur est 0.

Chaque module de basculement IP gère un démon Keepalived qui gère une ou plusieurs IP virtuelles (VIP) sur le nœud où le module est exécuté. Le démon Keepalived conserve l'état de chaque VIP pour ce nœud. Un VIP particulier sur un nœud particulier peut être dans l'état master, backup ou fault.

Lorsque le script de vérification de ce VIP sur le nœud qui est dans l'état master échoue, le VIP sur ce nœud entre dans l'état fault, ce qui déclenche une renégociation. Au cours de la renégociation, tous les VIP d'un nœud qui ne sont pas dans l'état fault participent au choix du nœud qui prendra en charge le VIP. En fin de compte, le VIP entre dans l'état master sur un nœud, et le VIP reste dans l'état backup sur les autres nœuds.

Lorsqu'un nœud avec un VIP dans l'état backup échoue, le VIP sur ce nœud entre dans l'état fault. Lorsque le script de contrôle réussit à nouveau pour un VIP sur un nœud dans l'état fault, le VIP sur ce nœud quitte l'état fault et négocie pour entrer dans l'état master. Le VIP sur ce nœud peut alors entrer dans l'état master ou backup.

En tant qu'administrateur du cluster, vous pouvez fournir un script de notification optionnel, qui est appelé chaque fois que l'état change. Keepalived transmet les trois paramètres suivants au script :

  • $1 - group ou instance
  • $2 - Nom du site group ou instance
  • $3 - Le nouvel État : master, backup, ou fault

Les scripts de vérification et de notification s'exécutent dans le module de basculement IP et utilisent le système de fichiers du module, et non le système de fichiers de l'hôte. Toutefois, le module de basculement IP rend le système de fichiers hôte disponible sous le chemin de montage /hosts. Lors de la configuration d'un script de contrôle ou de notification, vous devez fournir le chemin d'accès complet au script. L'approche recommandée pour fournir les scripts est d'utiliser une carte de configuration.

Les noms des chemins complets des scripts de vérification et de notification sont ajoutés au fichier de configuration de Keepalived, _/etc/keepalived/keepalived.conf, qui est chargé à chaque démarrage de Keepalived. Les scripts peuvent être ajoutés au pod avec une carte de configuration comme suit.

Conditions préalables

  • You installed the OpenShift CLI (oc).
  • Vous êtes connecté au cluster avec un utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Créez le script souhaité et créez une carte de configuration pour le contenir. Le script n'a pas d'arguments d'entrée et doit renvoyer 0 pour OK et 1 pour fail.

    Le script de vérification, mycheckscript.sh:

    #!/bin/bash
        # Whatever tests are needed
        # E.g., send request and verify response
    exit 0
  2. Créer la carte de configuration :

    $ oc create configmap mycustomcheck --from-file=mycheckscript.sh
  3. Ajouter le script au pod. L'adresse defaultMode pour les fichiers de configuration montés doit pouvoir être exécutée à l'aide des commandes oc ou en modifiant la configuration du déploiement. Une valeur de 0755, 493 décimal, est typique :

    $ oc set env deploy/ipfailover-keepalived \
        OPENSHIFT_HA_CHECK_SCRIPT=/etc/keepalive/mycheckscript.sh
    $ oc set volume deploy/ipfailover-keepalived --add --overwrite \
        --name=config-volume \
        --mount-path=/etc/keepalive \
        --source='{"configMap": { "name": "mycustomcheck", "defaultMode": 493}}'
    Note

    La commande oc set env est sensible aux espaces blancs. Il ne doit pas y avoir d'espace de part et d'autre du signe =.

    Astuce

    Vous pouvez également modifier la configuration du déploiement de ipfailover-keepalived:

    $ oc edit deploy ipfailover-keepalived
        spec:
          containers:
          - env:
            - name: OPENSHIFT_HA_CHECK_SCRIPT  1
              value: /etc/keepalive/mycheckscript.sh
    ...
            volumeMounts: 2
            - mountPath: /etc/keepalive
              name: config-volume
          dnsPolicy: ClusterFirst
    ...
          volumes: 3
          - configMap:
              defaultMode: 0755 4
              name: customrouter
            name: config-volume
    ...
    1
    Dans le champ spec.container.env, ajoutez la variable d'environnement OPENSHIFT_HA_CHECK_SCRIPT pour qu'elle pointe vers le fichier de script monté.
    2
    Ajoutez le champ spec.container.volumeMounts pour créer le point de montage.
    3
    Ajouter un nouveau champ spec.volumes pour mentionner la carte de configuration.
    4
    Cela permet de définir l'autorisation d'exécution des fichiers. Lors de la relecture, elle est affichée en décimal, 493.

    Enregistrez les modifications et quittez l'éditeur. Cette opération redémarre ipfailover-keepalived.

15.5. Configuration de la préemption VRRP

Lorsqu'une IP virtuelle (VIP) sur un nœud quitte l'état fault en passant le script de contrôle, la VIP sur le nœud entre dans l'état backup si elle a une priorité inférieure à celle de la VIP sur le nœud qui est actuellement dans l'état master. Toutefois, si le VIP du nœud qui quitte l'état fault a une priorité plus élevée, la stratégie de préemption détermine son rôle dans le cluster.

La stratégie nopreempt ne déplace pas master du VIP de priorité inférieure sur l'hôte vers le VIP de priorité supérieure sur l'hôte. Avec preempt_delay 300, la valeur par défaut, Keepalived attend les 300 secondes spécifiées et déplace master vers le VIP de plus haute priorité sur l'hôte.

Conditions préalables

  • You installed the OpenShift CLI (oc).

Procédure

  • Pour spécifier la préemption, entrez dans oc edit deploy ipfailover-keepalived pour modifier la configuration du déploiement du routeur :

    $ oc edit deploy ipfailover-keepalived
    ...
        spec:
          containers:
          - env:
            - name: OPENSHIFT_HA_PREEMPTION  1
              value: preempt_delay 300
    ...
    1
    Définir la valeur de OPENSHIFT_HA_PREEMPTION:
    • preempt_delay 300: Keepalived attend les 300 secondes spécifiées et déplace master vers le VIP de priorité supérieure sur l'hôte. Il s'agit de la valeur par défaut.
    • nopreempt: ne déplace pas master du VIP de priorité inférieure sur l'hôte vers le VIP de priorité supérieure sur l'hôte.

15.6. À propos du décalage de l'ID VRRP

Chaque module de basculement IP géré par la configuration de déploiement de basculement IP, 1 module par nœud ou réplique, exécute un démon Keepalived. Au fur et à mesure que des configurations de déploiement de basculement IP sont configurées, d'autres modules sont créés et d'autres démons participent à la négociation commune du protocole VRRP (Virtual Router Redundancy Protocol). Cette négociation est effectuée par tous les démons Keepalived et détermine quels nœuds gèrent quelles IP virtuelles (VIP).

En interne, Keepalived attribue un vrrp-id unique à chaque VIP. La négociation utilise cet ensemble de vrrp-ids, lorsqu'une décision est prise, le VIP correspondant au vrrp-id gagnant est pris en charge sur le nœud gagnant.

Par conséquent, pour chaque VIP défini dans la configuration du déploiement du basculement IP, le pod de basculement IP doit attribuer un vrrp-id correspondant. Pour ce faire, il commence par OPENSHIFT_HA_VRRP_ID_OFFSET et attribue séquentiellement vrrp-ids à la liste des VIP. Les valeurs de vrrp-ids peuvent être comprises dans l'intervalle 1..255.

Lorsqu'il existe plusieurs configurations de déploiement de basculement IP, vous devez spécifier OPENSHIFT_HA_VRRP_ID_OFFSET pour qu'il soit possible d'augmenter le nombre de VIP dans la configuration de déploiement et qu'aucune des plages vrrp-id ne se chevauche.

15.7. Configuration du basculement IP pour plus de 254 adresses

La gestion du basculement IP est limitée à 254 groupes d'adresses IP virtuelles (VIP). Par défaut, OpenShift Container Platform attribue une adresse IP à chaque groupe. Vous pouvez utiliser la variable OPENSHIFT_HA_VIP_GROUPS pour changer cela afin que plusieurs adresses IP soient dans chaque groupe et définir le nombre de groupes VIP disponibles pour chaque instance VRRP (Virtual Router Redundancy Protocol) lors de la configuration du basculement IP.

Le regroupement des VIP permet d'élargir la gamme d'attribution des VIP par VRRP dans le cas d'événements de basculement VRRP, et est utile lorsque tous les hôtes du cluster ont accès à un service localement. Par exemple, lorsqu'un service est exposé avec un ExternalIP.

Note

En règle générale, pour le basculement, ne limitez pas les services, tels que le routeur, à un hôte spécifique. Au contraire, les services doivent être répliqués sur chaque hôte de sorte qu'en cas de basculement IP, les services ne doivent pas être recréés sur le nouvel hôte.

Note

Si vous utilisez les contrôles de santé d'OpenShift Container Platform, la nature du basculement IP et des groupes signifie que toutes les instances du groupe ne sont pas contrôlées. Pour cette raison, les contrôles de santé de Kubernetes doivent être utilisés pour s'assurer que les services sont actifs.

Conditions préalables

  • Vous êtes connecté au cluster avec un utilisateur disposant des privilèges cluster-admin.

Procédure

  • Pour modifier le nombre d'adresses IP attribuées à chaque groupe, modifiez la valeur de la variable OPENSHIFT_HA_VIP_GROUPS, par exemple :

    Exemple Deployment YAML pour la configuration du basculement IP

    ...
        spec:
            env:
            - name: OPENSHIFT_HA_VIP_GROUPS 1
              value: "3"
    ...

    1
    Si OPENSHIFT_HA_VIP_GROUPS est défini sur 3 dans un environnement comportant sept VIP, il crée trois groupes, assignant trois VIP au premier groupe et deux VIP aux deux groupes restants.
Note

Si le nombre de groupes défini par OPENSHIFT_HA_VIP_GROUPS est inférieur au nombre d'adresses IP définies pour le basculement, le groupe contient plus d'une adresse IP et toutes les adresses sont déplacées en tant qu'unité unique.

15.8. Haute disponibilité Pour ingressIP

Dans les clusters non-cloud, il est possible de combiner le basculement IP et ingressIP vers un service. Il en résulte des services à haute disponibilité pour les utilisateurs qui créent des services à l'aide de ingressIP.

L'approche consiste à spécifier une plage ingressIPNetworkCIDR et à utiliser la même plage lors de la création de la configuration ipfailover.

Étant donné que le basculement IP peut prendre en charge un maximum de 255 VIP pour l'ensemble du cluster, le site ingressIPNetworkCIDR doit être /24 ou plus petit.

15.9. Suppression du basculement IP

Lors de la configuration initiale du basculement IP, les nœuds de travail du cluster sont modifiés avec une règle iptables qui autorise explicitement les paquets multicast sur 224.0.0.18 pour Keepalived. En raison de la modification des nœuds, la suppression du basculement IP nécessite l'exécution d'un travail pour supprimer la règle iptables et supprimer les adresses IP virtuelles utilisées par Keepalived.

Procédure

  1. Facultatif : identifiez et supprimez tous les scripts de contrôle et de notification qui sont stockés sous forme de cartes de configuration :

    1. Identifier si des pods pour le basculement IP utilisent une carte de configuration comme volume :

      $ oc get pod -l ipfailover \
        -o jsonpath="\
      {range .items[?(@.spec.volumes[*].configMap)]}
      {'Namespace: '}{.metadata.namespace}
      {'Pod:       '}{.metadata.name}
      {'Volumes that use config maps:'}
      {range .spec.volumes[?(@.configMap)]}  {'volume:    '}{.name}
        {'configMap: '}{.configMap.name}{'\n'}{end}
      {end}"

      Exemple de sortie

      Namespace: default
      Pod:       keepalived-worker-59df45db9c-2x9mn
      Volumes that use config maps:
        volume:    config-volume
        configMap: mycustomcheck

    2. Si l'étape précédente a fourni les noms des cartes de configuration utilisées comme volumes, supprimez les cartes de configuration :

      oc delete configmap <configmap_name> $ oc delete configmap <configmap_name>
  2. Identifier un déploiement existant pour le basculement IP :

    $ oc get deployment -l ipfailover

    Exemple de sortie

    NAMESPACE   NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    default     ipfailover   2/2     2            2           105d

  3. Supprimer le déploiement :

    oc delete deployment <ipfailover_deployment_name>
  4. Supprimez le compte de service ipfailover:

    $ oc delete sa ipfailover
  5. Exécutez un travail qui supprime la règle des tables IP ajoutée lors de la configuration initiale du basculement IP :

    1. Créez un fichier tel que remove-ipfailover-job.yaml dont le contenu est similaire à l'exemple suivant :

      apiVersion: batch/v1
      kind: Job
      metadata:
        generateName: remove-ipfailover-
        labels:
          app: remove-ipfailover
      spec:
        template:
          metadata:
            name: remove-ipfailover
          spec:
            containers:
            - name: remove-ipfailover
              image: quay.io/openshift/origin-keepalived-ipfailover:4.12
              command: ["/var/lib/ipfailover/keepalived/remove-failover.sh"]
            nodeSelector:
              kubernetes.io/hostname: <host_name>  <.>
            restartPolicy: Never

      <.> Exécutez la tâche pour chaque nœud de votre cluster qui a été configuré pour le basculement IP et remplacez le nom d'hôte à chaque fois.

    2. Exécuter le travail :

      $ oc create -f remove-ipfailover-job.yaml

      Exemple de sortie

      job.batch/remove-ipfailover-2h8dm created

Vérification

  • Confirmez que le travail a supprimé la configuration initiale du basculement IP.

    $ oc logs job/remove-ipfailover-2h8dm

    Exemple de sortie

    remove-failover.sh: OpenShift IP Failover service terminating.
      - Removing ip_vs module ...
      - Cleaning up ...
      - Releasing VIPs  (interface eth0) ...

Chapitre 16. Configuration des sysctl de réseau au niveau de l'interface

Sous Linux, sysctl permet à un administrateur de modifier les paramètres du noyau au moment de l'exécution. Vous pouvez modifier les sysctls réseau au niveau de l'interface en utilisant le méta plugin tuning Container Network Interface (CNI). Le méta plugin CNI de réglage fonctionne en chaîne avec un plugin CNI principal, comme illustré.

CNI plugin

Le plugin CNI principal attribue l'interface et la transmet au méta plugin CNI de réglage au moment de l'exécution. Vous pouvez modifier certains sysctls et plusieurs attributs d'interface (mode promiscuous, mode all-multicast, MTU et adresse MAC) dans l'espace de noms du réseau en utilisant le méta plugin CNI tuning. Dans la configuration du méta plugin CNI tuning, le nom de l'interface est représenté par le jeton IFNAME, et est remplacé par le nom réel de l'interface au moment de l'exécution.

Note

Dans OpenShift Container Platform, le méta plugin CNI tuning ne prend en charge que la modification des sysctls réseau au niveau de l'interface.

16.1. Configuration du CNI d'accord

La procédure suivante configure le CNI de réglage pour modifier le réseau au niveau de l'interface net.ipv4.conf.IFNAME.accept_redirects sysctl. Cet exemple permet d'accepter et d'envoyer des paquets ICMP redirigés.

Procédure

  1. Créez une définition de pièce jointe au réseau, telle que tuning-example.yaml, avec le contenu suivant :

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: <name> 1
      namespace: default 2
    spec:
      config: '{
        "cniVersion": "0.4.0", 3
        "name": "<name>", 4
        "plugins": [{
           "type": "<main_CNI_plugin>" 5
          },
          {
           "type": "tuning", 6
           "sysctl": {
                "net.ipv4.conf.IFNAME.accept_redirects": "1" 7
            }
          }
         ]
    }
    1
    Spécifie le nom de la pièce jointe réseau supplémentaire à créer. Le nom doit être unique dans l'espace de noms spécifié.
    2
    Spécifie l'espace de noms auquel l'objet est associé.
    3
    Spécifie la version de la spécification CNI.
    4
    Spécifie le nom de la configuration. Il est recommandé de faire correspondre le nom de la configuration à la valeur du nom de la définition de l'attachement au réseau.
    5
    Spécifie le nom du plugin CNI principal à configurer.
    6
    Spécifie le nom du méta plugin CNI.
    7
    Spécifie le sysctl à définir.

    Un exemple de fichier yaml est présenté ici :

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: tuningnad
      namespace: default
    spec:
      config: '{
        "cniVersion": "0.4.0",
        "name": "tuningnad",
        "plugins": [{
          "type": "bridge"
          },
          {
          "type": "tuning",
          "sysctl": {
             "net.ipv4.conf.IFNAME.accept_redirects": "1"
            }
        }
      ]
    }'
  2. Appliquez le fichier yaml en exécutant la commande suivante :

    $ oc apply -f tuning-example.yaml

    Exemple de sortie

    networkattachmentdefinition.k8.cni.cncf.io/tuningnad created

  3. Créez un pod tel que examplepod.yaml avec la définition de l'attachement réseau similaire à ce qui suit :

    apiVersion: v1
    kind: Pod
    metadata:
      name: tunepod
      namespace: default
      annotations:
        k8s.v1.cni.cncf.io/networks: tuningnad 1
    spec:
      containers:
      - name: podexample
        image: centos
        command: ["/bin/bash", "-c", "sleep INF"]
        securityContext:
          runAsUser: 2000 2
          runAsGroup: 3000 3
          allowPrivilegeEscalation: false 4
          capabilities: 5
            drop: ["ALL"]
      securityContext:
        runAsNonRoot: true 6
        seccompProfile: 7
          type: RuntimeDefault
    1
    Spécifiez le nom du site configuré NetworkAttachmentDefinition.
    2
    runAsUser contrôle l'identifiant de l'utilisateur avec lequel le conteneur est exécuté.
    3
    runAsGroup contrôle l'identifiant du groupe primaire avec lequel les conteneurs sont exécutés.
    4
    allowPrivilegeEscalation détermine si un pod peut demander à autoriser l'escalade des privilèges. S'il n'est pas spécifié, la valeur par défaut est true. Ce booléen contrôle directement si le drapeau no_new_privs est activé sur le processus du conteneur.
    5
    capabilities permettent des actions privilégiées sans donner un accès complet à la racine. Cette politique permet de s'assurer que toutes les capacités sont supprimées du pod.
    6
    runAsNonRoot: true exige que le conteneur fonctionne avec un utilisateur dont l'UID est différent de 0.
    7
    RuntimeDefault active le profil seccomp par défaut pour un pod ou une charge de travail de conteneur.
  4. Appliquez le fichier yaml en exécutant la commande suivante :

    $ oc apply -f examplepod.yaml
  5. Vérifiez que le module est créé en exécutant la commande suivante :

    $ oc get pod

    Exemple de sortie

    NAME      READY   STATUS    RESTARTS   AGE
    tunepod   1/1     Running   0          47s

  6. Connectez-vous au module en exécutant la commande suivante :

    $ oc rsh tunepod
  7. Vérifiez les valeurs des drapeaux sysctl configurés. Par exemple, trouvez la valeur net.ipv4.conf.net1.accept_redirects en exécutant la commande suivante :

    sh-4.4# sysctl net.ipv4.conf.net1.accept_redirects

    Résultats attendus

    net.ipv4.conf.net1.accept_redirects = 1

16.2. Ressources supplémentaires

Chapitre 17. Utilisation du protocole SCTP (Stream Control Transmission Protocol) sur un cluster bare metal

En tant qu'administrateur de cluster, vous pouvez utiliser le protocole SCTP (Stream Control Transmission Protocol) sur un cluster.

17.1. Prise en charge du protocole de transmission de contrôle de flux (SCTP) sur OpenShift Container Platform

En tant qu'administrateur de cluster, vous pouvez activer SCTP sur les hôtes du cluster. Sur Red Hat Enterprise Linux CoreOS (RHCOS), le module SCTP est désactivé par défaut.

SCTP est un protocole fiable basé sur des messages qui fonctionne sur un réseau IP.

Lorsque cette option est activée, vous pouvez utiliser SCTP comme protocole avec les pods, les services et la stratégie réseau. Un objet Service doit être défini avec le paramètre type réglé sur la valeur ClusterIP ou NodePort.

17.1.1. Exemple de configurations utilisant le protocole SCTP

Vous pouvez configurer un pod ou un service pour qu'il utilise le protocole SCTP en attribuant au paramètre protocol la valeur SCTP dans l'objet pod ou service.

Dans l'exemple suivant, un pod est configuré pour utiliser SCTP :

apiVersion: v1
kind: Pod
metadata:
  namespace: project1
  name: example-pod
spec:
  containers:
    - name: example-pod
...
      ports:
        - containerPort: 30100
          name: sctpserver
          protocol: SCTP

Dans l'exemple suivant, un service est configuré pour utiliser SCTP :

apiVersion: v1
kind: Service
metadata:
  namespace: project1
  name: sctpserver
spec:
...
  ports:
    - name: sctpserver
      protocol: SCTP
      port: 30100
      targetPort: 30100
  type: ClusterIP

Dans l'exemple suivant, un objet NetworkPolicy est configuré pour s'appliquer au trafic réseau SCTP sur le port 80 à partir de n'importe quel pod doté d'une étiquette spécifique :

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-sctp-on-http
spec:
  podSelector:
    matchLabels:
      role: web
  ingress:
  - ports:
    - protocol: SCTP
      port: 80

17.2. Activation du protocole de transmission par contrôle de flux (SCTP)

En tant qu'administrateur de cluster, vous pouvez charger et activer le module noyau SCTP figurant sur la liste noire sur les nœuds de travail de votre cluster.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.

Procédure

  1. Créez un fichier nommé load-sctp-module.yaml qui contient la définition YAML suivante :

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      name: load-sctp-module
      labels:
        machineconfiguration.openshift.io/role: worker
    spec:
      config:
        ignition:
          version: 3.2.0
        storage:
          files:
            - path: /etc/modprobe.d/sctp-blacklist.conf
              mode: 0644
              overwrite: true
              contents:
                source: data:,
            - path: /etc/modules-load.d/sctp-load.conf
              mode: 0644
              overwrite: true
              contents:
                source: data:,sctp
  2. Pour créer l'objet MachineConfig, entrez la commande suivante :

    $ oc create -f load-sctp-module.yaml
  3. En option : Pour observer l'état des nœuds pendant que l'opérateur MachineConfig applique le changement de configuration, entrez la commande suivante. Lorsque l'état d'un nœud passe à Ready, la mise à jour de la configuration est appliquée.

    $ oc get nodes

17.3. Vérification de l'activation du protocole de transmission par contrôle de flux (SCTP)

Vous pouvez vérifier que le SCTP fonctionne sur un cluster en créant un pod avec une application qui écoute le trafic SCTP, en l'associant à un service, puis en vous connectant au service exposé.

Conditions préalables

  • Accès à l'internet depuis le cluster pour installer le paquet nc.
  • Installez le CLI OpenShift (oc).
  • Accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.

Procédure

  1. La création d'un pod démarre un listener SCTP :

    1. Créer un fichier nommé sctp-server.yaml qui définit un pod avec le YAML suivant :

      apiVersion: v1
      kind: Pod
      metadata:
        name: sctpserver
        labels:
          app: sctpserver
      spec:
        containers:
          - name: sctpserver
            image: registry.access.redhat.com/ubi8/ubi
            command: ["/bin/sh", "-c"]
            args:
              ["dnf install -y nc && sleep inf"]
            ports:
              - containerPort: 30102
                name: sctpserver
                protocol: SCTP
    2. Créez le pod en entrant la commande suivante :

      $ oc create -f sctp-server.yaml
  2. Créer un service pour le pod d'écoute SCTP.

    1. Créez un fichier nommé sctp-service.yaml qui définit un service avec le YAML suivant :

      apiVersion: v1
      kind: Service
      metadata:
        name: sctpservice
        labels:
          app: sctpserver
      spec:
        type: NodePort
        selector:
          app: sctpserver
        ports:
          - name: sctpserver
            protocol: SCTP
            port: 30102
            targetPort: 30102
    2. Pour créer le service, entrez la commande suivante :

      $ oc create -f sctp-service.yaml
  3. Créer un pod pour le client SCTP.

    1. Créez un fichier nommé sctp-client.yaml avec le langage YAML suivant :

      apiVersion: v1
      kind: Pod
      metadata:
        name: sctpclient
        labels:
          app: sctpclient
      spec:
        containers:
          - name: sctpclient
            image: registry.access.redhat.com/ubi8/ubi
            command: ["/bin/sh", "-c"]
            args:
              ["dnf install -y nc && sleep inf"]
    2. Pour créer l'objet Pod, entrez la commande suivante :

      $ oc apply -f sctp-client.yaml
  4. Exécutez une liste d'écoute SCTP sur le serveur.

    1. Pour vous connecter au module serveur, entrez la commande suivante :

      $ oc rsh sctpserver
    2. Pour démarrer l'auditeur SCTP, entrez la commande suivante :

      $ nc -l 30102 --sctp
  5. Se connecter à l'auditeur SCTP sur le serveur.

    1. Ouvrez une nouvelle fenêtre ou un nouvel onglet dans votre programme de terminal.
    2. Obtenez l'adresse IP du service sctpservice. Entrez la commande suivante :

      $ oc get services sctpservice -o go-template='{{.spec.clusterIP}}{{"\n"}}'
    3. Pour se connecter au pod client, entrez la commande suivante :

      $ oc rsh sctpclient
    4. Pour démarrer le client SCTP, entrez la commande suivante. Remplacez <cluster_IP> par l'adresse IP du cluster du service sctpservice.

      # nc <cluster_IP> 30102 --sctp

Chapitre 18. Utilisation du matériel PTP

Vous pouvez configurer les services linuxptp et utiliser du matériel compatible PTP dans les nœuds de cluster d'OpenShift Container Platform.

18.1. À propos du matériel PTP

Vous pouvez utiliser la console OpenShift Container Platform ou OpenShift CLI (oc) pour installer PTP en déployant le PTP Operator. L'opérateur PTP crée et gère les services linuxptp et fournit les fonctionnalités suivantes :

  • Découverte des appareils compatibles PTP dans le cluster.
  • Gestion de la configuration des services linuxptp.
  • Notification des événements d'horloge PTP qui affectent négativement les performances et la fiabilité de votre application avec le sidecar PTP Operator cloud-event-proxy.
Note

L'opérateur PTP travaille avec des appareils compatibles PTP sur des clusters approvisionnés uniquement sur une infrastructure bare-metal.

18.2. À propos de PTP

Le Precision Time Protocol (PTP) est utilisé pour synchroniser les horloges d'un réseau. Lorsqu'il est utilisé en conjonction avec un support matériel, le PTP est capable d'une précision inférieure à la microseconde et est plus précis que le Network Time Protocol (NTP).

Le paquet linuxptp comprend les programmes ptp4l et phc2sys pour la synchronisation des horloges. ptp4l implémente l'horloge frontière PTP et l'horloge ordinaire. ptp4l synchronise l'horloge matérielle PTP avec l'horloge source avec un horodatage matériel et synchronise l'horloge système avec l'horloge source avec un horodatage logiciel. phc2sys est utilisé pour l'horodatage matériel afin de synchroniser l'horloge système avec l'horloge matérielle PTP sur le contrôleur d'interface de réseau (NIC).

18.2.1. Éléments d'un domaine PTP

Le protocole PTP est utilisé pour synchroniser plusieurs nœuds connectés dans un réseau, avec des horloges pour chaque nœud. Les horloges synchronisées par PTP sont organisées dans une hiérarchie source-destination. La hiérarchie est créée et mise à jour automatiquement par l'algorithme de la meilleure horloge maîtresse (BMC), qui s'exécute sur chaque horloge. Les horloges de destination sont synchronisées avec les horloges sources, et les horloges de destination peuvent elles-mêmes être la source d'autres horloges en aval. Les types d'horloges suivants peuvent être inclus dans les configurations :

Horloge du grand maître
L'horloge grand maître fournit des informations horaires standard aux autres horloges du réseau et assure une synchronisation précise et stable. Elle écrit des horodatages et répond aux demandes de temps des autres horloges. Les horloges grand maître peuvent être synchronisées avec une source de temps GPS (Global Positioning System).
Horloge ordinaire
L'horloge ordinaire dispose d'une connexion à port unique qui peut jouer le rôle d'horloge source ou de destination, en fonction de sa position dans le réseau. L'horloge ordinaire peut lire et écrire des horodatages.
Horloge frontière
L'horloge périphérique possède des ports dans deux ou plusieurs voies de communication et peut être à la fois une source et une destination pour d'autres horloges de destination. L'horloge périphérique fonctionne comme une horloge de destination en amont. L'horloge de destination reçoit le message de synchronisation, corrige le retard, puis crée un nouveau signal temporel source à transmettre sur le réseau. L'horloge périphérique produit un nouveau paquet de données temporelles qui reste correctement synchronisé avec l'horloge source et peut réduire le nombre de dispositifs connectés qui se rapportent directement à l'horloge source.

18.2.2. Avantages du PTP par rapport au NTP

L'un des principaux avantages du PTP par rapport au NTP est le support matériel présent dans divers contrôleurs d'interface réseau (NIC) et commutateurs de réseau. Le matériel spécialisé permet au PTP de tenir compte des retards dans le transfert des messages et d'améliorer la précision de la synchronisation du temps. Pour obtenir la meilleure précision possible, il est recommandé que tous les composants de réseau entre les horloges PTP soient compatibles avec le matériel PTP.

Le PTP matériel offre une précision optimale, car la carte d'interface réseau peut horodater les paquets PTP au moment exact où ils sont envoyés et reçus. Comparé au PTP logiciel, qui nécessite un traitement supplémentaire des paquets PTP par le système d'exploitation, le PTP matériel offre une précision optimale.

Important

Avant d'activer le PTP, assurez-vous que NTP est désactivé pour les nœuds requis. Vous pouvez désactiver le service chronologique (chronyd) à l'aide d'une ressource personnalisée MachineConfig. Pour plus d'informations, voir Désactivation du service chronologique.

18.2.3. Utilisation de PTP avec un matériel à double NIC

OpenShift Container Platform prend en charge le matériel NIC simple et double pour une synchronisation PTP précise dans le cluster.

Pour les réseaux télécoms 5G qui offrent une couverture du spectre à bande moyenne, chaque unité virtuelle distribuée (vDU) nécessite des connexions à 6 unités radio (RU). Pour établir ces connexions, chaque hôte vDU a besoin de deux cartes d'interface réseau configurées en tant qu'horloges limites.

Le matériel Dual NIC vous permet de connecter chaque NIC à la même horloge leader en amont, avec des instances ptp4l distinctes pour chaque NIC alimentant les horloges en aval.

18.3. Installation de l'opérateur PTP à l'aide du CLI

En tant qu'administrateur de cluster, vous pouvez installer l'Opérateur à l'aide de la CLI.

Conditions préalables

  • Un cluster installé sur du matériel bare-metal avec des nœuds dont le matériel prend en charge le protocole PTP.
  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Créer un espace de noms pour l'opérateur PTP.

    1. Enregistrez le YAML suivant dans le fichier ptp-namespace.yaml:

      apiVersion: v1
      kind: Namespace
      metadata:
        name: openshift-ptp
        annotations:
          workload.openshift.io/allowed: management
        labels:
          name: openshift-ptp
          openshift.io/cluster-monitoring: "true"
    2. Créer le CR Namespace:

      $ oc create -f ptp-namespace.yaml
  2. Créez un groupe d'opérateurs pour l'opérateur PTP.

    1. Enregistrez le YAML suivant dans le fichier ptp-operatorgroup.yaml:

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: ptp-operators
        namespace: openshift-ptp
      spec:
        targetNamespaces:
        - openshift-ptp
    2. Créer le CR OperatorGroup:

      $ oc create -f ptp-operatorgroup.yaml
  3. S'abonner à l'opérateur PTP.

    1. Enregistrez le YAML suivant dans le fichier ptp-sub.yaml:

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: ptp-operator-subscription
        namespace: openshift-ptp
      spec:
        channel: "stable"
        name: ptp-operator
        source: redhat-operators
        sourceNamespace: openshift-marketplace
    2. Créer le CR Subscription:

      $ oc create -f ptp-sub.yaml
  4. Pour vérifier que l'opérateur est installé, entrez la commande suivante :

    $ oc get csv -n openshift-ptp -o custom-columns=Name:.metadata.name,Phase:.status.phase

    Exemple de sortie

    Name                         Phase
    4.12.0-202301261535          Succeeded

18.4. Installation de l'opérateur PTP à l'aide de la console web

En tant qu'administrateur de cluster, vous pouvez installer l'opérateur PTP à l'aide de la console web.

Note

Vous devez créer l'espace de noms et le groupe d'opérateurs comme indiqué dans la section précédente.

Procédure

  1. Installez l'opérateur PTP à l'aide de la console web d'OpenShift Container Platform :

    1. Dans la console Web OpenShift Container Platform, cliquez sur OperatorsOperatorHub.
    2. Choisissez PTP Operator dans la liste des opérateurs disponibles, puis cliquez sur Install.
    3. Sur la page Install Operator, sous A specific namespace on the cluster, sélectionnez openshift-ptp. Cliquez ensuite sur Install.
  2. En option, vérifier que l'installation de l'opérateur PTP a réussi : Vérifiez que l'opérateur PTP a été installé avec succès :

    1. Passez à la page OperatorsInstalled Operators.
    2. Assurez-vous que PTP Operator est listé dans le projet openshift-ptp avec un Status de InstallSucceeded.

      Note

      Pendant l'installation, un opérateur peut afficher un état Failed. Si l'installation réussit par la suite avec un message InstallSucceeded, vous pouvez ignorer le message Failed.

      Si l'opérateur n'apparaît pas tel qu'il a été installé, il convient de poursuivre le dépannage :

      • Allez à la page OperatorsInstalled Operators et inspectez les onglets Operator Subscriptions et Install Plans pour voir s'il y a des défaillances ou des erreurs sous Status.
      • Allez sur la page WorkloadsPods et vérifiez les journaux pour les pods dans le projet openshift-ptp.

18.5. Configuration des dispositifs PTP

L'opérateur PTP ajoute la définition de ressource personnalisée (CRD) NodePtpDevice.ptp.openshift.io à OpenShift Container Platform.

Une fois installé, l'opérateur PTP recherche dans votre grappe des périphériques réseau compatibles PTP sur chaque nœud. Il crée et met à jour un objet de ressource personnalisée (CR) NodePtpDevice pour chaque nœud qui fournit un périphérique réseau compatible PTP.

18.5.1. Découverte des périphériques réseau compatibles avec le protocole PTP dans votre cluster

  • Pour obtenir une liste complète des périphériques réseau compatibles avec le protocole PTP dans votre cluster, exécutez la commande suivante :

    $ oc get NodePtpDevice -n openshift-ptp -o yaml

    Exemple de sortie

    apiVersion: v1
    items:
    - apiVersion: ptp.openshift.io/v1
      kind: NodePtpDevice
      metadata:
        creationTimestamp: "2022-01-27T15:16:28Z"
        generation: 1
        name: dev-worker-0 1
        namespace: openshift-ptp
        resourceVersion: "6538103"
        uid: d42fc9ad-bcbf-4590-b6d8-b676c642781a
      spec: {}
      status:
        devices: 2
        - name: eno1
        - name: eno2
        - name: eno3
        - name: eno4
        - name: enp5s0f0
        - name: enp5s0f1
    ...

    1
    La valeur du paramètre name est identique au nom du nœud parent.
    2
    La collection devices comprend une liste des dispositifs compatibles PTP que l'opérateur PTP découvre pour le nœud.

18.5.2. Configuration des services linuxptp en tant qu'horloge ordinaire

Vous pouvez configurer les services linuxptp (ptp4l, phc2sys) comme des horloges ordinaires en créant un objet PtpConfig custom resource (CR).

Note

Utilisez l'exemple suivant PtpConfig CR comme base pour configurer les services linuxptp en tant qu'horloge ordinaire pour votre matériel et votre environnement particuliers. Cet exemple CR ne configure pas les événements rapides PTP. Pour configurer les événements rapides PTP, définissez les valeurs appropriées pour ptp4lOpts, ptp4lConf, et ptpClockThreshold. ptpClockThreshold n'est nécessaire que lorsque les événements sont activés. Voir "Configuring the PTP fast event notifications publisher" (Configuration de l'éditeur de notifications d'événements rapides PTP) pour plus d'informations.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Installer l'opérateur PTP.

Procédure

  1. Créez le CR PtpConfig suivant, puis enregistrez le YAML dans le fichier ordinary-clock-ptp-config.yaml.

    Configuration recommandée de l'horloge ordinaire PTP

    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: ordinary-clock-ptp-config
      namespace: openshift-ptp
      spec:
        profile:
          - name: ordinary-clock
            interface: "<interface_name>"
            phc2sysOpts: "-a -r -n 24"
            ptp4lOpts: "-2 -s"
            ptpSchedulingPolicy: SCHED_FIFO
            ptpSchedulingPriority: 10
            ptp4lConf: |
              [global]
              #
              # Default Data Set
              #
              twoStepFlag 1
              slaveOnly 1
              priority1 128
              priority2 128
              domainNumber 24
              clockClass 255
              clockAccuracy 0xFE
              offsetScaledLogVariance 0xFFFF
              free_running 0
              freq_est_interval 1
              dscp_event 0
              dscp_general 0
              dataset_comparison G.8275.x
              G.8275.defaultDS.localPriority 128
              #
              # Port Data Set
              #
              logAnnounceInterval -3
              logSyncInterval -4
              logMinDelayReqInterval -4
              logMinPdelayReqInterval -4
              announceReceiptTimeout 3
              syncReceiptTimeout 0
              delayAsymmetry 0
              fault_reset_interval 4
              neighborPropDelayThresh 20000000
              masterOnly 0
              G.8275.portDS.localPriority 128
              #
              # Run time options
              #
              assume_two_step 0
              logging_level 6
              path_trace_enabled 0
              follow_up_info 0
              hybrid_e2e 0
              inhibit_multicast_service 0
              net_sync_monitor 0
              tc_spanning_tree 0
              tx_timestamp_timeout 50
              unicast_listen 0
              unicast_master_table 0
              unicast_req_duration 3600
              use_syslog 1
              verbose 0
              summary_interval 0
              kernel_leap 1
              check_fup_sync 0
              #
              # Servo Options
              #
              pi_proportional_const 0.0
              pi_integral_const 0.0
              pi_proportional_scale 0.0
              pi_proportional_exponent -0.3
              pi_proportional_norm_max 0.7
              pi_integral_scale 0.0
              pi_integral_exponent 0.4
              pi_integral_norm_max 0.3
              step_threshold 2.0
              first_step_threshold 0.00002
              max_frequency 900000000
              clock_servo pi
              sanity_freq_limit 200000000
              ntpshm_segment 0
              #
              # Transport options
              #
              transportSpecific 0x0
              ptp_dst_mac 01:1B:19:00:00:00
              p2p_dst_mac 01:80:C2:00:00:0E
              udp_ttl 1
              udp6_scope 0x0E
              uds_address /var/run/ptp4l
              #
              # Default interface options
              #
              clock_type OC
              network_transport L2
              delay_mechanism E2E
              time_stamping hardware
              tsproc_mode filter
              delay_filter moving_median
              delay_filter_length 10
              egressLatency 0
              ingressLatency 0
              boundary_clock_jbod 0
              #
              # Clock description
              #
              productDescription ;;
              revisionData ;;
              manufacturerIdentity 00:00:00
              userDescription ;
              timeSource 0xA0
          recommend:
          - profile: ordinary-clock
            priority: 4
            match:
            - nodeLabel: "node-role.kubernetes.io/worker"
              nodeName: "<node_name>"

    Tableau 18.1. Options de configuration de l'horloge ordinaire PTP CR

    Champ de ressource personnaliséDescription

    name

    Le nom du CR PtpConfig.

    profile

    Spécifier un tableau d'un ou plusieurs objets profile. Chaque profil doit être nommé de manière unique.

    interface

    Indiquez l'interface réseau à utiliser par le service ptp4l, par exemple ens787f1.

    ptp4lOpts

    Spécifiez les options de configuration du système pour le service ptp4l, par exemple -2 pour sélectionner le transport réseau IEEE 802.3. Les options ne doivent pas inclure le nom de l'interface réseau -i <interface> et le fichier de configuration du service -f /etc/ptp4l.conf, car le nom de l'interface réseau et le fichier de configuration du service sont automatiquement ajoutés. Ajoutez --summary_interval -4 pour utiliser les événements rapides PTP avec cette interface.

    phc2sysOpts

    Spécifier les options de configuration du système pour le service phc2sys. Si ce champ est vide, l'opérateur PTP ne démarre pas le service phc2sys. Pour les cartes réseau Intel Columbiaville 800 Series, définissez les options de phc2sysOpts sur -a -r -m -n 24 -N 8 -R 16. -m imprime les messages sur stdout. linuxptp-daemon DaemonSet analyse les journaux et génère des métriques Prometheus.

    ptp4lConf

    Indiquez une chaîne contenant la configuration qui remplacera le fichier par défaut /etc/ptp4l.conf. Pour utiliser la configuration par défaut, laissez le champ vide.

    tx_timestamp_timeout

    Pour les cartes réseau de la série 800 d'Intel Columbiaville, définissez tx_timestamp_timeout sur 50.

    boundary_clock_jbod

    Pour les cartes réseau de la série 800 d'Intel Columbiaville, définissez boundary_clock_jbod sur 0.

    ptpSchedulingPolicy

    Politique d'ordonnancement des processus ptp4l et phc2sys. La valeur par défaut est SCHED_OTHER. Utilisez SCHED_FIFO sur les systèmes qui prennent en charge l'ordonnancement FIFO.

    ptpSchedulingPriority

    Valeur entière de 1 à 65 utilisée pour définir la priorité FIFO pour les processus ptp4l et phc2sys lorsque ptpSchedulingPolicy est défini sur SCHED_FIFO. Le champ ptpSchedulingPriority n'est pas utilisé lorsque ptpSchedulingPolicy est défini sur SCHED_OTHER.

    ptpClockThreshold

    Facultatif. Si ptpClockThreshold n'est pas présent, les valeurs par défaut sont utilisées pour les champs ptpClockThreshold. ptpClockThreshold configure le délai de déconnexion de l'horloge maître PTP avant le déclenchement des événements PTP. holdOverTimeout est la valeur temporelle en secondes avant que l'état de l'événement de l'horloge PTP ne passe à FREERUN lorsque l'horloge maître PTP est déconnectée. Les paramètres maxOffsetThreshold et minOffsetThreshold configurent les valeurs de décalage en nanosecondes qui se comparent aux valeurs de CLOCK_REALTIME (phc2sys) ou au décalage du maître (ptp4l). Lorsque la valeur de décalage ptp4l ou phc2sys est en dehors de cette plage, l'état de l'horloge PTP est réglé sur FREERUN. Lorsque la valeur de décalage est comprise dans cette plage, l'état de l'horloge PTP est réglé sur LOCKED.

    recommend

    Spécifier un tableau d'un ou plusieurs objets recommend qui définissent les règles d'application de profile aux nœuds.

    .recommend.profile

    Indiquez le nom de l'objet .recommend.profile défini dans la section profile.

    .recommend.priority

    Réglez .recommend.priority sur 0 pour une horloge ordinaire.

    .recommend.match

    Spécifiez les règles .recommend.match avec nodeLabel ou nodeName.

    .recommend.match.nodeLabel

    Mettez à jour nodeLabel avec le key de node.Labels à partir de l'objet nœud en utilisant la commande oc get nodes --show-labels. Par exemple : node-role.kubernetes.io/worker.

    .recommend.match.nodeLabel

    Mettez à jour nodeName avec la valeur de node.Name de l'objet nœud en utilisant la commande oc get nodes. Par exemple : compute-0.example.com.

  2. Créez le CR PtpConfig en exécutant la commande suivante :

    $ oc create -f ordinary-clock-ptp-config.yaml

Vérification

  1. Vérifiez que le profil PtpConfig est appliqué au nœud.

    1. Obtenez la liste des pods dans l'espace de noms openshift-ptp en exécutant la commande suivante :

      $ oc get pods -n openshift-ptp -o wide

      Exemple de sortie

      NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE
      linuxptp-daemon-4xkbb           1/1     Running   0          43m   10.1.196.24      compute-0.example.com
      linuxptp-daemon-tdspf           1/1     Running   0          43m   10.1.196.25      compute-1.example.com
      ptp-operator-657bbb64c8-2f8sj   1/1     Running   0          43m   10.129.0.61      control-plane-1.example.com

    2. Vérifiez que le profil est correct. Examinez les journaux du démon linuxptp qui correspond au nœud spécifié dans le profil PtpConfig. Exécutez la commande suivante :

      $ oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-container

      Exemple de sortie

      I1115 09:41:17.117596 4143292 daemon.go:107] in applyNodePTPProfile
      I1115 09:41:17.117604 4143292 daemon.go:109] updating NodePTPProfile to:
      I1115 09:41:17.117607 4143292 daemon.go:110] ------------------------------------
      I1115 09:41:17.117612 4143292 daemon.go:102] Profile Name: profile1
      I1115 09:41:17.117616 4143292 daemon.go:102] Interface: ens787f1
      I1115 09:41:17.117620 4143292 daemon.go:102] Ptp4lOpts: -2 -s
      I1115 09:41:17.117623 4143292 daemon.go:102] Phc2sysOpts: -a -r -n 24
      I1115 09:41:17.117626 4143292 daemon.go:116] ------------------------------------

Ressources supplémentaires

18.5.3. Configuration des services linuxptp en tant qu'horloge frontière

Vous pouvez configurer les services linuxptp (ptp4l, phc2sys) en tant qu'horloge frontière en créant un objet PtpConfig custom resource (CR).

Note

Utilisez l'exemple suivant PtpConfig CR comme base pour configurer les services linuxptp en tant qu'horloge frontière pour votre matériel et votre environnement particuliers. Cet exemple CR ne configure pas les événements rapides PTP. Pour configurer les événements rapides PTP, définissez les valeurs appropriées pour ptp4lOpts, ptp4lConf et ptpClockThreshold. ptpClockThreshold n'est utilisé que lorsque les événements sont activés. Voir "Configuring the PTP fast event notifications publisher" (Configuration de l'éditeur de notifications d'événements rapides PTP) pour plus d'informations.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Installer l'opérateur PTP.

Procédure

  1. Créez le CR PtpConfig suivant, puis enregistrez le YAML dans le fichier boundary-clock-ptp-config.yaml.

    Configuration recommandée de l'horloge limite PTP

    ---
    apiVersion: ptp.openshift.io/v1
    kind: PtpConfig
    metadata:
      name: boundary-clock-ptp-config
      namespace: openshift-ptp
    spec:
      profile:
      - name: boundary-clock
        phc2sysOpts: "-a -r -n 24"
        ptp4lOpts: "-2"
        ptpSchedulingPolicy: SCHED_FIFO
        ptpSchedulingPriority: 10
        ptp4lConf: |
          [<interface_1>]
          masterOnly 0
          [<interface_2>]
          masterOnly 1
          [<interface_3>]
          masterOnly 1
          [<interface_4>]
          masterOnly 1
          [global]
          #
          # Default Data Set
          #
          twoStepFlag 1
          slaveOnly 0
          priority1 128
          priority2 128
          domainNumber 24
          clockClass 248
          clockAccuracy 0xFE
          offsetScaledLogVariance 0xFFFF
          free_running 0
          freq_est_interval 1
          dscp_event 0
          dscp_general 0
          dataset_comparison G.8275.x
          G.8275.defaultDS.localPriority 128
          #
          # Port Data Set
          #
          logAnnounceInterval -3
          logSyncInterval -4
          logMinDelayReqInterval -4
          logMinPdelayReqInterval -4
          announceReceiptTimeout 3
          syncReceiptTimeout 0
          delayAsymmetry 0
          fault_reset_interval 4
          neighborPropDelayThresh 20000000
          masterOnly 0
          G.8275.portDS.localPriority 128
          #
          # Run time options
          #
          assume_two_step 0
          logging_level 6
          path_trace_enabled 0
          follow_up_info 0
          hybrid_e2e 0
          inhibit_multicast_service 0
          net_sync_monitor 0
          tc_spanning_tree 0
          tx_timestamp_timeout 50
          unicast_listen 0
          unicast_master_table 0
          unicast_req_duration 3600
          use_syslog 1
          verbose 0
          summary_interval 0
          kernel_leap 1
          check_fup_sync 0
          #
          # Servo Options
          #
          pi_proportional_const 0.0
          pi_integral_const 0.0
          pi_proportional_scale 0.0
          pi_proportional_exponent -0.3
          pi_proportional_norm_max 0.7
          pi_integral_scale 0.0
          pi_integral_exponent 0.4
          pi_integral_norm_max 0.3
          step_threshold 2.0
          first_step_threshold 0.00002
          max_frequency 900000000
          clock_servo pi
          sanity_freq_limit 200000000
          ntpshm_segment 0
          #
          # Transport options
          #
          transportSpecific 0x0
          ptp_dst_mac 01:1B:19:00:00:00
          p2p_dst_mac 01:80:C2:00:00:0E
          udp_ttl 1
          udp6_scope 0x0E
          uds_address /var/run/ptp4l
          #
          # Default interface options
          #
          clock_type BC
          network_transport L2
          delay_mechanism E2E
          time_stamping hardware
          tsproc_mode filter
          delay_filter moving_median
          delay_filter_length 10
          egressLatency 0
          ingressLatency 0
          boundary_clock_jbod 0
          #
          # Clock description
          #
          productDescription ;;
          revisionData ;;
          manufacturerIdentity 00:00:00
          userDescription ;
          timeSource 0xA0
      recommend:
      - profile: boundary-clock
        priority: 4
        match:
        - nodeLabel: node-role.kubernetes.io/master
          nodeName: <nodename>

    Tableau 18.2. Options de configuration de l'horloge boundary CR du PTP

    Champ de ressource personnaliséDescription

    name

    Le nom du CR PtpConfig.

    profile

    Spécifier un tableau d'un ou plusieurs objets profile.

    name

    Spécifiez le nom d'un objet de profil qui identifie de manière unique un objet de profil.

    ptp4lOpts

    Spécifiez les options de configuration du système pour le service ptp4l. Les options ne doivent pas inclure le nom de l'interface réseau -i <interface> et le fichier de configuration du service -f /etc/ptp4l.conf car le nom de l'interface réseau et le fichier de configuration du service sont automatiquement ajoutés.

    ptp4lConf

    Spécifiez la configuration requise pour démarrer ptp4l en tant qu'horloge périphérique. Par exemple, ens1f0 se synchronise à partir d'une horloge grand maître et ens1f3 synchronise les périphériques connectés.

    <interface_1>

    L'interface qui reçoit l'horloge de synchronisation.

    <interface_2>

    L'interface qui envoie l'horloge de synchronisation.