10.12. Transférer les journaux vers Amazon CloudWatch


Vous pouvez transmettre les journaux à Amazon CloudWatch, un service de surveillance et de stockage de journaux hébergé par Amazon Web Services (AWS). Vous pouvez transmettre les journaux à CloudWatch en plus ou à la place du magasin de journaux par défaut.

Pour configurer la transmission des journaux à CloudWatch, vous devez créer une ressource personnalisée (CR) ClusterLogForwarder avec une sortie pour CloudWatch et un pipeline qui utilise la sortie.

Procédure

  1. Créez un fichier YAML Secret qui utilise les champs aws_access_key_id et aws_secret_access_key pour spécifier vos informations d'identification AWS encodées en base64. Par exemple :

    apiVersion: v1
    kind: Secret
    metadata:
      name: cw-secret
      namespace: openshift-logging
    data:
      aws_access_key_id: QUtJQUlPU0ZPRE5ON0VYQU1QTEUK
      aws_secret_access_key: d0phbHJYVXRuRkVNSS9LN01ERU5HL2JQeFJmaUNZRVhBTVBMRUtFWQo=
  2. Créez le secret. Par exemple :

    $ oc apply -f cw-secret.yaml
  3. Créez ou modifiez un fichier YAML qui définit l'objet ClusterLogForwarder CR. Dans le fichier, indiquez le nom du secret. Par exemple :

    apiVersion: "logging.openshift.io/v1"
    kind: ClusterLogForwarder
    metadata:
      name: instance 1
      namespace: openshift-logging 2
    spec:
      outputs:
       - name: cw 3
         type: cloudwatch 4
         cloudwatch:
           groupBy: logType 5
           groupPrefix: <group prefix> 6
           region: us-east-2 7
         secret:
            name: cw-secret 8
      pipelines:
        - name: infra-logs 9
          inputRefs: 10
            - infrastructure
            - audit
            - application
          outputRefs:
            - cw 11
    1
    Le nom du CR ClusterLogForwarder doit être instance.
    2
    L'espace de noms pour le CR ClusterLogForwarder doit être openshift-logging.
    3
    Spécifiez un nom pour la sortie.
    4
    Spécifiez le type de cloudwatch.
    5
    Facultatif : Indiquez comment regrouper les journaux :
    • logType crée des groupes de journaux pour chaque type de journal
    • namespaceName crée un groupe de journaux pour chaque espace de noms d'applications. Il crée également des groupes de journaux distincts pour les journaux d'infrastructure et d'audit.
    • namespaceUUID crée un nouveau groupe de journaux pour chaque UUID d'espace de noms d'applications. Il crée également des groupes de journaux distincts pour les journaux d'infrastructure et d'audit.
    6
    Facultatif : Spécifiez une chaîne de caractères pour remplacer le préfixe par défaut infrastructureName dans les noms des groupes de journaux.
    7
    Spécifiez la région AWS.
    8
    Indiquez le nom du secret qui contient vos informations d'identification AWS.
    9
    Facultatif : Spécifiez un nom pour le pipeline.
    10
    Spécifiez les types de journaux à transférer en utilisant le pipeline : application, infrastructure ou audit.
    11
    Spécifiez le nom de la sortie à utiliser lors du transfert des journaux avec ce pipeline.
  4. Créer l'objet CR :

    oc create -f <nom-de-fichier>.yaml

Exemple : Utilisation de ClusterLogForwarder avec Amazon CloudWatch

Vous voyez ici un exemple de ressource personnalisée (CR) ClusterLogForwarder et les données de journal qu'elle envoie à Amazon CloudWatch.

Supposons que vous exécutiez un cluster OpenShift Container Platform nommé mycluster. La commande suivante renvoie l'adresse infrastructureName du cluster, que vous utiliserez pour composer des commandes aws par la suite :

$ oc get Infrastructure/cluster -ojson | jq .status.infrastructureName
"mycluster-7977k"

Pour générer les données de journalisation de cet exemple, vous exécutez un module busybox dans un espace de noms appelé app. Le module busybox écrit un message sur la sortie standard (stdout) toutes les trois secondes :

$ oc run busybox --image=busybox -- sh -c 'while true; do echo "My life is my message"; sleep 3; done'
$ oc logs -f busybox
My life is my message
My life is my message
My life is my message
...

Vous pouvez consulter l'UUID de l'espace de noms app dans lequel s'exécute le pod busybox:

$ oc get ns/app -ojson | jq .metadata.uid
"794e1e1a-b9f5-4958-a190-e76a9b53d7bf"

Dans votre ressource personnalisée (CR) ClusterLogForwarder, vous configurez les types de journaux infrastructure, audit et application en tant qu'entrées du pipeline all-logs. Vous connectez également ce pipeline à la sortie cw, qui transmet les journaux à une instance CloudWatch dans la région us-east-2:

apiVersion: "logging.openshift.io/v1"
kind: ClusterLogForwarder
metadata:
  name: instance
  namespace: openshift-logging
spec:
  outputs:
   - name: cw
     type: cloudwatch
     cloudwatch:
       groupBy: logType
       region: us-east-2
     secret:
        name: cw-secret
  pipelines:
    - name: all-logs
      inputRefs:
        - infrastructure
        - audit
        - application
      outputRefs:
        - cw

Chaque région dans CloudWatch contient trois niveaux d'objets :

  • groupe de logs

    • flux de données

      • événement de journal

Avec groupBy: logType dans le CR ClusterLogForwarding, les trois types de journaux dans inputRefs produisent trois groupes de journaux dans Amazon Cloudwatch :

$ aws --output json logs describe-log-groups | jq .logGroups[].logGroupName
"mycluster-7977k.application"
"mycluster-7977k.audit"
"mycluster-7977k.infrastructure"

Chaque groupe de journaux contient des flux de journaux :

$ aws --output json logs describe-log-streams --log-group-name mycluster-7977k.application | jq .logStreams[].logStreamName
"kubernetes.var.log.containers.busybox_app_busybox-da085893053e20beddd6747acdbaf98e77c37718f85a7f6a4facf09ca195ad76.log"
$ aws --output json logs describe-log-streams --log-group-name mycluster-7977k.audit | jq .logStreams[].logStreamName
"ip-10-0-131-228.us-east-2.compute.internal.k8s-audit.log"
"ip-10-0-131-228.us-east-2.compute.internal.linux-audit.log"
"ip-10-0-131-228.us-east-2.compute.internal.openshift-audit.log"
...
$ aws --output json logs describe-log-streams --log-group-name mycluster-7977k.infrastructure | jq .logStreams[].logStreamName
"ip-10-0-131-228.us-east-2.compute.internal.kubernetes.var.log.containers.apiserver-69f9fd9b58-zqzw5_openshift-oauth-apiserver_oauth-apiserver-453c5c4ee026fe20a6139ba6b1cdd1bed25989c905bf5ac5ca211b7cbb5c3d7b.log"
"ip-10-0-131-228.us-east-2.compute.internal.kubernetes.var.log.containers.apiserver-797774f7c5-lftrx_openshift-apiserver_openshift-apiserver-ce51532df7d4e4d5f21c4f4be05f6575b93196336be0027067fd7d93d70f66a4.log"
"ip-10-0-131-228.us-east-2.compute.internal.kubernetes.var.log.containers.apiserver-797774f7c5-lftrx_openshift-apiserver_openshift-apiserver-check-endpoints-82a9096b5931b5c3b1d6dc4b66113252da4a6472c9fff48623baee761911a9ef.log"
...

Chaque flux de journaux contient des événements de journaux. Pour voir un événement du Pod busybox, vous devez spécifier son flux de journaux dans le groupe de journaux application:

$ aws logs get-log-events --log-group-name mycluster-7977k.application --log-stream-name kubernetes.var.log.containers.busybox_app_busybox-da085893053e20beddd6747acdbaf98e77c37718f85a7f6a4facf09ca195ad76.log
{
    "events": [
        {
            "timestamp": 1629422704178,
            "message": "{\"docker\":{\"container_id\":\"da085893053e20beddd6747acdbaf98e77c37718f85a7f6a4facf09ca195ad76\"},\"kubernetes\":{\"container_name\":\"busybox\",\"namespace_name\":\"app\",\"pod_name\":\"busybox\",\"container_image\":\"docker.io/library/busybox:latest\",\"container_image_id\":\"docker.io/library/busybox@sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60\",\"pod_id\":\"870be234-90a3-4258-b73f-4f4d6e2777c7\",\"host\":\"ip-10-0-216-3.us-east-2.compute.internal\",\"labels\":{\"run\":\"busybox\"},\"master_url\":\"https://kubernetes.default.svc\",\"namespace_id\":\"794e1e1a-b9f5-4958-a190-e76a9b53d7bf\",\"namespace_labels\":{\"kubernetes_io/metadata_name\":\"app\"}},\"message\":\"My life is my message\",\"level\":\"unknown\",\"hostname\":\"ip-10-0-216-3.us-east-2.compute.internal\",\"pipeline_metadata\":{\"collector\":{\"ipaddr4\":\"10.0.216.3\",\"inputname\":\"fluent-plugin-systemd\",\"name\":\"fluentd\",\"received_at\":\"2021-08-20T01:25:08.085760+00:00\",\"version\":\"1.7.4 1.6.0\"}},\"@timestamp\":\"2021-08-20T01:25:04.178986+00:00\",\"viaq_index_name\":\"app-write\",\"viaq_msg_id\":\"NWRjZmUyMWQtZjgzNC00MjI4LTk3MjMtNTk3NmY3ZjU4NDk1\",\"log_type\":\"application\",\"time\":\"2021-08-20T01:25:04+00:00\"}",
            "ingestionTime": 1629422744016
        },
...

Exemple : Personnalisation du préfixe dans les noms de groupes de journaux

Dans les noms de groupes de journaux, vous pouvez remplacer le préfixe par défaut infrastructureName, mycluster-7977k, par une chaîne arbitraire telle que demo-group-prefix. Pour ce faire, vous devez mettre à jour le champ groupPrefix dans le CR ClusterLogForwarding:

cloudwatch:
    groupBy: logType
    groupPrefix: demo-group-prefix
    region: us-east-2

La valeur de groupPrefix remplace le préfixe par défaut infrastructureName:

$ aws --output json logs describe-log-groups | jq .logGroups[].logGroupName
"demo-group-prefix.application"
"demo-group-prefix.audit"
"demo-group-prefix.infrastructure"

Exemple : Nommer les groupes de journaux d'après les noms des espaces de noms des applications

Pour chaque espace de noms d'applications dans votre cluster, vous pouvez créer un groupe de logs dans CloudWatch dont le nom est basé sur le nom de l'espace de noms d'applications.

Si vous supprimez un objet d'espace de noms d'application et en créez un nouveau qui porte le même nom, CloudWatch continue d'utiliser le même groupe de journaux qu'auparavant.

Si vous considérez que des objets successifs de l'espace de noms d'applications qui portent le même nom sont équivalents, utilisez l'approche décrite dans cet exemple. Dans le cas contraire, si vous devez distinguer les groupes de journaux résultants les uns des autres, reportez-vous plutôt à la section suivante "Nommer les groupes de journaux pour les UUID de l'espace de noms d'application".

Pour créer des groupes de journaux d'application dont les noms sont basés sur les noms des espaces de noms d'application, vous définissez la valeur du champ groupBy sur namespaceName dans le CR ClusterLogForwarder:

cloudwatch:
    groupBy: namespaceName
    region: us-east-2

Le réglage de groupBy à namespaceName n'affecte que le groupe d'enregistrement de l'application. Il n'affecte pas les groupes de journaux audit et infrastructure.

Dans Amazon Cloudwatch, le nom de l'espace de noms apparaît à la fin de chaque nom de groupe de journaux. Comme il n'existe qu'un seul espace de noms d'application, \N "app", la sortie suivante montre un nouveau groupe de journaux mycluster-7977k.app au lieu de mycluster-7977k.application:

$ aws --output json logs describe-log-groups | jq .logGroups[].logGroupName
"mycluster-7977k.app"
"mycluster-7977k.audit"
"mycluster-7977k.infrastructure"

Si le cluster de cet exemple avait contenu plusieurs espaces de noms d'applications, la sortie montrerait plusieurs groupes de journaux, un pour chaque espace de noms.

Le champ groupBy n'affecte que le groupe de journaux d'application. Il n'affecte pas les groupes de journaux audit et infrastructure.

Exemple : Nommer les groupes de journaux d'après les UUID de l'espace de noms de l'application

Pour chaque espace de noms d'applications dans votre cluster, vous pouvez créer un groupe de logs dans CloudWatch dont le nom est basé sur l'UUID de l'espace de noms d'applications.

Si vous supprimez un objet d'espace de noms d'application et en créez un nouveau, CloudWatch crée un nouveau groupe de journaux.

Si vous considérez que des objets successifs de l'espace de noms de l'application portant le même nom sont différents les uns des autres, utilisez l'approche décrite dans cet exemple. Sinon, consultez la section précédente "Exemple : Nommer les groupes de journaux pour les espaces de noms d'applications".

Pour nommer les groupes de journaux d'après les UUID de l'espace de noms de l'application, vous définissez la valeur du champ groupBy sur namespaceUUID dans le CR ClusterLogForwarder:

cloudwatch:
    groupBy: namespaceUUID
    region: us-east-2

Dans Amazon Cloudwatch, l'UUID de l'espace de noms apparaît à la fin de chaque nom de groupe de journaux. Étant donné qu'il n'existe qu'un seul espace de noms d'application, "app", la sortie suivante montre un nouveau groupe de journaux mycluster-7977k.794e1e1a-b9f5-4958-a190-e76a9b53d7bf au lieu de mycluster-7977k.application:

$ aws --output json logs describe-log-groups | jq .logGroups[].logGroupName
"mycluster-7977k.794e1e1a-b9f5-4958-a190-e76a9b53d7bf" // uid of the "app" namespace
"mycluster-7977k.audit"
"mycluster-7977k.infrastructure"

Le champ groupBy n'affecte que le groupe de journaux d'application. Il n'affecte pas les groupes de journaux audit et infrastructure.

10.12.1. Transférer les journaux vers Amazon CloudWatch à partir de clusters compatibles avec STS

Pour les clusters avec AWS Security Token Service (STS) activé, vous pouvez créer un compte de service AWS manuellement ou créer une demande d'informations d'identification à l'aide de l'utilitaire Cloud Credential Operator (CCO) ccoctl.

Note

Cette fonction n'est pas prise en charge par le collecteur de vecteurs.

Conditions préalables

  • Sous-système de journalisation pour Red Hat OpenShift : 5.5 et versions ultérieures

Procédure

  1. Créez une ressource personnalisée YAML pour CredentialsRequest en utilisant le modèle ci-dessous :

    Modèle de demande d'informations d'identification CloudWatch

    apiVersion: cloudcredential.openshift.io/v1
    kind: CredentialsRequest
    metadata:
      name: <your_role_name>-credrequest
      namespace: openshift-cloud-credential-operator
    spec:
      providerSpec:
        apiVersion: cloudcredential.openshift.io/v1
        kind: AWSProviderSpec
        statementEntries:
          - action:
              - logs:PutLogEvents
              - logs:CreateLogGroup
              - logs:PutRetentionPolicy
              - logs:CreateLogStream
              - logs:DescribeLogGroups
              - logs:DescribeLogStreams
            effect: Allow
            resource: arn:aws:logs:*:*:*
      secretRef:
        name: <your_role_name>
        namespace: openshift-logging
      serviceAccountNames:
        - logcollector

  2. Utilisez la commande ccoctl pour créer un rôle pour AWS à l'aide de votre CR CredentialsRequest. Avec l'objet CredentialsRequest, cette commande ccoctl crée un rôle IAM avec une politique de confiance liée au fournisseur d'identité OIDC spécifié et une politique de permissions qui accorde des permissions pour effectuer des opérations sur les ressources CloudWatch. Cette commande crée également un fichier de configuration YAML dans /<path_to_ccoctl_output_dir>/manifests/openshift-logging-<your_role_name>-credentials.yaml. Ce fichier secret contient la clé/valeur role_arn utilisée lors de l'authentification avec le fournisseur d'identité AWS IAM.

    $ ccoctl aws create-iam-roles \
    --name=<name> \
    --region=<aws_region> \
    --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests \
    --identity-provider-arn=arn:aws:iam::<aws_account_id>:oidc-provider/<name>-oidc.s3.<aws_region>.amazonaws.com 1
    1
    <name> est le nom utilisé pour marquer vos ressources cloud et doit correspondre au nom utilisé lors de l'installation de votre cluster STS
  3. Appliquer le secret créé :

    oc apply -f output/manifests/openshift-logging-<votre_nom_de_rôle>-credentials.yaml
  4. Créer ou modifier une ressource personnalisée ClusterLogForwarder:

    apiVersion: "logging.openshift.io/v1"
    kind: ClusterLogForwarder
    metadata:
      name: instance 1
      namespace: openshift-logging 2
    spec:
      outputs:
       - name: cw 3
         type: cloudwatch 4
         cloudwatch:
           groupBy: logType 5
           groupPrefix: <group prefix> 6
           region: us-east-2 7
         secret:
            name: <your_role_name> 8
      pipelines:
        - name: to-cloudwatch 9
          inputRefs: 10
            - infrastructure
            - audit
            - application
          outputRefs:
            - cw 11
    1
    Le nom du CR ClusterLogForwarder doit être instance.
    2
    L'espace de noms pour le CR ClusterLogForwarder doit être openshift-logging.
    3
    Spécifiez un nom pour la sortie.
    4
    Spécifiez le type de cloudwatch.
    5
    Facultatif : Indiquez comment regrouper les journaux :
    • logType crée des groupes de journaux pour chaque type de journal
    • namespaceName crée un groupe de journaux pour chaque espace de noms d'applications. Les journaux d'infrastructure et d'audit ne sont pas affectés et restent regroupés par logType.
    • namespaceUUID crée un nouveau groupe de journaux pour chaque UUID d'espace de noms d'applications. Il crée également des groupes de journaux distincts pour les journaux d'infrastructure et d'audit.
    6
    Facultatif : Spécifiez une chaîne de caractères pour remplacer le préfixe par défaut infrastructureName dans les noms des groupes de journaux.
    7
    Spécifiez la région AWS.
    8
    Indiquez le nom du secret qui contient vos informations d'identification AWS.
    9
    Facultatif : Spécifiez un nom pour le pipeline.
    10
    Spécifiez les types de journaux à transférer en utilisant le pipeline : application, infrastructure ou audit.
    11
    Spécifiez le nom de la sortie à utiliser lors du transfert des journaux avec ce pipeline.

Ressources complémentaires

10.12.1.1. Création d'un secret pour AWS CloudWatch avec un rôle AWS existant

Si vous avez un rôle existant pour AWS, vous pouvez créer un secret pour AWS avec STS à l'aide de la commande oc create secret --from-literal.

Procédure

  • Dans l'interface de commande, entrez la commande suivante pour générer un secret pour AWS :

    $ oc create secret generic cw-sts-secret -n openshift-logging --from-literal=role_arn=arn:aws:iam::123456789012:role/my-role_with-permissions

    Exemple Secret

    apiVersion: v1
    kind: Secret
    metadata:
      namespace: openshift-logging
      name: my-secret-name
    stringData:
      role_arn: arn:aws:iam::123456789012:role/my-role_with-permissions

Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.