10.13. Transférer les journaux à Loki
Vous pouvez transmettre les journaux à un système de journalisation externe Loki en plus ou à la place de l'instance Elasticsearch interne par défaut d'OpenShift Container Platform.
Pour configurer la transmission des journaux à Loki, vous devez créer une ressource personnalisée (CR) ClusterLogForwarder
avec une sortie vers Loki et un pipeline qui utilise la sortie. La sortie vers Loki peut utiliser la connexion HTTP (non sécurisée) ou HTTPS (HTTP sécurisée).
Conditions préalables
-
Un système de journalisation Loki doit fonctionner à l'URL spécifiée dans le champ
url
du CR.
Procédure
Créez ou modifiez un fichier YAML qui définit l'objet
ClusterLogForwarder
CR :apiVersion: "logging.openshift.io/v1" kind: ClusterLogForwarder metadata: name: instance 1 namespace: openshift-logging 2 spec: outputs: - name: loki-insecure 3 type: "loki" 4 url: http://loki.insecure.com:3100 5 loki: tenantKey: kubernetes.namespace_name labelKeys: kubernetes.labels.foo - name: loki-secure 6 type: "loki" url: https://loki.secure.com:3100 secret: name: loki-secret 7 loki: tenantKey: kubernetes.namespace_name 8 labelKeys: kubernetes.labels.foo 9 pipelines: - name: application-logs 10 inputRefs: 11 - application - audit outputRefs: 12 - loki-secure
- 1
- Le nom du CR
ClusterLogForwarder
doit êtreinstance
. - 2
- L'espace de noms pour le CR
ClusterLogForwarder
doit êtreopenshift-logging
. - 3
- Spécifiez un nom pour la sortie.
- 4
- Spécifiez le type comme
"loki"
. - 5
- Spécifiez l'URL et le port du système Loki sous la forme d'une URL absolue valide. Vous pouvez utiliser le protocole
http
(non sécurisé) ouhttps
(HTTP sécurisé). Si le proxy à l'échelle du cluster utilisant l'annotation CIDR est activé, la sortie doit être un nom de serveur ou un FQDN, et non une adresse IP. Le port par défaut de Loki pour la communication HTTP(S) est 3100. - 6
- Pour une connexion sécurisée, vous pouvez spécifier une URL
https
ouhttp
que vous authentifiez en spécifiant unsecret
. - 7
- Pour un préfixe
https
, indiquez le nom du secret requis par le point d'extrémité pour la communication TLS. Le secret doit exister dans le projetopenshift-logging
et doit avoir des clés de : tls.crt, tls.key, et ca-bundle.crt qui pointent vers les certificats respectifs qu'elles représentent. Sinon, pour les préfixeshttp
ethttps
, vous pouvez spécifier un secret contenant un nom d'utilisateur et un mot de passe. Pour plus d'informations, voir l'exemple suivant : "Exemple : Définition d'un secret contenant un nom d'utilisateur et un mot de passe.\N-" - 8
- Facultatif : Spécifiez un champ clé de métadonnées pour générer des valeurs pour le champ
TenantID
dans Loki. Par exemple, le paramètretenantKey: kubernetes.namespace_name
utilise les noms des espaces de noms Kubernetes comme valeurs pour les identifiants de locataire dans Loki. Pour connaître les autres champs d'enregistrement que vous pouvez spécifier, voir le lien "Champs d'enregistrement" dans la section suivante "Ressources supplémentaires". - 9
- Facultatif : Spécifiez une liste de clés de champs de métadonnées pour remplacer les étiquettes Loki par défaut. Les noms des étiquettes Loki doivent correspondre à l'expression régulière
[a-zA-Z_:][a-zA-Z0-9_:]*
. Les caractères illégaux dans les clés de métadonnées sont remplacés par_
pour former le nom de l'étiquette. Par exemple, la clé de métadonnéeskubernetes.labels.foo
devient l'étiquette Lokikubernetes_labels_foo
. Si vous ne définissez paslabelKeys
, la valeur par défaut est :[log_type, kubernetes.namespace_name, kubernetes.pod_name, kubernetes_host]
. Veillez à ce que l'ensemble des étiquettes soit restreint, car Loki limite la taille et le nombre d'étiquettes autorisées. Voir Configuration de Loki, limits_config. Vous pouvez toujours effectuer des requêtes basées sur n'importe quel champ de l'enregistrement à l'aide de filtres de requête. - 10
- Facultatif : Spécifiez un nom pour le pipeline.
- 11
- Spécifiez les types de journaux à transférer en utilisant le pipeline :
application,
infrastructure
ouaudit
. - 12
- Spécifiez le nom de la sortie à utiliser lors du transfert des journaux avec ce pipeline.
NoteComme Loki exige que les flux de journaux soient correctement classés par date,
labelKeys
inclut toujours le jeu d'étiquetteskubernetes_host
, même si vous ne le spécifiez pas. Cette inclusion garantit que chaque flux provient d'un seul hôte, ce qui empêche les horodatages d'être désordonnés en raison des différences d'horloge sur les différents hôtes.Créer l'objet CR :
oc create -f <nom-de-fichier>.yaml
10.13.1. Dépannage des erreurs de Loki "entry out of order" (entrée en dehors de l'ordre)
Si votre Fluentd transmet un grand bloc de messages à un système de journalisation Loki qui dépasse la limite de débit, Loki génère des erreurs "entry out of order". Pour résoudre ce problème, vous devez mettre à jour certaines valeurs dans le fichier de configuration du serveur Loki, loki.yaml
.
loki.yaml
n'est pas disponible sur les serveurs Loki hébergés par Grafana. Cette rubrique ne s'applique pas aux serveurs Loki hébergés par Grafana.
Conditions
-
La ressource personnalisée
ClusterLogForwarder
est configurée pour transmettre les journaux à Loki. Votre système envoie à Loki un bloc de messages d'une taille supérieure à 2 Mo, par exemple :
"values":[["1630410392689800468","{\"kind\":\"Event\",\"apiVersion\":\ ....... ...... ...... ...... \"received_at\":\"2021-08-31T11:46:32.800278+00:00\",\"version\":\"1.7.4 1.6.0\"}},\"@timestamp\":\"2021-08-31T11:46:32.799692+00:00\",\"viaq_index_name\":\"audit-write\",\"viaq_msg_id\":\"MzFjYjJkZjItNjY0MC00YWU4LWIwMTEtNGNmM2E5ZmViMGU4\",\"log_type\":\"audit\"}"]]}]}
Lorsque vous entrez
oc logs -c fluentd
, les journaux Fluentd dans votre cluster OpenShift Logging affichent les messages suivants :429 Too Many Requests Ingestion rate limit exceeded (limit: 8388608 bytes/sec) while attempting to ingest '2140' lines totaling '3285284' bytes 429 Too Many Requests Ingestion rate limit exceeded' or '500 Internal Server Error rpc error: code = ResourceExhausted desc = grpc: received message larger than max (5277702 vs. 4194304)'
Lorsque vous ouvrez les journaux sur le serveur Loki, ils affichent des messages
entry out of order
comme ceux-ci :,\nentry with timestamp 2021-08-18 05:58:55.061936 +0000 UTC ignored, reason: 'entry out of order' for stream: {fluentd_thread=\"flush_thread_0\", log_type=\"audit\"},\nentry with timestamp 2021-08-18 06:01:18.290229 +0000 UTC ignored, reason: 'entry out of order' for stream: {fluentd_thread="flush_thread_0", log_type="audit"}
Procédure
Mettez à jour les champs suivants dans le fichier de configuration
loki.yaml
sur le serveur Loki avec les valeurs indiquées ici :-
grpc_server_max_recv_msg_size: 8388608
-
chunk_target_size: 8388608
-
ingestion_rate_mb: 8
-
ingestion_burst_size_mb: 16
-
-
Appliquez les changements dans
loki.yaml
au serveur Loki.
Exemple de fichier loki.yaml
auth_enabled: false server: http_listen_port: 3100 grpc_listen_port: 9096 grpc_server_max_recv_msg_size: 8388608 ingester: wal: enabled: true dir: /tmp/wal lifecycler: address: 127.0.0.1 ring: kvstore: store: inmemory replication_factor: 1 final_sleep: 0s chunk_idle_period: 1h # Any chunk not receiving new logs in this time will be flushed chunk_target_size: 8388608 max_chunk_age: 1h # All chunks will be flushed when they hit this age, default is 1h chunk_retain_period: 30s # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m) max_transfer_retries: 0 # Chunk transfers disabled schema_config: configs: - from: 2020-10-24 store: boltdb-shipper object_store: filesystem schema: v11 index: prefix: index_ period: 24h storage_config: boltdb_shipper: active_index_directory: /tmp/loki/boltdb-shipper-active cache_location: /tmp/loki/boltdb-shipper-cache cache_ttl: 24h # Can be increased for faster performance over longer query periods, uses more disk space shared_store: filesystem filesystem: directory: /tmp/loki/chunks compactor: working_directory: /tmp/loki/boltdb-shipper-compactor shared_store: filesystem limits_config: reject_old_samples: true reject_old_samples_max_age: 12h ingestion_rate_mb: 8 ingestion_burst_size_mb: 16 chunk_store_config: max_look_back_period: 0s table_manager: retention_deletes_enabled: false retention_period: 0s ruler: storage: type: local local: directory: /tmp/loki/rules rule_path: /tmp/loki/rules-temp alertmanager_url: http://localhost:9093 ring: kvstore: store: inmemory enable_api: true
Ressources complémentaires
Ressources complémentaires