写在前面:用到的一些参考链接
官方介绍:https://github.com/kubernetes/website/blob/release-1.12/content/zh/docs/tasks/debug-application-cluster/audit.md
阿里云介绍:https://help.aliyun.com/document_detail/91406.html
腾讯云介绍:https://cloud.tencent.com/document/product/457/50510
ucloud配置参数:?https://docs.ucloud.cn/uk8s/bestpractice/apiserver_audit
存疑:
-
目前暂时不清楚在何种规模下会增加apiserver多少的内存消耗,需要有数据支持,及监控。(30%,在什么集群规模下,怎么来的数据。) -
为什么log会禁止批处理?日志容易写乱?是否会出现json不完整?
审计目的
官方介绍(kubernetes 1.12):
Kubernetes 审计功能提供了与安全相关的按时间顺序排列的记录集,记录单个用户、管理员或系统其他组件影响系统的活动顺序。它能帮助集群管理员处理以下问题:
-
发生了什么? -
什么时候发生的? -
谁触发的? -
活动发生在哪个(些)对象上? -
在哪观察到的? -
它从哪触发的? -
活动的后续处理行为是什么?
这对平台管理者来说十分重要,能够回答一些在故障时候出现的问题。哪个用户,从哪个ip上,发起了什么请求。
如删除了一个命名空间,导致这个命名空间下的所有pod被回收,对故障进行复盘。(当然可以引入webhook来阻止高危的操作)
Kube-apiserver?执行审计。每个执行阶段的每个请求都会生成一个事件,然后根据特定策略对事件进行预处理并写入后端。
该策略确定记录的内容并且在后端存储记录。当前的后端支持日志文件和 webhook。
每个请求都可以用相关的 “stage” 记录。已知的 stage 有:
-
RequestReceived ?- 事件的 stage 将在审计处理器接收到请求后,并且在委托给其余处理器之前生成。 -
ResponseStarted ?- 在响应消息的头部发送后,但是响应消息体发送前。这个 stage 仅为长时间运行的请求生成(例如 watch)。 -
ResponseComplete ?- 当响应消息体完成并且没有更多数据需要传输的时候。 -
Panic ?- 当 panic 发生时生成。
审计日志记录功能会增加 API server 的内存消耗,因为需要为每个请求存储审计所需的某些上下文。此外,内存消耗取决于审计日志记录的配置。
目前暂时不清楚在何种规模下会增加apiserver多少的内存消耗,需要有数据支持,及监控。(30%,在什么集群规模下,怎么来的数据。)
审计策略:
处理事件时,将按顺序与规则列表进行比较。第一个匹配规则设置事件的 [审计级别][auditing-level]。已知的审计级别有:
-
None ?- 符合这条规则的日志将不会记录。 -
Metadata ?- 记录请求的 metadata(请求的用户、timestamp、resource、verb 等等),但是不记录请求或者响应的消息体。 -
Request ?- 记录事件的 metadata 和请求的消息体,但是不记录响应的消息体。这不适用于非资源类型的请求。 -
RequestResponse ?- 记录事件的 metadata,请求和响应的消息体。这不适用于非资源类型的请求。
您可以使用?--audit-policy-file ?标志将包含策略的文件传递给?kube-apiserver。如果不设置该标志,则不记录事件。注意?rules ?字段?必须?在审计策略文件中提供。没有(0)规则的策略将被视为非法配置。
目前较为规范的配置是gce提供的配置文件,这个配置文件所产生的日志量是很大的:
apiVersion:?audit.k8s.io/v1
kind:?Policy
omitStages:
??-?"RequestReceived"
rules:
??#?集群中包含大量以下低风险请求,建议不做审计(不记录日志)
??#?kube-proxy?的?watch?请求
??-?level:?None
????users:?["system:kube-proxy"]
????verbs:?["watch"]
????resources:
??????-?group:?""?#?core
????????resources:?["endpoints",?"services",?"services/status"]
??#?在?kube-system?namespace?下对?configmap?的?get?请求
??-?level:?None
????users:?["system:unsecured"]
????namespaces:?["kube-system"]
????verbs:?["get"]
????resources:
??????-?group:?""?#?core
????????resources:?["configmaps"]
??#?kubelet?对于?node?节点的?get?请求
??-?level:?None
????users:?["kubelet"]?#?legacy?kubelet?identity
????verbs:?["get"]
????resources:
??????-?group:?""?#?core
????????resources:?["nodes",?"nodes/status"]
??#?system:node?用户组对于?node?节点的?get?请求
??-?level:?None
????userGroups:?["system:nodes"]
????verbs:?["get"]
????resources:
??????-?group:?""?#?core
????????resources:?["nodes",?"nodes/status"]
??#?系统组件在?kube-system?namespace?下对于?endpoints?的?get/update?请求
??-?level:?None
????users:
??????-?system:kube-controller-manager
??????-?system:kube-scheduler
??????-?system:serviceaccount:kube-system:endpoint-controller
????verbs:?["get",?"update"]
????namespaces:?["kube-system"]
????resources:
??????-?group:?""?#?core
????????resources:?["endpoints"]
??#?apiserver?对于?namespace?的?get?请求
??-?level:?None
????users:?["system:apiserver"]
????verbs:?["get"]
????resources:
??????-?group:?""?#?core
????????resources:?["namespaces",?"namespaces/status",?"namespaces/finalize"]
??#?cluster-autoscaler?集群伸缩组件在?kube-system?namespace?下对?configmap、endpoint?的?get/update?请求
??-?level:?None
????users:?["cluster-autoscaler"]
????verbs:?["get",?"update"]
????namespaces:?["kube-system"]
????resources:
??????-?group:?""?#?core
????????resources:?["configmaps",?"endpoints"]
??#?HPA?通过?controller?manager?获取?metrics?信息的请求
??-?level:?None
????users:
??????-?system:kube-controller-manager
????verbs:?["get",?"list"]
????resources:
??????-?group:?"metrics.k8s.io"
??#?以下只读?URL
??-?level:?None
????nonResourceURLs:
??????-?/healthz*
??????-?/version
??????-?/swagger*
??#?event?事件
??-?level:?None
????resources:
??????-?group:?""?#?core
????????resources:?["events"]
??#?kubelet、system:node-problem-detector?和?system:nodes?对于节点的?update?和?patch?请求,等级设置为?Request,记录元数据和请求的消息体
??-?level:?Request
????users:?["kubelet",?"system:node-problem-detector",?"system:serviceaccount:kube-system:node-problem-detector"]
????verbs:?["update","patch"]
????resources:
??????-?group:?""?#?core
????????resources:?["nodes/status",?"pods/status"]
??-?level:?Request
????userGroups:?["system:nodes"]
????verbs:?["update","patch"]
????resources:
??????-?group:?""?#?core
????????resources:?["nodes/status",?"pods/status"]
??#?对于可能包含敏感信息或二进制文件的?Secrets,ConfigMaps,tokenreviews?接口的日志等级设为?Metadata
??-?level:?Metadata
????resources:
??????-?group:?""?#?core
????????resources:?["secrets",?"configmaps",?"serviceaccounts/token"]
??????-?group:?authentication.k8s.io
????????resources:?["tokenreviews"]
??#?对于一些返回体比较大的?get,?list,?watch?请求,设置为?Request
??-?level:?Request
????verbs:?["get",?"list",?"watch"]
????resources:
??????-?group:?""?#?core
??????-?group:?"admissionregistration.k8s.io"
??????-?group:?"apiextensions.k8s.io"
??????-?group:?"apiregistration.k8s.io"
??????-?group:?"apps"
??????-?group:?"authentication.k8s.io"
??????-?group:?"authorization.k8s.io"
??????-?group:?"autoscaling"
??????-?group:?"batch"
??????-?group:?"certificates.k8s.io"
??????-?group:?"extensions"
??????-?group:?"metrics.k8s.io"
??????-?group:?"networking.k8s.io"
??????-?group:?"node.k8s.io"
??????-?group:?"policy"
??????-?group:?"rbac.authorization.k8s.io"
??????-?group:?"scheduling.k8s.io"
??????-?group:?"storage.k8s.io"
??#?对已知?Kubernetes?API?默认设置为?RequestResponse
??-?level:?RequestResponse
????resources:
??????-?group:?""?#?core
??????-?group:?"admissionregistration.k8s.io"
??????-?group:?"apiextensions.k8s.io"
??????-?group:?"apiregistration.k8s.io"
??????-?group:?"apps"
??????-?group:?"authentication.k8s.io"
??????-?group:?"authorization.k8s.io"
??????-?group:?"autoscaling"
??????-?group:?"batch"
??????-?group:?"certificates.k8s.io"
??????-?group:?"extensions"
??????-?group:?"metrics.k8s.io"
??????-?group:?"networking.k8s.io"
??????-?group:?"node.k8s.io"
??????-?group:?"policy"
??????-?group:?"rbac.authorization.k8s.io"
??????-?group:?"scheduling.k8s.io"
??????-?group:?"storage.k8s.io"
??#?对于其他请求都设置为?Metadata
??-?level:?Metadata
当然可以使用最低限度的配置文件:
#?Log?all?requests?at?the?Metadata?level.
apiVersion:?audit.k8s.io/v1beta1
kind:?Policy
rules:
-?level:?Metadata
审计后端
审计后端实现将审计事件导出到外部存储。?Kube-apiserver?提供两个后端:
-
Log 后端,将事件写入到磁盘 -
Webhook 后端,将事件发送到外部 API
日志后端:
#?指定用来写入审计事件的日志文件路径。不指定此标志会禁用日志后端
--audit-log-path=/var/log/kubernetes/audit/audit.log
#?指定审计策略配置文件
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
#?定义保留旧审计日志文件的最大天数
--audit-log-maxage=7
#?定义要保留的审计日志文件的最大数量
--audit-log-maxbackup=10
#?定义审计日志文件的最大大小(兆字节)
--audit-log-maxsize=1000
webhook后端:
# webhook 配置文件的路径。Webhook 配置文件实际上是一个kubeconfig。
--audit-webhook-config-file
#?指定在第一次失败后重发请求等待的时间。随后的请求将以指数退避重试。
--audit-webhook-initial-backoff
批处理:
??为什么log会禁止批处理?日志容易写乱?是否会出现json不完整?
log和webhook后端都是支持batch。默认情况下webhook启用batch,log中禁batch。
-
-audit-webhook-mode ?定义缓存策略,可选值如下: -
batch ?- 以批处理缓存事件和异步的过程。这是默认值。 -
blocking ?- 阻止 API server 处理每个单独事件的响应。
webhook的参数:
批处理相关:
--audit-webhook-batch-buffer-size?int?????Default:?10000
指定存储批处理和写入事件的缓冲区字节数(默认值:10000)。只在批处理模式下使用。
--audit-webhook-batch-max-size?int?????Default:?400
指定一个批处理的最大长度(默认值:400)。只在批处理模式下使用。
--audit-webhook-batch-max-wait?duration?????Default:?30s
指定尚未达到最大值的批处理的强制写入等待时间(默认值:30s)。只在批处理模式下使用。
--audit-webhook-batch-throttle-burst?int?????Default:?15
指定在未使用 ThrottleQPS 时同时发送请求的最大数量(默认值:15)。只在批处理模式下使用。
--audit-webhook-batch-throttle-enable?????Default:?true
指定是否启用 batching throttling(默认值:true)。只在批处理模式下使用。
--audit-webhook-batch-throttle-qps?float32?????Default:?10
设定每秒内可执行的批处理的最大平均数(默认值:10)。只在批处理模式下使用。
webhook相关:
--audit-webhook-config-file?string
指定 kubeconfig 格式的配置文件的路径。该文件设定了审计 webhook 配置。
--audit-webhook-initial-backoff?duration?????Default:?10s
指定重试第一个失败请求之前等待的时间(默认值:10s)。
处理模式:
--audit-webhook-mode?string?????Default:?"batch"
指定发送审计事件的策略。blocking 表示发送事件时阻塞服务器响应;batch 表示在后端异步缓冲和写入事件。目前仅支持 batch 和 blocking(默认值:batch)。
是否截断:
--audit-webhook-truncate-enabled
指定是否允许截断事件和批处理。
--audit-webhook-truncate-max-batch-size?int?????Default:?10485760
指定发送到底层后端的批处理的最大字节数(默认值:10485760)。实际序列化时的大小会比设定值大几百字节。如果一个批处理超出该大小,它会被分为几个小的批处理。
--audit-webhook-truncate-max-event-size?int?????Default:?102400
指定发送到底层后端的审计事件的最大字节数(默认值:102400)。如果一个事件超出该大小,则第一个请求和回复会被删除,如果还没有减少到合适的大小,该事件将被丢弃。
--audit-webhook-version?string?????Default:?"audit.k8s.io/v1beta1"
指定序列化审计日志的 API 组名和版本号(默认值:audit.k8s.io/v1beta1)。
对于log下的batch模式:
批处理相关:
--audit-log-batch-buffer-size?int?????Default:?10000
指定存储批处理和写入事件的缓冲区字节数(默认值:10000)。只在批处理模式下使用。
--audit-log-batch-max-size?int?????Default:?1
指定一个批处理的最大长度(默认值:1)。只在批处理模式下使用。
--audit-log-batch-max-wait?duration
指定尚未达到最大值的批处理的强制写入等待时间。只在批处理模式下使用。
--audit-log-batch-throttle-burst?int
指定在未使用 ThrottleQPS 时同时发送请求的最大数量。只在批处理模式下使用。
--audit-log-batch-throttle-enable
指定是否启用 batching throttling。只在批处理模式下使用。
--audit-log-batch-throttle-qps?float32
设定每秒内可执行的批处理的最大平均数。只在批处理模式下使用。
日志格式:
--audit-log-format?string?????Default:?"json"
指定存储审计日志的格式。legacy 表示每个事件记录 1 行文本;json 表示以结构化 json 格式记录。目前仅支持 legacy 和 json(默认值:json)。
日志大小等:
--audit-log-maxage?int
指定历史审计日志的最大保存天数,以日志文件名中的时间戳为准。
--audit-log-maxbackup?int
指定历史审计日志的最大保存数量。
--audit-log-maxsize?int
指定审计日志流转前的最大大小(单位:MB)。
处理模式:
--audit-log-mode?string?????Default:?"blocking"
指定发送审计事件的策略。blocking 表示发送事件时阻塞服务器响应;batch 表示在后端异步缓冲和写入事件。目前仅支持 batch 和 blocking(默认值:blocking)。
--audit-log-path?string
如果指定该参数,则所有 API 服务器接受的请求都会记录到此文件。"-"?表示记录到标准输出。
是否截断:
--audit-log-truncate-enabled
指定是否允许截断事件和批处理。
--audit-log-truncate-max-batch-size?int?????Default:?10485760
指定发送到底层后端的批处理的最大字节数(默认值:10485760)。实际序列化时的大小会比设定值大几百字节。如果一个批处理超出该大小,它会被分为几个小的批处理。
--audit-log-truncate-max-event-size?int?????Default:?102400
指定发送到底层后端的审计事件的最大字节数(默认值:102400)。如果一个事件超出该大小,则第一个请求和回复会被删除,如果还没有减少到合适的大小,该事件将被丢弃。
--audit-log-version?string?????Default:?"audit.k8s.io/v1beta1"
参数解释:
需要设置参数以适应 apiserver 上的负载。
例如,如果 kube-apiserver 每秒收到 100 个请求,并且每个请求仅在?ResponseStarted ?和?ResponseComplete ?阶段进行审计,则应该考虑每秒生成约 200 个审计事件。假设批处理中最多有 100 个事件,则应将限制级别设置为至少 2 个 QPS。假设后端最多需要 5 秒钟来写入事件,您应该设置缓冲区大小以容纳最多 5 秒的事件,即 10 个 batch,即 1000 个事件。
但是,在大多数情况下,默认参数应该足够了,您不必手动设置它们。您可以查看 kube-apiserver 公开的以下 Prometheus 指标,并在日志中监控审计子系统的状态。
数据使用
日志采集
部署filebeat 、 fluentd等应用。
webhook
logstash日志:
$?cat?<<EOF?>?/etc/logstash/config
input{
????http{
????????#TODO,?figure?out?a?way?to?use?kubeconfig?file?to?authenticate?to?logstash
????????#https://www.elastic.co/guide/en/logstash/current/plugins-inputs-http.html#plugins-inputs-http-ssl
????????port=>8888
????}
}
filter{
????split{
????????#?Webhook?audit?backend?sends?several?events?together?with?EventList
????????#?split?each?event?here.
????????field=>[items]
????????#?We?only?need?event?subelement,?remove?others.
????????remove_field=>[headers,?metadata,?apiVersion,?"@timestamp",?kind,?"@version",?host]
????}
????mutate{
????????rename?=>?{items=>event}
????}
}
output{
????file{
????????#?Audit?events?from?different?users?will?be?saved?into?different?files.
????????path=>"/var/log/kube-audit-%{[event][user][username]}/audit"
????}
}
kubeapi-server的文件
$?cat?<<EOF?>?/etc/kubernetes/audit-webhook-kubeconfig
apiVersion:?v1
clusters:
-?cluster:
????server:?http://<ip_of_logstash>:8888
??name:?logstash
contexts:
-?context:
????cluster:?logstash
????user:?""
??name:?default-context
current-context:?default-context
kind:?Config
preferences:?{}
users:?[]
EOF
除了文件输出插件外,logstash 还有其它多种输出可以让用户路由不同的数据。例如,用户可以将审计事件发送给支持全文搜索和分析的 elasticsearch 插件。
可视化展示
目前的公有云有很多已经提供了此种能力。如:腾讯云提供的能力。
可以查看本文开头的链接了解。
文本json格式
展示了多种level下的结构体:
{
????"kind":?"Event",
????"apiVersion":?"audit.k8s.io/v1",
????"level":?"Metadata",
????"auditID":?"c1660935-5fdf-4d0a-8d79-88601c0ef4d7",
????"stage":?"ResponseStarted",
????"requestURI":?"/api/v1/namespaces/kube-system/configmaps?allowWatchBookmarks=true\u0026fieldSelector=metadata.name%3Dextension-apiserver-authentication\u0026resourceVersion=2089128\u0026timeout=7m46s\u0026timeoutSeconds=466\u0026watch=true",
????"verb":?"watch",
????"user":?{
????????"username":?"system:kube-scheduler",
????????"groups":?[
????????????"system:authenticated"
????????]
????},
????"sourceIPs":?[
????????"10.8.58.159"
????],
????"userAgent":?"kube-scheduler/v1.20.2?(linux/amd64)?kubernetes/faecb19",
????"objectRef":?{
????????"resource":?"configmaps",
????????"namespace":?"kube-system",
????????"name":?"extension-apiserver-authentication",
????????"apiVersion":?"v1"
????},
????"responseStatus":?{
????????"metadata":?{},
????????"status":?"Success",
????????"message":?"Connection?closed?early",
????????"code":?200
????},
????"requestReceivedTimestamp":?"2022-01-12T15:04:14.207897Z",
????"stageTimestamp":?"2022-01-12T15:04:24.208083Z",
????"annotations":?{
????????"authorization.k8s.io/decision":?"allow",
????????"authorization.k8s.io/reason":?"RBAC:?allowed?by?RoleBinding?\"system::extension-apiserver-authentication-reader/kube-system\"?of?Role?\"extension-apiserver-authentication-reader\"?to?User?\"system:kube-scheduler\""
????}
}
{ ????“kind”:?“Event”, ????“apiVersion”:?“audit.k8s.io/v1”, ????“level”:?“Metadata”, ????“auditID”:?“1d4d5380-5028-485c-9f7c-206be0c5dd27”, ????“stage”:?“ResponseComplete”, ????“requestURI”:?“/readyz”, ????“verb”:?“get”, ????“user”:?{ ????????“username”:?“system:anonymous”, ????????“groups”:?[ ????????????“system:unauthenticated” ????????] ????}, ????“sourceIPs”:?[ ????????“10.8.58.159” ????], ????“userAgent”:?“kube-probe/1.20”, ????“responseStatus”:?{ ????????“metadata”:?{}, ????????“code”:?200 ????}, ????“requestReceivedTimestamp”:?“2022-01-12T15:04:22.521353Z”, ????“stageTimestamp”:?“2022-01-12T15:04:22.525616Z”, ????“annotations”:?{ ????????“authorization.k8s.io/decision”:?“allow”, ????????“authorization.k8s.io/reason”:?“RBAC:?allowed?by?ClusterRoleBinding?“system:public-info-viewer”?of?ClusterRole?“system:public-info-viewer”?to?Group?“system:unauthenticated”” ????} }
{
????"kind":?"Event",
????"apiVersion":?"audit.k8s.io/v1",
????"level":?"Request",
????"auditID":?"305ee9dd-cde8-46db-8e6f-9295be3adc99",
????"stage":?"ResponseStarted",
????"requestURI":?"/apis/autoscaling/v1/horizontalpodautoscalers?allowWatchBookmarks=true\u0026resourceVersion=2089128\u0026timeout=5m14s\u0026timeoutSeconds=314\u0026watch=true",
????"verb":?"watch",
????"user":?{
????????"username":?"system:kube-controller-manager",
????????"groups":?[
????????????"system:authenticated"
????????]
????},
????"sourceIPs":?[
????????"10.8.58.159"
????],
????"userAgent":?"kube-controller-manager/v1.20.2?(linux/amd64)?kubernetes/faecb19/shared-informers",
????"objectRef":?{
????????"resource":?"horizontalpodautoscalers",
????????"apiGroup":?"autoscaling",
????????"apiVersion":?"v1"
????},
????"responseStatus":?{
????????"metadata":?{},
????????"status":?"Success",
????????"message":?"Connection?closed?early",
????????"code":?200
????},
????"requestReceivedTimestamp":?"2022-01-12T14:59:07.905200Z",
????"stageTimestamp":?"2022-01-12T15:04:21.905991Z",
????"annotations":?{
????????"authorization.k8s.io/decision":?"allow",
????????"authorization.k8s.io/reason":?"RBAC:?allowed?by?ClusterRoleBinding?\"system:kube-controller-manager\"?of?ClusterRole?\"system:kube-controller-manager\"?to?User?\"system:kube-controller-manager\""
????}
}
{ ????“kind”:?“Event”, ????“apiVersion”:?“audit.k8s.io/v1”, ????“level”:?“RequestResponse”, ????“auditID”:?“0ef468b9-2a51-4aff-94a3-c6ac23a208cd”, ????“stage”:?“ResponseComplete”, ????“requestURI”:?“/api/v1/namespaces/kube-system/endpoints/k8s.io-minikube-hostpath”, ????“verb”:?“update”, ????“user”:?{ ????????“username”:?“system:serviceaccount:kube-system:storage-provisioner”, ????????“uid”:?“0cf59b55-fe9b-474e-8002-1a5f98481018”, ????????“groups”:?[ ????????????“system:serviceaccounts”, ????????????“system:serviceaccounts:kube-system”, ????????????“system:authenticated” ????????] ????}, ????“sourceIPs”:?[ ????????“10.8.58.159” ????], ????“userAgent”:?“storage-provisioner/v0.0.0?(linux/amd64)?kubernetes/$Format”, ????“objectRef”:?{ ????????“resource”:?“endpoints”, ????????“namespace”:?“kube-system”, ????????“name”:?“k8s.io-minikube-hostpath”, ????????“uid”:?“4b89abc0-a674-4a1f-b614-5ab16dbcb6ce”, ????????“apiVersion”:?“v1”, ????????“resourceVersion”:?“2160928” ????}, ????“responseStatus”:?{ ????????“metadata”:?{}, ????????“code”:?200 ????}, ????“requestObject”:?{ ????????“kind”:?“Endpoints”, ????????“apiVersion”:?“v1”, ????????“metadata”:?{ ????????????“name”:?“k8s.io-minikube-hostpath”, ????????????“namespace”:?“kube-system”, ????????????“uid”:?“4b89abc0-a674-4a1f-b614-5ab16dbcb6ce”, ????????????“resourceVersion”:?“2160928”, ????????????“creationTimestamp”:?“2021-12-06T06:48:26Z”, ????????????“labels”:?{ ????????????????“addonmanager.kubernetes.io/mode”:?“Reconcile” ????????????}, ????????????“annotations”:?{ ????????????????“control-plane.alpha.kubernetes.io/leader”:?“{“holderIdentity”:“10-8-58-159_2ae98eec-40ba-4e87-857f-03a3a59a115e”,“leaseDurationSeconds”:15,“acquireTime”:“2022-01-11T09:36:56Z”,“renewTime”:“2022-01-12T15:04:23Z”,“leaderTransitions”:2}”, ????????????????“kubectl.kubernetes.io/last-applied-configuration”:?“{“apiVersion”:“v1”,“kind”:“Endpoints”,“metadata”:{“annotations”:{},“labels”:{“addonmanager.kubernetes.io/mode”:“Reconcile”},“name”:“k8s.io-minikube-hostpath”,“namespace”:“kube-system”}}\n” ????????????}, ????????????“managedFields”:?[ ????????????????{ ????????????????????“manager”:?“storage-provisioner”, ????????????????????“operation”:?“Update”, ????????????????????“apiVersion”:?“v1”, ????????????????????“time”:?“2021-12-06T06:48:26Z”, ????????????????????“fieldsType”:?“FieldsV1”, ????????????????????“fieldsV1”:?{ ????????????????????????“f:metadata”:?{ ????????????????????????????“f:annotations”:?{ ????????????????????????????????“.”:?{}, ????????????????????????????????“f:control-plane.alpha.kubernetes.io/leader”:?{} ????????????????????????????} ????????????????????????} ????????????????????} ????????????????}, ????????????????{ ????????????????????“manager”:?“kubectl-client-side-apply”, ????????????????????“operation”:?“Update”, ????????????????????“apiVersion”:?“v1”, ????????????????????“time”:?“2021-12-22T02:14:03Z”, ????????????????????“fieldsType”:?“FieldsV1”, ????????????????????“fieldsV1”:?{ ????????????????????????“f:metadata”:?{ ????????????????????????????“f:annotations”:?{ ????????????????????????????????“f:kubectl.kubernetes.io/last-applied-configuration”:?{} ????????????????????????????}, ????????????????????????????“f:labels”:?{ ????????????????????????????????“.”:?{}, ????????????????????????????????“f:addonmanager.kubernetes.io/mode”:?{} ????????????????????????????} ????????????????????????} ????????????????????} ????????????????} ????????????] ????????} ????}, ????“responseObject”:?{ ????????“kind”:?“Endpoints”, ????????“apiVersion”:?“v1”, ????????“metadata”:?{ ????????????“name”:?“k8s.io-minikube-hostpath”, ????????????“namespace”:?“kube-system”, ????????????“uid”:?“4b89abc0-a674-4a1f-b614-5ab16dbcb6ce”, ????????????“resourceVersion”:?“2160929”, ????????????“creationTimestamp”:?“2021-12-06T06:48:26Z”, ????????????“labels”:?{ ????????????????“addonmanager.kubernetes.io/mode”:?“Reconcile” ????????????}, ????????????“annotations”:?{ ????????????????“control-plane.alpha.kubernetes.io/leader”:?“{“holderIdentity”:“10-8-58-159_2ae98eec-40ba-4e87-857f-03a3a59a115e”,“leaseDurationSeconds”:15,“acquireTime”:“2022-01-11T09:36:56Z”,“renewTime”:“2022-01-12T15:04:23Z”,“leaderTransitions”:2}”, ????????????????“kubectl.kubernetes.io/last-applied-configuration”:?“{“apiVersion”:“v1”,“kind”:“Endpoints”,“metadata”:{“annotations”:{},“labels”:{“addonmanager.kubernetes.io/mode”:“Reconcile”},“name”:“k8s.io-minikube-hostpath”,“namespace”:“kube-system”}}\n” ????????????}, ????????????“managedFields”:?[ ????????????????{ ????????????????????“manager”:?“storage-provisioner”, ????????????????????“operation”:?“Update”, ????????????????????“apiVersion”:?“v1”, ????????????????????“time”:?“2021-12-06T06:48:26Z”, ????????????????????“fieldsType”:?“FieldsV1”, ????????????????????“fieldsV1”:?{ ????????????????????????“f:metadata”:?{ ????????????????????????????“f:annotations”:?{ ????????????????????????????????“.”:?{}, ????????????????????????????????“f:control-plane.alpha.kubernetes.io/leader”:?{} ????????????????????????????} ????????????????????????} ????????????????????} ????????????????}, ????????????????{ ????????????????????“manager”:?“kubectl-client-side-apply”, ????????????????????“operation”:?“Update”, ????????????????????“apiVersion”:?“v1”, ????????????????????“time”:?“2021-12-22T02:14:03Z”, ????????????????????“fieldsType”:?“FieldsV1”, ????????????????????“fieldsV1”:?{ ????????????????????????“f:metadata”:?{ ????????????????????????????“f:annotations”:?{ ????????????????????????????????“f:kubectl.kubernetes.io/last-applied-configuration”:?{} ????????????????????????????}, ????????????????????????????“f:labels”:?{ ????????????????????????????????“.”:?{}, ????????????????????????????????“f:addonmanager.kubernetes.io/mode”:?{} ????????????????????????????} ????????????????????????} ????????????????????} ????????????????} ????????????] ????????} ????}, ????“requestReceivedTimestamp”:?“2022-01-12T15:04:23.035889Z”, ????“stageTimestamp”:?“2022-01-12T15:04:23.042363Z”, ????“annotations”:?{ ????????“authentication.k8s.io/legacy-token”:?“system:serviceaccount:kube-system:storage-provisioner”, ????????“authorization.k8s.io/decision”:?“allow”, ????????“authorization.k8s.io/reason”:?“RBAC:?allowed?by?RoleBinding?“system:persistent-volume-provisioner/kube-system”?of?Role?“system:persistent-volume-provisioner”?to?ServiceAccount?“storage-provisioner/kube-system”” ????} }
|