概览
GKE On-Prem 利用 Kubernetes 审核日志记录功能,该功能会按时间顺序记录对 Kubernetes API 服务器进行的调用。审核日志适合用于调查可疑的 API 请求以及收集统计信息。
在 Anthos 1.2 之前,GKE On-Prem 仅将审核日志写入磁盘。Anthos 1.2 引入了一项 Alpha 版功能,支持将审核日志写入 Google Cloud 项目中的 Cloud Audit Logs。与写入磁盘,甚至在本地日志记录系统中捕获日志相比,写入 Cloud Audit Logs 具有多个优势:
- 所有 Anthos 集群的审核日志都可以集中管理。
- 写入 Cloud Audit Logs 的日志条目是不可变的。
- Cloud Audit Logs 条目会保留 400 天。
- Cloud Audit Logs 包含在 Anthos 的价格中。
您可以配置 GKE On-Prem,以将日志写入磁盘或 Cloud Audit Logs。
基于磁盘的审核日志记录
默认情况下,GKE On-Prem 中的审核日志会写入永久性磁盘,这样虚拟机重启和升级就不会导致日志消失。GKE On-Prem 最多可保留 12 GB 的审核日志条目。
Cloud Audit Logs
如果启用了 Cloud Audit Logs,则所有 Kubernetes API 服务器的管理员活动审核日志条目会发送到 Google Cloud(使用您在创建用户集群时指定的项目和位置)。 启用 Cloud Audit Logs 后,GKE On-Prem 会停用基于磁盘的审核日志记录。
为了将日志条目缓冲并写入到 Cloud Audit Logs,GKE On-Prem 会将 audit-proxy
Pod 部署到管理员集群中。此 Pod 也可用作用户集群的 Sidecar 容器。
限制
适用于 GKE On-Prem 的 Cloud Audit Logs 是一项 Alpha 版功能。此 Alpha 版存在一些限制:
不支持数据访问日志记录。
不支持修改 Kubernetes 审核政策。
Cloud Audit Logs 目前不能应对网络服务中断。如果日志条目无法导出到 Google Cloud,这些日志条目将被丢弃。
Audit Logging 不支持 HTTP_PROXY。审核代理配置不会考虑使用 HTTP 代理访问 Google API 和 Container Registry 的情况,因此 DNS 解析会失败。
启用 Anthos GKE API 和 Anthos Audit API
如需将 Cloud Audit Logs 与 GKE On-Prem 搭配使用,请执行以下操作:
如果您使用的是 Anthos 1.4.x 或更低版本,请启用 Anthos GKE API。
如果您使用的是 Anthos 1.5 或更高版本,请启用 Anthos Audit API。
如果您不确定或打算升级到 Anthos 1.5,请同时启用以上两项。
为 Cloud Audit Logs 创建服务帐号
您已经创建多个用于 GKE On-Prem 的服务帐号。对于此 Alpha 版功能,您需要创建一个额外的服务帐号,并将其列入许可名单。
创建 Cloud Audit Logs 服务帐号:
gcloud iam service-accounts create audit-logging-service-account
为 Cloud Audit Logs 服务帐号创建 JSON 密钥文件:
gcloud iam service-accounts keys create audit-logging-key.json \ --iam-account AUDIT_LOGGING_SERVICE_ACCOUNT_EMAIL
其中,AUDIT_LOGGING_SERVICE_ACCOUNT_EMAIL 是您的服务帐号的电子邮件地址。
将
audit-logging-key.json
保存在管理员工作站上其他服务帐号密钥所在的位置。
将您的服务帐号列入许可名单
要请求将您的 Cloud Audit Logs 服务帐号添加到许可名单,请填写 GKE On-Prem Alpha 版的 Cloud Audit Logs 表单。列入许可名单完成后,您将收到一封通知电子邮件。您的服务帐号必须先列入许可名单,然后再创建启用 Cloud Audit Logs 的管理员集群或用户集群。
创建启用 Cloud Audit Logs 的管理员集群
只有在一开始创建管理员集群时,您才能为该管理员集群启用 Cloud Audit Logs。您不能修改现有管理员集群来启用 Cloud Audit Logs。
请参阅创建管理员集群的说明。
运行
gkectl create-config
之后,照常填写配置文件admin-cluster.yaml
,同时还要填写新的cloudAuditLogging
部分。将
cloudAuditLogging.projectId
设置为 Google Cloud 项目的 ID,该项目是您要在其中查看与管理员集群相关的审核日志的项目。将
cloudAuditLogging.clusterLocation
设置为您要在其中存储审核日志的 Google Cloud 区域。为了缩短延迟时间,请选择靠近本地数据中心的区域。将
cloudAuditLogging.serviceAccountKeyPath
设置为 Cloud Audit Logs 服务帐号的 JSON 密钥文件的路径。
例如:
cloudAuditLogging: projectId: "my-project" clusterLocation: "us-west1" serviceAccountKeyPath: "/my-key-folder/audit-logging-key.json"
继续照常创建集群。
创建已启用 Cloud Audit Logs 的用户集群
如果您尚未创建管理员集群,请参阅创建管理员集群的说明。
如果您已拥有管理员集群,请按照创建其他用户集群中的说明创建新的用户集群。
运行
gkectl create-config
之后,照常填写配置文件user-cluster.yaml
,同时还要填写新的cloudAuditLogging
部分。将
cloudAuditLogging.projectId
设置为 Google Cloud 项目的 ID,您要在该项目中查看与用户集群相关的审核日志。将
cloudAuditLogging.clusterLocation
设置为您要在其中存储审核日志的 Google Cloud 区域。建议选择一个靠近您的本地数据中心的区域。将
cloudAuditLogging.serviceAccounKeyPath
设置为 Cloud Audit Logs 服务帐号的 JSON 密钥文件的路径。
例如:
cloudAuditLogging: projectId: "my-project" clusterLocation: "us-west1" serviceAccountKeyPath: "/my-key-folder/audit-logging-key.json"
继续照常创建集群。
在现有用户集群上启用 Cloud Audit Logs
您可以通过 gkectl update cluster
命令为现有用户集群启用 Cloud Audit Logs。
填写 user-cluster.yaml
文件的 cloudAuditLogging
部分。(如需详细了解各个字段,请参阅创建已启用 Cloud Audit Logs 的用户集群。)
然后运行以下命令:
gkectl update cluster --config [USER_CLUSTER_YAML] --kubeconfig [ADMIN_CLUSTER_KUBECONFIG]
在现有用户集群上停用 Cloud Audit Logs
打开描述用户集群的
user-cluster.yaml
文件。删除
cloudAuditLogging
部分或者将其注释掉,然后保存文件。运行以下命令以更新用户集群:
gkectl update cluster --config [USER_CLUSTER_YAML] --kubeconfig [ADMIN_CLUSTER_KUBECONFIG]
访问 GKE On-Prem 审核日志
基于磁盘的审核日志记录
查看在管理员集群及其所有关联的用户集群中运行的 Kubernetes API 服务器:
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods --all-namespaces -l component=kube-apiserver
其中,[ADMIN_CLUSTER_KUBECONFIG] 是管理员集群的 kubeconfig 文件。
下载 API 服务器的审核日志:
kubectl cp -n [NAMESPACE] [APISERVER_POD_NAME]:/var/log/kube-audit/kube-apiserver-audit.log /tmp/kubeaudit.log
此命令会提取最新的日志文件,该日志文件对于管理员集群最多可以包含 1 GB 的数据,而对于用户集群最多可以包含 850 GB 的数据。
您还可以在
/var/log/kube-audit/kube-apiserver-audit.log
下的控制平面节点上查找管理员集群的审核日志。用户集群的审核日志位于名为kube-audit-kube-apiserver-0
的PersistentVolumeClaim
中。您可以通过volume
条目在您自己的 Pod 中访问此数据,如下所示:volumes:
- name: kube-audit hostPath: path: /var/log/kube-audit type: ""
volumes: - name: kube-audit persistentVolumeClaim: claimName: kube-audit-kube-apiserver-0 readOnly: true
如需在相应的管理员集群节点(且仅限此节点)上安排 Pod,您需要在 Pod 规范中添加 nodeSelector
和 tolerations
部分,如下所示:
spec: nodeSelector: node-role.kubernetes.io/master: '' tolerations: - key: node-role.kubernetes.io/master value: "" effect: NoSchedule
对于用户集群,请使用以下 nodeSelector
:
spec: nodeSelector: kubernetes.googleapis.com/cluster-name: [USER_CLUSTER_NAME]
较早的审核记录保存在单独的文件中。如需查看这些文件,请运行以下命令:
kubectl exec -n [NAMESPACE] [APISERVER_POD_NAME] -- ls /var/log/kube-audit -la
每个审核日志的文件名都有一个时间戳,用于指明文件的轮替时间。文件包含该时间和日期之前的审核日志。
Cloud Audit Logs
控制台
在 Google Cloud 控制台中,转到日志记录菜单中的日志页面。
在按标签过滤或搜索文字框中(在上述下拉菜单上方),点击向下箭头以打开下拉菜单。 从菜单中,选择转换为高级过滤条件。
在文本框中填写以下过滤条件:
resource.type="k8s_cluster" logName="projects/[PROJECT_ID]/logs/externalaudit.googleapis.com%2Factivity" protoPayload.serviceName="anthosgke.googleapis.com"
点击提交过滤条件以显示来自 GKE On-Prem 集群(已配置为登录此项目)的所有审核日志。
gcloud
列出项目的管理员活动日志中适用于 k8s_cluster
资源类型的前两个日志条目:
gcloud logging read \ 'logName="projects/[PROJECT_ID]/logs/externalaudit.googleapis.com%2Factivity" \ AND resource.type="k8s_cluster" \ AND protoPayload.serviceName="anthosgke.googleapis.com" ' \ --limit 2 \ --freshness 300d
其中,[PROJECT_ID] 是您的项目 ID。
输出内容会显示两个日志条目。请注意,对于每个日志条目,logName
字段的值为 projects/[PROJECT_ID]/logs/externalaudit.googleapis.com%2Factivity
,并且 protoPayload.serviceName
等于 anthosgke.googleapis.com
。
审核政策
Cloud Audit Logs 行为由静态配置的 Kubernetes 审核日志记录政策决定。更改此政策目前不受支持,但将在未来版本中提供。