《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在 OpenShift 4.15 + Loki Operator 5.9.3 + OpenShift Logging Operator 5.8.8 以及 OpenShift 4.18 + Loki Operator 6.1.0 + OpenShift Logging Operator 6.1.0 环境中验证。
文章目录
OpenShift 基于 Loki 的日志架构
在 OpenShift 4.10 以后开始逐步用基于 Vector+Loki 的日志架构替换原有基于 EFK 的日志架构。之所以用 Loki 替换 EFK 主要是因为 Loki 有更加轻量级的运行环境。这是因为在 EFK 架构中 Elasticsearch 会对传入的日志记录进行完全索引,而 Loki 只对一些固定的标签进行索引,并将更复杂的解析工作推迟到日志被存储之后,因此 Loki 不但占用空间更小,而且还可以更快速地收集日志。
OpenShift 基于 Loki 的日志架构主要使用了 2 个组件:Vector 和 Loki。其中 Vector 用来收集日志,Loki 作为存储日志,另外访问日志页面也直接集成到了 OpenShift 控制台中。需要注意的是 Loki 必须使用对象存储来保存日志。
安装配置基于 Loki 的日志环境
安装 Operator
- 使用默认配置安装 OpenShift Logging Operator,该 Operator 将会安装在 openshift-logging 命名空间中。
- 使用默认配置安装 Loki Operator,该 Operator 将会安装在 openshift-operators-redhat 命名空间中。
- 如果用的是 OpenShift Logging Operator 6.1.0,还可以使用默认配置安装 Cluster Observability Operator 0.4.1 (可以将日志界面嵌入到 OpenShift Console 中),该 Operator 将会安装在 openshift-operators 命名空间中。
配置对象存储
可以使用以下任一种 S3 对象存储作为 Loki 的存储。
使用 MinIO 对象存储
- 参考《OpenShift 4 - 基于 MinIO 安装 Red Hat Quay 镜像仓库》一文的 “安装 MinIO” 一节安装 MinIO 环境,然后创建名为 loki-logging 的 bucket 和 user (用户名和密码为 loki/openshift4,权限为 readwrite)。
- 创建访问 loki 存储桶的 Secret。
$ oc apply -f - << EOF
apiVersion: v1
kind: Secret
metadata:
name: lokistack-dev-s3
namespace: openshift-logging
stringData:
access_key_id: loki
access_key_secret: openshift4
bucketnames: loki-logging
endpoint: http://minio-svc.minio-dev.svc:9000
insecure: "true"
EOF
使用 AWS 对象存储
- 执行命令创建访问 AWS 的凭证文件,其中我们会用到 us-east-1 区的 AWS S3 服务。
$ aws configure
AWS Access Key ID [None]: AKIAVROBYTZYQBBNWLF6
AWS Secret Access Key [None]: 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
Default region name [None]: us-east-1
Default output format [None]: json
$ cat .aws/credentials
[default]
aws_access_key_id = AKIAVROBYTZYQBBNWLF6
aws_secret_access_key = 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
- 在 AWS 上创建 S3 存储的 bucket。
$ GUID=`hostname | cut -d. -f2`
$ aws --profile default s3api create-bucket --bucket $GUID --region us-east-1 --create-bucket-configuration LocationConstraint=us-east-1
{
"Location": "/j68pw"
}
- 基于以下 YAML 创建访问 AWS bucket 的 Secret 对象。
apiVersion: v1
kind: Secret
metadata:
name: lokistack-dev-s3
namespace: openshift-logging
stringData:
access_key_id: w3EDfSERUiLSAEXAMPLE (Replace with your aws creds)
access_key_secret: mshdyShDTYKWEywajsqpshdNSUWJDA+1+REXAMPLE (Replace with your aws creds)
bucketnames: j68pw (we called it j68pw in our example)
endpoint: https://s3.us-east-1.amazonaws.com/
region: us-east-1
配置基于 Loki 的 OpenShift Logging (Loki Operator 5.9.3 + OpenShift Logging Operator 5.8.8)
- 在 Loki Operator 中根据以下 2 个截图创建一个 LokiStack 对象。
以下 Storage Class Name 为可提供 RWO 存储的存储类即可。
上述配置过程会生成以下 YAML,其中 gp2-csi 是 OpenShift 中已有的 StorageClass。
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
name: loki-logging
namespace: openshift-logging
spec:
size: 1x.extra-small
storage:
schemas:
- version: v13
effectiveDate: "2023-10-15"
secret:
name: lokistack-dev-s3
type: s3
storageClassName: gp2-csi
managementState: Managed
hashRing:
type: memberlist
tenants:
mode: openshift-logging
- 基于以下 YAML 创建一个基于 lokistack 存储和 vector 收集器的 ClusterLogging 对象。
apiVersion: logging.openshift.io/v1
kind: ClusterLogging
metadata:
name: instance
namespace: openshift-logging
spec:
logStore:
type: lokistack
lokistack:
name: loki-logging
collection:
type: vector
visualization:
type: ocp-console
managementState: Managed
- 基于以下 YAML 创建一个 LogFileMetricExporter 对象。说明:当使用 OpenShift Logging Operator 5.8.8 时无需此步操作,不过和 https://docs.openshift.com/container-platform/4.15/observability/logging/logging_release_notes/logging-5-8-release-notes.html#logging-release-notes-5-8-0-enhancements 似乎不一致。
apiVersion: logging.openshift.io/v1alpha1
kind: LogFileMetricExporter
metadata:
name: instance
namespace: openshift-logging
spec:
resources:
limits:
cpu: 500m
requests:
cpu: 200m
memory: 128Mi
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
operator: Exists
- 在完成后可在 OpenShift 的 “开发者” 视图中看到部署运行的组件。说明:此图不包括上一步说的 LogFileMetricExporter 对象。
- 刷新 OpenShift 的 “管理员” 视图,在 “观察” 菜单中会出现 “Logs” ,点击进入 Logs 可以看到集群日志。
- 为了能获得并访问 Auditor 日志,需根据以下 YAML 创建 ClusterLogForwarder 对象。
apiVersion: logging.openshift.io/v1
kind: ClusterLogForwarder
metadata:
name: instance
namespace: openshift-logging
spec:
pipelines:
- name: all-to-default
inputRefs:
- infrastructure
- application
- audit
outputRefs:
- default
配置基于 Loki 的 OpenShift Logging (Loki Operator 6.1.0 + OpenShift Logging Operator 6.1.0 + COO 0.4.1)
- 参照上一节第一步的配置创建一个 LokiStack 对象。
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
name: loki-logging
namespace: openshift-logging
spec:
size: 1x.extra-small
storage:
schemas:
- version: v13
effectiveDate: "2023-10-15"
secret:
name: lokistack-dev-s3
type: s3
storageClassName: gp2-csi
managementState: Managed
hashRing:
type: memberlist
tenants:
mode: openshift-logging
- 在 openshift-logging 项目中创建名为 collector 的 ServiceAccount。
$ oc create sa collector -n openshift-logging
- 给名为 collector 的 ServiceAccount 添加角色。
$ oc -n openshift-logging adm policy add-cluster-role-to-user logging-collector-logs-writer -z collector
$ oc -n openshift-logging adm policy add-cluster-role-to-user collect-application-logs -z collector
$ oc -n openshift-logging adm policy add-cluster-role-to-user collect-audit-logs -z collector
$ oc -n openshift-logging adm policy add-cluster-role-to-user collect-infrastructure-logs -z collector
- 在 Cluster Observability Operator 中创建一个 UIPlugin 对象。完成后可刷新 OpenShift 控制台,在 “观察” 菜单中会出现 “Logs” ,但此时日志还不能显示出来。
apiVersion: observability.openshift.io/v1alpha1
kind: UIPlugin
metadata:
name: logging
spec:
logging:
lokiStack:
name: loki-logging
type: Logging
- 在 OpenShift Logging Operator 中创建一个 ClusterLogForwarder 对象,将 OpenShift 的 Application、Infrastructue、Audit 日志传给 Loki。
apiVersion: observability.openshift.io/v1
kind: ClusterLogForwarder
metadata:
name: clf-loki
namespace: openshift-logging
spec:
managementState: Managed
outputs:
- lokiStack:
authentication:
token:
from: serviceAccount
target:
name: loki-logging
namespace: openshift-logging
name: default-lokistack
tls:
ca:
configMapName: openshift-service-ca.crt
key: service-ca.crt
type: lokiStack
pipelines:
- inputRefs:
- application
- infrastructure
- audit
name: logs-to-loki
outputRefs:
- default-lokistack
serviceAccount:
name: collector
- 点击进入 “观察” 菜单的 “Logs” ,可以看到集群的 Application、Infrastructue、Audit 日志。
验证应用日志
- 参考《OpenShift 4 - 配置 OpenShift 的 EFK 日志环境》的 “查看应用日志” 一节部署测试应用。
- 在运行的 Pod 中可以看到 Aggregated Logs 标签,确认是发给 Loki 的应用日志。
- 进入“观察”的 Logs 菜单,可以选则按 Namespace 过滤,命名空间选中 log-app。此时只会显示 log-app 项目中的应用日志。
- 再点击 Show Resources ,可显示日志的来源。
- 点击 Show Query 后在输入区可以看到
{ log_type="application", kubernetes_namespace_name="log-app" } | json
。可手工编辑日志查询条件,然后点击 Run Query 按钮执行日志查询。
视频
参考
https://github.com/OpenShiftDemos/openshift-ops-workshops/blob/ocp4-prod/workshop/content/logging.adoc
https://github.com/OpenShiftDemos/openshift-ops-workshops/blob/ocp4-prod/workshop/content/logging-with-loki.adoc
https://www.redhat.com/en/topics/devops/what-is-observability
https://landscape.cncf.io/guide#observability-and-analysis
https://cloud.redhat.com/blog/whats-new-in-red-hat-openshift-monitoring-4.13-logging-5.7-and-distributed-tracing-2.8
https://docs.openshift.com/container-platform/4.16/logging/cluster-logging.html
https://github.com/grafana/loki/blob/main/operator/hack/lokistack_gateway_ocp.yaml
https://github.com/OpenShiftDemos/openshift-ops-workshops/blob/ocp4-prod/workshop/content/logging-with-loki.adoc
https://videos.learning.redhat.com/media/OpenShift%20Logging%20-%20Technical%20Enablement%20-%20Log-based%20Alerts/1_fl713aj5
https://docs.redhat.com/zh_hans/documentation/openshift_container_platform/4.17/html-single/logging/index