4.3. Configuration des applications sans serveur
4.3.1. Remplacer les configurations de déploiement du système Knative Serving
Vous pouvez remplacer les configurations par défaut pour certains déploiements spécifiques en modifiant la spécification deployments
dans les ressources personnalisées (CR) KnativeServing
.
Vous ne pouvez remplacer que les sondes définies par défaut dans le déploiement.
Tous les déploiements de Knative Serving définissent par défaut une sonde de préparation et une sonde de disponibilité, à ces exceptions près :
-
net-kourier-controller
et3scale-kourier-gateway
ne définissent qu'une sonde de préparation. -
net-istio-controller
etnet-istio-webhook
ne définissent pas de sondes.
4.3.1.1. Remplacer les configurations de déploiement du système
Actuellement, le remplacement des paramètres de configuration par défaut est possible pour les champs resources
, replicas
, labels
, annotations
et nodeSelector
, ainsi que pour les champs readiness
et liveness
pour les sondes.
Dans l'exemple suivant, une CR KnativeServing
remplace le déploiement webhook
de sorte que :
-
Le délai d'attente de la sonde
readiness
pournet-kourier-controller
est fixé à 10 secondes. - Le déploiement a spécifié des limites de ressources de CPU et de mémoire.
- Le déploiement comporte 3 répliques.
-
L'étiquette
example-label: label
est ajoutée. -
L'annotation
example-annotation: annotation
est ajoutée. -
Le champ
nodeSelector
est défini pour sélectionner les nœuds portant l'étiquettedisktype: hdd
.
Les paramètres d'étiquetage et d'annotation de KnativeServing
CR remplacent les étiquettes et les annotations du déploiement, tant pour le déploiement lui-même que pour les pods qui en résultent.
Exemple de CR KnativeServing
apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
name: ks
namespace: knative-serving
spec:
high-availability:
replicas: 2
deployments:
- name: net-kourier-controller
readinessProbes: 1
- container: controller
timeoutSeconds: 10
- name: webhook
resources:
- container: webhook
requests:
cpu: 300m
memory: 60Mi
limits:
cpu: 1000m
memory: 1000Mi
replicas: 3
labels:
example-label: label
annotations:
example-annotation: annotation
nodeSelector:
disktype: hdd
- 1
- Vous pouvez utiliser les surcharges de sonde
readiness
etliveness
pour remplacer tous les champs d'une sonde dans un conteneur d'un déploiement comme spécifié dans l'API Kubernetes, à l'exception des champs liés au gestionnaire de la sonde :exec
,grpc
,httpGet
, ettcpSocket
.
Ressources supplémentaires
4.3.2. Prise en charge de plusieurs conteneurs pour le service
Vous pouvez déployer un pod multi-conteneurs en utilisant un seul service Knative. Cette méthode est utile pour séparer les responsabilités de l'application en parties plus petites et spécialisées.
La prise en charge de plusieurs conteneurs pour Serving 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 d'un point de vue 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.
4.3.2.1. Configuration d'un service multi-conteneurs
La prise en charge de plusieurs conteneurs est activée par défaut. Vous pouvez créer un pod multi-conteneurs en spécifiant plusieurs conteneurs dans le service.
Procédure
Modifiez votre service pour inclure des conteneurs supplémentaires. Un seul conteneur peut traiter les requêtes, il faut donc spécifier
ports
pour un seul conteneur. Voici un exemple de configuration avec deux conteneurs :Configuration de plusieurs conteneurs
apiVersion: serving.knative.dev/v1 kind: Service ... spec: template: spec: containers: - name: first-container 1 image: gcr.io/knative-samples/helloworld-go ports: - containerPort: 8080 2 - name: second-container 3 image: gcr.io/knative-samples/helloworld-java
4.3.3. Volumes EmptyDir
emptyDir
les volumes emptyDir
sont des volumes vides créés lors de la création d'un pod et utilisés pour fournir un espace disque de travail temporaire. Les volumes sont supprimés lorsque le pod pour lequel ils ont été créés est supprimé.
4.3.3.1. Configuration de l'extension EmptyDir
L'extension kubernetes.podspec-volumes-emptydir
contrôle si les volumes emptyDir
peuvent être utilisés avec Knative Serving. Pour permettre l'utilisation des volumes emptyDir
, vous devez modifier la ressource personnalisée (CR) KnativeServing
pour inclure le YAML suivant :
Exemple KnativeServing CR
apiVersion: operator.knative.dev/v1beta1 kind: KnativeServing metadata: name: knative-serving spec: config: features: kubernetes.podspec-volumes-emptydir: enabled ...
4.3.4. Réclamations de volumes persistants pour la mise en service
Certaines applications sans serveur ont besoin d'un stockage permanent des données. Pour y parvenir, vous pouvez configurer des réclamations de volumes persistants (PVC) pour vos services Knative.
4.3.4.1. Activation de la prise en charge du PVC
Procédure
Pour permettre à Knative Serving d'utiliser les PVC et d'y écrire, modifiez la ressource personnalisée (CR)
KnativeServing
pour inclure le YAML suivant :Activation des PVC avec accès en écriture
... spec: config: features: "kubernetes.podspec-persistent-volume-claim": enabled "kubernetes.podspec-persistent-volume-write": enabled ...
-
L'extension
kubernetes.podspec-persistent-volume-claim
détermine si les volumes persistants (PV) peuvent être utilisés avec Knative Serving. -
L'extension
kubernetes.podspec-persistent-volume-write
détermine si les PV sont disponibles pour Knative Serving avec l'accès en écriture.
-
L'extension
Pour réclamer un PV, modifiez votre service pour inclure la configuration du PV. Par exemple, vous pouvez avoir une demande de volume persistant avec la configuration suivante :
NoteUtilisez la classe de stockage qui prend en charge le mode d'accès que vous demandez. Par exemple, vous pouvez utiliser la classe
ocs-storagecluster-cephfs
pour le mode d'accèsReadWriteMany
.Configuration de PersistentVolumeClaim
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pv-claim namespace: my-ns spec: accessModes: - ReadWriteMany storageClassName: ocs-storagecluster-cephfs resources: requests: storage: 1Gi
Dans ce cas, pour réclamer un PV avec accès en écriture, modifiez votre service comme suit :
Configuration du service Knative PVC
apiVersion: serving.knative.dev/v1 kind: Service metadata: namespace: my-ns ... spec: template: spec: containers: ... volumeMounts: 1 - mountPath: /data name: mydata readOnly: false volumes: - name: mydata persistentVolumeClaim: 2 claimName: example-pv-claim readOnly: false 3
NotePour utiliser avec succès le stockage persistant dans les services Knative, vous avez besoin d'une configuration supplémentaire, telle que les autorisations de l'utilisateur du conteneur Knative.
4.3.4.2. Ressources supplémentaires
4.3.5. Init containers
Les conteneurs d'initialisation sont des conteneurs spécialisés qui sont exécutés avant les conteneurs d'application dans un pod. Ils sont généralement utilisés pour mettre en œuvre la logique d'initialisation d'une application, ce qui peut inclure l'exécution de scripts d'installation ou le téléchargement des configurations requises. Vous pouvez activer l'utilisation de conteneurs d'initialisation pour les services Knative en modifiant la ressource personnalisée (CR) KnativeServing
.
Les conteneurs Init peuvent entraîner des temps de démarrage d'application plus longs et doivent être utilisés avec prudence pour les applications sans serveur, qui sont censées évoluer fréquemment à la hausse et à la baisse.
4.3.5.1. Activation des conteneurs init
Conditions préalables
- Vous avez installé OpenShift Serverless Operator et Knative Serving sur votre cluster.
- Vous avez des droits d'administrateur de cluster.
Procédure
Activez l'utilisation des conteneurs init en ajoutant le drapeau
kubernetes.podspec-init-containers
au CRKnativeServing
:Exemple KnativeServing CR
apiVersion: operator.knative.dev/v1beta1 kind: KnativeServing metadata: name: knative-serving spec: config: features: kubernetes.podspec-init-containers: enabled ...
4.3.6. Transformer les balises d'images en condensés
Si le contrôleur Knative Serving a accès au registre des conteneurs, Knative Serving résout les balises d'image en un condensé lorsque vous créez une révision d'un service. Ceci est connu sous le nom de tag-to-digest resolution, et permet d'assurer la cohérence des déploiements.
4.3.6.1. Résolution Tag-to-digest
Pour donner au contrôleur l'accès au registre des conteneurs sur OpenShift Container Platform, vous devez créer un secret et ensuite configurer les certificats personnalisés du contrôleur. Vous pouvez configurer les certificats personnalisés du contrôleur en modifiant la spécification controller-custom-certs
dans la ressource personnalisée (CR) KnativeServing
. Le secret doit résider dans le même espace de noms que la CR KnativeServing
.
Si un secret n'est pas inclus dans le CR KnativeServing
, ce paramètre utilise par défaut l'infrastructure à clé publique (PKI). Lors de l'utilisation de l'ICP, les certificats de l'ensemble du cluster sont automatiquement injectés dans le contrôleur Knative Serving à l'aide de la carte de configuration config-service-sa
. L'OpenShift Serverless Operator remplit la carte de configuration config-service-sa
avec les certificats de l'ensemble du cluster et monte la carte de configuration en tant que volume sur le contrôleur.
4.3.6.1.1. Configuration de la résolution tag-to-digest par l'utilisation d'un secret
Si la spécification controller-custom-certs
utilise le type Secret
, le secret est monté en tant que volume secret. Les composants Knative consomment le secret directement, en supposant que le secret possède les certificats requis.
Conditions préalables
- Vous disposez des droits d'administrateur de cluster sur OpenShift Container Platform.
- Vous avez installé OpenShift Serverless Operator et Knative Serving sur votre cluster.
Procédure
Créez un secret :
Example command
oc -n knative-serving create secret generic custom-secret --from-file=<secret_name>.crt=<path_to_certificate>
Configurez la spécification
controller-custom-certs
dans la ressource personnalisée (CR)KnativeServing
pour utiliser le typeSecret
:Exemple KnativeServing CR
apiVersion: operator.knative.dev/v1beta1 kind: KnativeServing metadata: name: knative-serving namespace: knative-serving spec: controller-custom-certs: name: custom-secret type: Secret
4.3.7. Configuration de l'authentification TLS
Vous pouvez utiliser Transport Layer Security (TLS) pour crypter le trafic Knative et pour l'authentification.
TLS est la seule méthode de cryptage du trafic prise en charge pour Knative Kafka. Red Hat recommande d'utiliser à la fois SASL et TLS pour le courtier Knative pour les ressources Apache Kafka.
Si vous souhaitez activer TLS interne avec une intégration Red Hat OpenShift Service Mesh, vous devez activer Service Mesh avec mTLS au lieu du chiffrement interne expliqué dans la procédure suivante. Voir la documentation pour l'activation des métriques Knative Serving lors de l'utilisation de Service Mesh avec mTLS.
4.3.7.1. Activation de l'authentification TLS pour le trafic interne
OpenShift Serverless prend en charge la terminaison TLS par défaut, de sorte que le trafic HTTPS des utilisateurs finaux est chiffré. Cependant, le trafic interne derrière la route OpenShift est transmis aux applications en utilisant des données en clair. En activant TLS pour le trafic interne, le trafic envoyé entre les composants est chiffré, ce qui rend ce trafic plus sûr.
Si vous souhaitez activer TLS interne avec une intégration Red Hat OpenShift Service Mesh, vous devez activer Service Mesh avec mTLS au lieu du chiffrement interne expliqué dans la procédure suivante.
La prise en charge du cryptage TLS interne 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
- Vous avez installé OpenShift Serverless Operator et Knative Serving.
-
Vous avez installé le CLI OpenShift (
oc
).
Procédure
Créer un service Knative qui inclut le champ
internal-encryption: "true"
dans la spécification :... spec: config: network: internal-encryption: "true" ...
Redémarrez les pods activateurs dans l'espace de noms
knative-serving
pour charger les certificats :$ oc delete pod -n knative-serving --selector app=activator
4.3.8. Politiques de réseau restrictives
4.3.8.1. Clusters avec des politiques de réseau restrictives
Si vous utilisez un cluster auquel plusieurs utilisateurs ont accès, votre cluster peut utiliser des stratégies de réseau pour contrôler quels pods, services et espaces de noms peuvent communiquer les uns avec les autres sur le réseau. Si votre cluster utilise des stratégies de réseau restrictives, il est possible que les pods du système Knative ne puissent pas accéder à votre application Knative. Par exemple, si votre espace de noms a la politique de réseau suivante, qui refuse toutes les demandes, les pods du système Knative ne peuvent pas accéder à votre application Knative :
Exemple d'objet NetworkPolicy qui refuse toutes les demandes d'accès à l'espace de noms
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default namespace: example-namespace spec: podSelector: ingress: []
4.3.8.2. Permettre la communication avec les applications Knative sur un cluster avec des politiques de réseau restrictives
Pour permettre l'accès à vos applications à partir des pods du système Knative, vous devez ajouter un label à chacun des espaces de noms du système Knative, puis créer un objet NetworkPolicy
dans l'espace de noms de votre application qui autorise l'accès à l'espace de noms pour d'autres espaces de noms qui ont ce label.
Une politique de réseau qui refuse les demandes de services non Knative sur votre cluster empêche toujours l'accès à ces services. Cependant, en autorisant l'accès à votre application Knative à partir des espaces de noms du système Knative, vous autorisez l'accès à votre application Knative à partir de tous les espaces de noms du cluster.
Si vous ne souhaitez pas autoriser l'accès à votre application Knative à partir de tous les espaces de noms du cluster, vous pouvez utiliser JSON Web Token authentication for Knative services à la place. L'authentification par jeton Web JSON pour les services Knative nécessite Service Mesh.
Conditions préalables
-
Installez le CLI OpenShift (
oc
). - OpenShift Serverless Operator et Knative Serving sont installés sur votre cluster.
Procédure
Ajoutez l'étiquette
knative.openshift.io/system-namespace=true
à chaque espace de noms du système Knative qui nécessite un accès à votre application :Étiqueter l'espace de noms
knative-serving
:$ oc label namespace knative-serving knative.openshift.io/system-namespace=true
Étiqueter l'espace de noms
knative-serving-ingress
:$ oc label namespace knative-serving-ingress knative.openshift.io/system-namespace=true
Étiqueter l'espace de noms
knative-eventing
:$ oc label namespace knative-eventing knative.openshift.io/system-namespace=true
Étiqueter l'espace de noms
knative-kafka
:$ oc label namespace knative-kafka knative.openshift.io/system-namespace=true
Créez un objet
NetworkPolicy
dans l'espace de noms de votre application afin d'autoriser l'accès à partir des espaces de noms portant l'étiquetteknative.openshift.io/system-namespace
:Exemple d'objet
NetworkPolicy
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: <network_policy_name> 1 namespace: <namespace> 2 spec: ingress: - from: - namespaceSelector: matchLabels: knative.openshift.io/system-namespace: "true" podSelector: {} policyTypes: - Ingress