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
Créez un fichier YAML
Secret
qui utilise les champsaws_access_key_id
etaws_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=
Créez le secret. Par exemple :
$ oc apply -f cw-secret.yaml
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 ê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 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
ouaudit
. - 11
- Spécifiez le nom de la sortie à utiliser lors du transfert des journaux avec ce pipeline.
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
.
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
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
Utilisez la commande
ccoctl
pour créer un rôle pour AWS à l'aide de votre CRCredentialsRequest
. Avec l'objetCredentialsRequest
, cette commandeccoctl
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é/valeurrole_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
Appliquer le secret créé :
oc apply -f output/manifests/openshift-logging-<votre_nom_de_rôle>-credentials.yaml
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 ê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 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 parlogType
. -
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
ouaudit
. - 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