查看服务,API 服务器和工作程序节点日志
通过审计日志,您能够更好地了解集群中的用户启动了哪些操作,这可以帮助您对问题进行故障诊断或报告符合行业和内部标准的情况。
Kubernetes 应用程序接口服务器审计日志
为了监控用户发起的、Kubernetes 在您的集群内进行的行政活动,您可以收集并通过您的 Kubernetes API服务器将审计事件转发到 IBM Cloud Logs 或外部服务器。
注意事项和先决条件
在设置 Kubernetes API 审计配置之前,请查看以下信息。
审计日志使用 "IBM-Cloud/kube-samples
GitHub代码库中的以下策略。 从1.30 版开始,这些策略已更新为紧跟Red Hat用于OpenShift 的策略。 这两套政策如下。
无法修改缺省策略或应用您自己的定制策略。
- 有关 Kubernetes 审计日志和详细信息,请参阅 Kubernetes 文档。
- 只能在集群中创建一个审计 Webhook。
- 您必须具有 IBM Cloud Kubernetes Service 集群的 管理员 IBM Cloud IAM 平台访问角色。
要开始使用,请遵循指示信息将 Kubernetes API 审计日志 发送到 IBM Cloud 专用网络 中的资源,或者将 发送到外部服务器。
将 Kubernetes API审计日志转发到云日志
要将审计日志转发至 IBM Cloud Logs,您可以使用提供的图像和部署创建一个 Kubernetes 审计系统。
以下示例使用 icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
图像将日志转发到 IBM Cloud Logs。 本图片仅用于演示目的。 对于生产解决方案,请配置并维护您自己的日志转发映像。
以前,icr.io/ibm/ibmcloud-kube-audit-to-logdna
用于转发日志。 此图片已弃用,支持即将终止。 请更新您的日志转发设置,改为使用 icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
。
集群中的 Kubernetes 审计系统由审计网络挂钩、日志收集服务和网络服务器应用程序以及日志记录代理组成。 Webhook 从集群主节点收集 Kubernetes API 服务器事件。 日志收集服务是一项 Kubernetes ClusterIP
服务,它根据公共 IBM Cloud 注册表中的图像创建。 该服务公开了一个简单的 node.js
HTTP Web服务器应用程序,仅用于专用网络。 网络服务器应用程序解析审计网络挂钩的日志数据,并将每条日志创建为唯一的JSON行。
最后,日志代理将Web服务器应用程序的日志转发到 IBM Cloud Logs,您可以在那里查看日志。
开始之前:请确保您已阅读 注意事项和前提条件,并确保您拥有 管理员 IBM Cloud IAM平台访问权限,且该权限 适用于 IBM Cloud Logs。
-
将公共 IBM Cloud 映像的全局容器注册表设定为目标。
ibmcloud cr region-set global
-
可选:如需了解
kube-audit
图片的更多信息,请访问icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
。ibmcloud cr image-inspect icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
-
创建一个名为
ibmcloud-kube-audit.yaml
的配置文件。 此配置文件创建了一个日志收集服务和一个部署,该部署将提取icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
映像以创建日志收集容器。apiVersion: v1 kind: List metadata: name: ibmcloud-kube-audit items: - apiVersion: v1 kind: Namespace metadata: name: ibm-kube-audit labels: pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/enforce-version: latest pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/audit-version: latest pod-security.kubernetes.io/warn: restricted pod-security.kubernetes.io/warn-version: latest - apiVersion: apps/v1 kind: Deployment metadata: name: ibmcloud-kube-audit namespace: ibm-kube-audit labels: app: ibmcloud-kube-audit spec: replicas: 1 selector: matchLabels: app: ibmcloud-kube-audit template: metadata: labels: app: ibmcloud-kube-audit spec: containers: - name: ibmcloud-kube-audit image: 'icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs:latest' imagePullPolicy: Always ports: - containerPort: 3000 securityContext: allowPrivilegeEscalation: false runAsNonRoot: true capabilities: drop: - ALL seccompProfile: type: RuntimeDefault - apiVersion: v1 kind: Service metadata: name: ibmcloud-kube-audit-service namespace: ibm-kube-audit labels: app: ibmcloud-kube-audit spec: selector: app: ibmcloud-kube-audit ports: - protocol: TCP port: 80 targetPort: 3000 type: ClusterIP - kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: ibmcloud-kube-audit namespace: ibm-kube-audit spec: podSelector: matchLabels: app: ibmcloud-kube-audit policyTypes: - Ingress ingress: - ports: - protocol: TCP port: 3000 from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: konnectivity-agent
-
在集群的
ibm-kube-audit
命名空间中创建部署。kubectl create -f ibmcloud-kube-audit.yaml
-
验证
ibmcloud-kube-audit-service
pod 的 STATUS 是否为Running
。kubectl get pods -n ibm-kube-audit -l app=ibmcloud-kube-audit
示例输出
NAME READY STATUS RESTARTS AGE ibmcloud-kube-audit-c75cb84c5-qtzqd 1/1 Running 0 21s
-
验证
ibmcloud-kube-audit-service
服务是否已部署在集群中。kubectl get svc -n ibm-kube-audit -l app=ibmcloud-kube-audit
示例输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ibmcloud-kube-audit-service ClusterIP 172.21.xxx.xxx <none> 80/TCP 1m
-
登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。 确保指定
--admin
选项以将client-certificate
和client-key
文件下载到本地计算机。 这些文件稍后用于配置审计 Webhook。ibmcloud ks cluster config --cluster <cluster> --admin
-
查询集群的
certificate-authority
并将其保存到文件中。ibmcloud ks cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
-
通过运行
kubectl config view
命令来查看当前配置,并查看client-certificate
和client-key
的输出。kubectl config view --minify
示例输出
clusters: - cluster: ... ... client-certificate: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin.pem client-key: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin-key.pem
-
配置审计 Webhook 并指定
certificate-authority
,client-certificate
和client-key
。 在 步骤 8 中检索到certificate-authority
,而在上一步中检索到client-certificate
和client-key
。
ibmcloud ks cluster master audit-webhook set --cluster CLUSTER --remote-server https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/ibmcloud-kube-audit-service/proxy/post --ca-cert CERTIFICATE-AUTHORITY --client-cert CLIENT-CERT --client-key CLIENT-KEY [--policy default|verbose]
- 验证是否已在集群中创建审计 Webhook。
ibmcloud ks cluster master audit-webhook get --cluster <cluster_name_or_ID>
示例输出
Server: https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/ibmcloud-kube-audit-service/proxy/post
Policy: default
- 通过刷新集群主节点,将 Webhook 应用于 Kubernetes API 服务器。 主节点刷新可能需要几分钟时间。
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
-
主节点刷新时,供应 IBM Cloud Logs 的实例,并将日志记录代理程序部署到集群中的每个工作程序节点。 要将日志从集群内部转发到 IBM Cloud Logs 服务,需要日志记录代理程序。 如果已在集群中设置日志记录代理程序,那么可以跳过此步骤。
-
主节点刷新完成并且日志记录代理程序在工作程序节点上运行后,可以在 IBM Cloud Logs 中查看 Kubernetes API 审计日志。
在集群中设置审计 Webhook 后,可以通过运行 ibmcloud cr image-list --include-ibm | grep ibmcloud-kube-audit-to-ibm-cloud-logs
来监视 kube-audit-to-logdna
映像的版本更新。 要查看当前在集群中运行的映像版本,请运行 kubectl get pods | grep ibmcloud-kube-audit-to-ibm-cloud-logs
以查找审计 pod 名称,并运行 kubectl describe pod <pod_name>
以查看映像版本。
将 Kubernetes API 审计日志转发到 IBM Cloud 专用网络中的资源
将审计日志转发至集群外的其他资源,该资源可通过 IBM Cloud 专用网络访问,但不是 IBM Cloud Logs。
以下示例使用 haproxytech/haproxy-alpine:2.6
映像来转发日志。 此映像仅用于演示目的,不应在生产环境中使用。 对于生产解决方案,请配置并维护您自己的日志转发映像。
开始之前,请确保已查看 注意事项和先决条件。
-
创建新目录
kube-audit-forwarder
,并在其中创建具有以下内容的文件haproxy.cfg
。 不要忘记将文件中的<REMOTE-IP>:<REMOTE-PORT>
替换为远程日志使用者的 IP 地址和端口。global log stdout format raw local0 info defaults mode http timeout client 10s timeout connect 5s timeout server 10s timeout http-request 10s log global frontend myfrontend bind :3000 default_backend remotelogstash # Use remote log consumer IP and port here backend remotelogstash server s1 <REMOTE-IP>:<REMOTE-PORT> check
如果日志使用者服务器正在实施安全连接 (TLS),那么可以将证书文件添加到此目录,并更改
haproxy.cfg
中的后端部分以使用这些文件。 有关更多信息,请参阅 HAProxy 文档。 -
从
kube-audit-forwarder
目录的内容创建 configmap。kubectl create namespace ibm-kube-audit; kubectl create configmap -n ibm-kube-audit kube-audit-forwarder-cm --from-file=kube-audit-forwarder
-
创建名为
kube-audit-forwarder-remote-private-ip.yaml
的配置文件。 此配置文件将创建部署和服务,以通过 IBM Cloud 专用网络将审计日志从集群转发到远程资源的 IP 地址。kind: Deployment apiVersion: apps/v1 metadata: labels: app: kube-audit-forwarder name: kube-audit-forwarder namespace: ibm-kube-audit spec: revisionHistoryLimit: 2 selector: matchLabels: app: kube-audit-forwarder strategy: rollingUpdate: maxUnavailable: 1 type: RollingUpdate template: metadata: labels: app: kube-audit-forwarder spec: containers: - image: haproxytech/haproxy-alpine:2.6 imagePullPolicy: IfNotPresent name: haproxy volumeMounts: - name: config-volume mountPath: /usr/local/etc/haproxy/haproxy.cfg subPath: haproxy.cfg volumes: - name: config-volume configMap: name: kube-audit-forwarder-cm --- apiVersion: v1 kind: Service metadata: name: kube-audit-forwarder namespace: ibm-kube-audit spec: selector: app: kube-audit-forwarder ports: - protocol: TCP port: 80 targetPort: 3000 --- kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: kube-audit-forwarder namespace: ibm-kube-audit spec: podSelector: matchLabels: app: kube-audit-forwarder policyTypes: - Ingress ingress: - ports: - protocol: TCP port: 3000 from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: konnectivity-agent - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: app: konnectivity-agent - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: app: vpn
如果在上一步中向
kube-audit-forwarder
添加了证书文件,请不要忘记将volumeMounts
部分中的那些文件作为subPath
列出。 -
创建部署和服务。
kubectl create -f kube-audit-forwarder-remote-private-ip.yaml
-
请确认您的集群中已部署了
kube-audit-forwarder
部署和服务。kubectl get svc -n ibm-kube-audit
示例输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ... kube-audit-forwarder ClusterIP 10.xxx.xx.xxx <none> 80/TCP 1m
kubectl get deployment -n ibm-kube-audit
示例输出
NAME READY UP-TO-DATE AVAILABLE AGE ... kube-audit-forwarder 1/1 1 1 6m27s
-
登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。 确保指定
--admin
选项以将client-certificate
和client-key
文件下载到本地计算机。 这些文件稍后用于配置审计 Webhook。ibmcloud ks cluster config --cluster <cluster> --admin
-
查询集群的
certificate-authority
并将其保存到文件中。ibmcloud ks cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
-
通过运行
kubectl config view
命令来查看当前配置,并查看client-certificate
和client-key
的输出。kubectl config view --minify
示例输出
clusters: - cluster: ... ... client-certificate: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin.pem client-key: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin-key.pem
-
配置审计 Webhook,并指定在步骤 5-7 中检索到的
certificate-authority
,client-certificate
和client-key
。ibmcloud ks cluster master audit-webhook set --cluster <cluster> --remote-server https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/kube-audit-forwarder/proxy/post --ca-cert <certificate-authority> --client-cert <client-certificate> --client-key <client-key> [--policy default|verbose]
-
验证是否已在集群中创建审计 Webhook。
ibmcloud ks cluster master audit-webhook get --cluster <cluster_name_or_ID>
示例输出
OK
Server: https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/kube-audit-forwarder/proxy/post
Policy: default
- 通过刷新集群主节点,将 Webhook 应用于 Kubernetes API 服务器。 主人可能需要几分钟来刷新。
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
在主节点刷新完成后,会将日志发送到日志记录资源的专用 IP 地址。
将 Kubernetes API 审计日志转发到公共因特网上的外部服务器
要审核通过您的 Kubernetes API服务器传递的任何事件,您可以创建一个配置,使用 Fluentd 将事件转发到外部服务器。
开始之前,请确保已查看 注意事项和先决条件。 请注意,不支持 日志过滤器。
-
设置 Webhook。 如果您没有在选项中提供任何信息,则使用默认配置。
ibmcloud ks cluster master audit-webhook set --cluster <cluster_name_or_ID> --remote-server <server_URL_or_IP> --ca-cert <CA_cert_path> --client-cert <client_cert_path> --client-key <client_key_path> [--policy default|verbose]
了解此命令的组成部分 选项 描述 <cluster_name_or_ID>
集群的名称或标识。 <server_URL>
您要发送日志的远程日志记录服务的公开 URL 或IP地址。 如果提供了不安全的服务器 URL,那么将忽略证书。 <CA_cert_path>
用于验证远程日志记录服务的 CA 证书的文件路径。 <client_cert_path>
用于向远程日志记录服务进行认证的客户机证书的文件路径。 <client_key_path>
用于连接到远程日志记录服务的相应客户机密钥的文件路径。 -
通过查看远程日志记录服务的 URL 来验证是否已启用日志转发。
ibmcloud ks cluster master audit-webhook get --cluster <cluster_name_or_ID>
示例输出
OK Server: https://8.8.8.8
-
通过重新启动 Kubernetes 主节点来应用配置更新。
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
-
可选:如果要停止转发审计日志,可以禁用配置。
-
对于您想要停止收集API服务器审计日志的集群:登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
-
禁用集群 API 服务器的 Webhook 后端配置。
ibmcloud ks cluster master audit-webhook unset --cluster <cluster_name_or_ID>
-
通过重新启动 Kubernetes 主节点来应用配置更新。
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
-
管理 API 服务器日志转发
请参阅 验证,更新和删除日志转发。
如果在检索审计日志时发现错误,而这些日志之前一直在工作,这可能是由于审计日志使用的证书授权过期或轮换所致。 重复前面的步骤,设置网络钩子并更新证书。 此外,您还可以查找名为 apiserver_audit_error_total{plugin="webhook"}
的 Kubernetes 指标,该指标指示您的 webhook 证书是否过期。
服务审计日志
默认情况下,IBM Cloud Kubernetes Service 会生成事件并将其发送至 IBM Cloud Logs。 要查看这些活动,您必须创建一个 IBM Cloud Logs 实例。 欲了解更多信息,请访问 IBM Cloud Logs 活动。