IBM Cloud Docs
查看服务,API 服务器和工作程序节点日志

查看服务,API 服务器和工作程序节点日志

通过审计日志,您能够更好地了解集群中的用户启动了哪些操作,这可以帮助您对问题进行故障诊断或报告符合行业和内部标准的情况。

Kubernetes 应用程序接口服务器审计日志

为了监控用户发起的、Kubernetes 在您的集群内进行的行政活动,您可以收集并通过您的 Kubernetes API服务器将审计事件转发到 IBM Cloud Logs 或外部服务器。

注意事项和先决条件

在设置 Kubernetes API 审计配置之前,请查看以下信息。

审计日志使用 "IBM-Cloud/kube-samples GitHub代码库中的以下策略。 从1.30 版开始,这些策略已更新为紧跟Red Hat用于OpenShift 的策略。 这两套政策如下。

无法修改缺省策略或应用您自己的定制策略。

要开始使用,请遵循指示信息将 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。

  1. 将公共 IBM Cloud 映像的全局容器注册表设定为目标。

    ibmcloud cr region-set global
    
  2. 可选:如需了解 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
    
  3. 创建一个名为 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
    
  4. 在集群的 ibm-kube-audit 命名空间中创建部署。

    kubectl create -f ibmcloud-kube-audit.yaml
    
  5. 验证 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
    
  6. 验证 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
    
  7. 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。 确保指定 --admin 选项以将 client-certificateclient-key 文件下载到本地计算机。 这些文件稍后用于配置审计 Webhook。

    ibmcloud ks cluster config --cluster <cluster> --admin
    
  8. 查询集群的 certificate-authority 并将其保存到文件中。

    ibmcloud ks cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
    
  9. 通过运行 kubectl config view 命令来查看当前配置,并查看 client-certificateclient-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
    
  10. 配置审计 Webhook 并指定 certificate-authorityclient-certificateclient-key。 在 步骤 8 中检索到 certificate-authority,而在上一步中检索到 client-certificateclient-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]
  1. 验证是否已在集群中创建审计 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
  1. 通过刷新集群主节点,将 Webhook 应用于 Kubernetes API 服务器。 主节点刷新可能需要几分钟时间。
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
  1. 主节点刷新时,供应 IBM Cloud Logs 的实例,并将日志记录代理程序部署到集群中的每个工作程序节点。 要将日志从集群内部转发到 IBM Cloud Logs 服务,需要日志记录代理程序。 如果已在集群中设置日志记录代理程序,那么可以跳过此步骤。

  2. 主节点刷新完成并且日志记录代理程序在工作程序节点上运行后,可以在 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 映像来转发日志。 此映像仅用于演示目的,不应在生产环境中使用。 对于生产解决方案,请配置并维护您自己的日志转发映像。

开始之前,请确保已查看 注意事项和先决条件

  1. 创建新目录 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 文档

  2. 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
    
  3. 创建名为 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 列出。

  4. 创建部署和服务。

    kubectl create -f kube-audit-forwarder-remote-private-ip.yaml
    
  5. 请确认您的集群中已部署了 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
    
  6. 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。 确保指定 --admin 选项以将 client-certificateclient-key 文件下载到本地计算机。 这些文件稍后用于配置审计 Webhook。

    ibmcloud ks cluster config --cluster <cluster> --admin
    
  7. 查询集群的 certificate-authority 并将其保存到文件中。

     ibmcloud ks cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
    
  8. 通过运行 kubectl config view 命令来查看当前配置,并查看 client-certificateclient-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
    
  9. 配置审计 Webhook,并指定在步骤 5-7 中检索到的 certificate-authorityclient-certificateclient-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]
    
  10. 验证是否已在集群中创建审计 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
  1. 通过刷新集群主节点,将 Webhook 应用于 Kubernetes API 服务器。 主人可能需要几分钟来刷新。
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>

在主节点刷新完成后,会将日志发送到日志记录资源的专用 IP 地址。

将 Kubernetes API 审计日志转发到公共因特网上的外部服务器

要审核通过您的 Kubernetes API服务器传递的任何事件,您可以创建一个配置,使用 Fluentd 将事件转发到外部服务器。

开始之前,请确保已查看 注意事项和先决条件。 请注意,不支持 日志过滤器

  1. 设置 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> 用于连接到远程日志记录服务的相应客户机密钥的文件路径。
  2. 通过查看远程日志记录服务的 URL 来验证是否已启用日志转发。

    ibmcloud ks cluster master audit-webhook get --cluster <cluster_name_or_ID>
    

    示例输出

    OK
    Server:            https://8.8.8.8
    
  3. 通过重新启动 Kubernetes 主节点来应用配置更新。

    ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
    
  4. 可选:如果要停止转发审计日志,可以禁用配置。

    1. 对于您想要停止收集API服务器审计日志的集群:登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。

    2. 禁用集群 API 服务器的 Webhook 后端配置。

      ibmcloud ks cluster master audit-webhook unset --cluster <cluster_name_or_ID>
      
    3. 通过重新启动 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 活动