K8s日志解析

249 阅读22分钟

之前是负责组里对接k8s日志的,发现k8s日志体量庞大,很多字段都不知道相关含义。于是整理了这份日志解析的笔记。

1. objectRef

Kubernetes中,ObjectRef是一个API对象引用,用于标识出产生某些事件的相关资源对象。

  • responseObject.metadata.selfLink
"responseObject":{
    "metadata":{
        ……
        "selfLink":"/api/v1/namespaces/ns-faas-online-a/pods/k8s-online-5n9m6a",
        ……
    }
}
  • objectRef
// 其实就是把 requestURI 进行了拆解
"objectRef":{
    "apiVersion":"v1", // 被引用的 API 版本
    "resource":"pods", // 被引用对象的资源类别
    "namespace":"ns-faas-online-a", // 被引用对象的命名空间
    "name":"k8s-online-5n9m6a" // 被引用对象的名称
}

这里的objectRef包含了几关键字段:apiVersionresourcenamespacename。这些字段组合在一起可以唯一地标识出一个API对象。

2. level

"level":"RequestResponse" // 日志中会记录元数据,请求和响应的消息体

这里指的level是Audit Level(审计级别) ,已定义的审计级别有:

  • None:不记录日志
  • Metadata:记录请求的元数据(请求的用户、时间戳、资源、动词等等), 但是不记录请求或者响应的消息体
  • Request:记录事件的元数据和请求的消息体,但是不记录响应的消息体
  • RequestResponse:记录事件的元数据,请求和响应的消息体

3. kind

Kubernetes 中,Event 是一种资源类型,它用于记录群集中发生的事件。当 Kubernetes 中的某些事件发生时,例如 Pod 的创建、删除、重启等,相关的事件信息将被记录在 Event 资源中,以供用户和管理员查看。

K8s 日志中,kind 为 Event 表示该日志记录了一个事件,如本条日志就记录了一个 Pod 的重启事件。

4. verb

verb 表示针对 API 资源所执行的操作,有一些其他常见的 verb

  • get:获取资源或资源列表
  • create:创建新的资源
  • delete:删除现有的资源
  • update:更新现有的资源
  • patch:更新部分资源(即打补丁)
patchupdate区别:
  • 在使用 patch 进行更新时,你只需要提供变更的 JSON 内容,K8s 会自动帮你进行合并更新
  • update 需要提供完整的资源定义,你提供的内容就是最终的定义

5. annotations

Kubernetes中的对象被创建或更新时,可以使用annotations字段向对象添加任意键/值对。annotations 是 key/value 形式附加于对象的注解。

虽然labelsannotations在某些情况下的作用类似,但是它们的目的和使用场景还是有所不同的。

labelsKubernetes资源对象的元数据,它用于标识和组织对象,通常被用于进行选择器过滤,帮助用户快速定位和管理相关的资源对象。比如,我们可以使用kubectl命令来根据标签选择指定的Pod,Service等资源。

annotations也是Kubernetes资源对象的元数据,但它的作用更多的是用于存储和传递一些辅助信息,如版本号、构建信息、环境变量等。与labels不同,annotations不参与资源的选择和过滤,更多的是用于传递自定义的元数据。

"annotations":{
    "rbac.authorization.k8s.io/decision":"allow", // 权限决策,这里是允许
    "rbac.authorization.k8s.io/reason":"" // 权限原因,这里为空
}

6. userAgent

userAgent 中记录客户端所报告的用户代理(User Agent)字符串。 注意 userAgent 信息是由客户端提供的,不具有可信性。

"userAgent":"kubelet/v1.14.0 (linux/amd64) kubernetes/2gb7683"
  • 组件名称:kubelet
  • 版本号:v1.14.0
  • 运行环境:linux/amd64
  • Kubernetes 版本号:2gb7683

7. stage

stage(阶段) 表示Kubernetes API Server 请求处理的阶段,已定义的阶段有:

  • RequestReceived:表示 Kubernetes API Server 已经接收到了一个请求,并在处理请求之前记录了一些基本信息。这些信息包括请求的 HTTP 方法、路径、头部等,并进行了一些基本的请求校验,例如检查请求是否符合预期的格式等。
  • ResponseStarted:表示 Kubernetes API Server 已经开始向客户端发送响应消息的头部。这个阶段只会在一些长时间运行的请求(如 watch)中生成,通常用于记录响应的详细信息。
  • ResponseComplete:表示 Kubernetes API Server 已经完全回复了一个请求,并且回复已经被发送回客户端。在这个阶段,Kubernetes 会记录请求处理的最终结果,例如响应的状态码、body、响应时间等。
  • Panic:表示当发生 panic 时生成。Panic 是一种程序错误,当发生不可恢复的错误时,程序会在 panic 时崩溃并停止运行。在 Kubernetes API Server 中,当发生 panic 时,它会记录一些信息以帮助调试问题。

8. responseObject

响应中包含的 API 对象,以 JSON 格式呈现。responseObject 是在被转换为外部类型并序列化为 JSON 格式之后才被记录的。 对于非资源请求,此字段会被忽略。 只有审计级别为 RequestResponse 时才会记录。

每个API对象(responseObject、requestObject)都有3大类属性:元数据metadata、规范spec和状态status

8.1 metadata

元数据是用来标识API对象的,每个对象都至少有3个元数据:namespacenameuid;除此以外还有各种各样的标签labels用来标识和匹配不同的对象。

例如,用户可以用标签env来标识区 分不同的服务部署环境,分别用env=devenv=testingenv=production来标识开发、 测试、生产的不同服务。

"metadata":{
    "uid":"489e47ea-d95d-12ed-c4z1-fa37123asdfg",
    "finalizers":[
        "finalizer.stable.example.com"
    ],
    "resourceVersion":"1369468852",
    "name":"k8s-online-5n9m6a",
    "namespace":"ns-faas-online-a",
    "creationTimestamp":"2023-04-11T11:37:21Z",
    "annotations":{
        "imageregistry": "https://hub.docker.com/"
    },
    "generateName":"k8s-online-",
    "selfLink":"/api/v1/namespaces/ns-faas-online-a/pods/k8s-online-5n9m6a",
    "labels":{
        "service":"faas-redis",
        "env": "testing"
    },
    "ownerReferences":[
        {
            "controller":true,
            "apiVersion":"networking.istio.io/v1alpha3",
            "kind":"ReplicaSet",
            "name":"k8s-online",
            "blockOwnerDeletion":true
        }
    ]
}

8.1.1 Finalizer

Finalizer 用于实现控制器的异步预删除钩子,可以通过 metadata.finalizers 来指定 Finalizer

Finalizer 指定后,客户端删除对象的操作只会设置 metadata.deletionTimestamp 而不是直接删除。

比如,当你告诉 Kubernetes 删除一个指定了 Finalizer 的对象时, Kubernetes API 通过填充 metadata.deletionTimestamp 来标记要删除的对象, 并返回 202 状态码(HTTP "已接受")使其进入只读状态。 此时控制平面或其他组件会采取 Finalizer 所定义的行动, 而目标对象仍然处于终止中(Terminating)的状态。 这些行动完成后,控制器会删除目标对象相关的 Finalizer。 当 metadata.finalizers 字段为空时,Kubernetes 认为删除已完成并删除对象。

你可以使用 Finalizer 控制资源的垃圾收集。 例如,你可以定义一个 Finalizer,在删除目标资源前清理相关资源或基础设施。

"finalizers":[
    "finalizer.stable.example.com"
]

8.1.2 ownerReferences

ownerReferences 字段表示当前 Pod 对象的所有者信息。在Kubernetes中,一个资源对象可能由多个对象创建,其中一个对象成为该资源对象的所有者,被称为“控制器”(controller)。控制器通过 ownerReferences 字段来维护其拥有的资源对象之间的层次关系,例如:ReplicaSet 是一组 Pod 的所有者。

ownerReferences 字段是一个数组,每个元素表示一个所有者引用,其中包含以下字段:

  • apiVersion:所有者的 API 版本号
  • kind:所有者的种类
  • name:所有者的名称
  • uid:所有者的 UID
  • controller:标识所有者是否是该 Pod 的控制器,值为 true/false
  • blockOwnerDeletion:标识删除该 Pod 时是否删除所有者,值为 true/false
"ownerReferences":[
    {
        "controller":true,
        "apiVersion":"networking.istio.io/v1alpha3",
        "kind":"ReplicaSet",
        "name":"k8s-online",
        "blockOwnerDeletion":true
    }
]

在上面的日志中,ownerReferences 中的元素表示该 Pod 的所有者为一个名为 "k8s-online" 的 ReplicaSet,即该 Pod 是该 ReplicaSet 的控制器和被拥有者。其中,controller 值为 true 表示该 ReplicaSet 是该 Pod 的控制器,blockOwnerDeletion 值为 true 表示删除该 Pod 时会删除该 ReplicaSet。当删除该 Pod 时,Kubernetes 会根据 ownerReferences 中的信息,同时删除该 Pod 的所有者 ReplicaSet,以确保资源的正确性和一致性。

8.2 spec

K8s中所有的配置都是通过API对象的spec去设置的,创建 Kubernetes 对象时,必须提供对象的 spec,用来描述该对象的期望状态, 以及关于对象的一些基本信息。

关于spec字段的详细说明:kubernetes.io/zh-cn/docs/…

8.2.1 volumes

容器中的文件在磁盘上是临时存放的,这给容器中运行的较重要的应用程序带来一些问题。 问题之一是当容器崩溃时文件丢失。 kubelet 会重新启动容器,但容器会以干净的状态重启。 第二个问题会在同一 Pod 中运行多个容器并共享文件时出现。 Kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题。

卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。

使用卷时, 在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中声明卷在容器中的挂载位置。

卷挂载在镜像中的指定路径下。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置。

"spec":{
    ……
    "volumes":[
        {
            "name":"mysecret",
            "secret":{
                "secretName":"mysecret",
                "optional":true
            }
        },
        {
            "name":"cat",
            "hostPath":{
                "path":"/data/appdatas/cat",
                "type":"Directory"
            }
        },
        {
            "name":"webapps",
            "hostPath":{
                "path":"/data/webapps",
                "type":"Directory"
            }
        },
        {
            "name":"metadata",
            "hostPath":{
                "path":"/data/metadata",
                "type":"Directory"
            }
        },
        {
            "name":"c-0-applog-vol",
            "hostPath":{
                "path":"/data0/logs/faas-redis/k8s-online-5n9m6a/redis",
                "type":"DirectoryOrCreate"
            }
        }
    ]
}

这个 Pod 中定义了5个存储卷:

  1. mysecret : 这个卷是一个 Secret 类型的卷,Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod Spec中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
  2. cat: 这个卷是一个 hostPath 类型的卷,将宿主机上的 /data/appdatas/cat 目录挂载到容器中。
  3. webapps: 这个卷是一个 hostPath 类型的卷,将宿主机上的 /data/webapps 目录挂载到容器中。
  4. metadata: 这个卷是一个 hostPath 类型的卷,将宿主机上的 /data/metadata 目录挂载到容器中。
  5. c-0-applog-vol: 这个卷是一个 hostPath 类型的卷,将宿主机上的 /data0/logs/faas-redis/k8s-online-5n9m6a/redis 目录挂载到容器中。该卷具有 DirectoryOrCreate 类型,因此如果该目录不存在,则会在容器内创建该目录。

8.2.2 securityContext

SecurityContext 包含 Pod 级别的安全属性和常见的容器设置。 可选:默认为空。

"securityContext":{
    "sysctls":[
        {
            "name":"net.core.somaxconn",
            "value":"8192"
        },
        {
            "name":"net.ipv4.tcp_slow_start_after_idle",
            "value":"0"
        }
    ]
}
  1. net.core.somaxconn: 这个参数定义了系统上可以排队等待的未完成连接的最大数量。这个参数的值影响了服务器能够处理的并发连接数,因此在高负载的服务器环境中需要将这个参数设置为较高的值。这里将其设置为8192。
  2. net.ipv4.tcp_slow_start_after_idle: 这个参数定义了TCP连接的空闲时间(单位:秒),超过这个时间后,TCP连接的慢启动阶段将被跳过。这个参数的默认值是1,表示当连接处于空闲状态1秒钟后,TCP连接将进入慢启动阶段。将这个参数设置为0可以避免连接的慢启动阶段,从而加速TCP连接的建立过程。

8.2.3 tolerations

tolerations字段用于定义Pod的容忍度,即Pod对于一些节点(宿主机)状态的容忍程度。在Kubernetes中,节点可能会因为各种原因出现故障,例如内存压力过大、节点不可用等等。当这些情况发生时,Kubernetes会阻止调度Pod到该节点上,以保证应用的高可用性。

然而,在某些情况下,我们可能希望Pod仍然能够被调度到这些节点上运行,以充分利用资源或者进行故障恢复等。这时候,我们就可以通过在Pod中定义tolerations字段来告诉Kubernetes,这些节点状态对于我们的应用来说是可以容忍的。

"tolerations":[
    {
        "effect":"NoSchedule",
        "key":"node.kubernetes.io/memory-pressure",
        "operator":"Exists"
    },
    {
        "effect":"NoExecute",
        "tolerationSeconds":300,
        "key":"node.kubernetes.io/not-ready",
        "operator":"Exists"
    },
    {
        "effect":"NoExecute",
        "tolerationSeconds":300,
        "key":"node.kubernetes.io/unreachable",
        "operator":"Exists"
    }
]

上面的tolerations字段定义了三个容忍度规则:

  • 第一个规则表示:如果节点内存压力过大,Pod仍然可以被调度到该节点上。
  • 第二个规则表示:如果节点处于NotReady状态,Pod可以在300秒内继续运行在该节点上。
  • 第三个规则表示:如果节点处于Unreachable状态,Pod可以在300秒内继续运行在该节点上。

tolerations的字段说明如下:

字段名说明
effect指示要容忍的效果,空值则意味着匹配所有效果。如果要设置此字段,允许的值为 NoSchedulePreferNoScheduleNoExecute 之一。NoSchedule表示节点状态会阻止Pod被调度到该节点上,NoExecute表示节点状态会导致该节点上已经运行的Pod被驱逐
tolerationSeconds表示容忍时间,单位为秒。如果该字段未设置,则表示Pod可以一直在该节点上运行。
operator表示键与值(value)之间的匹配关系,默认为Equal,也可以设置为Exists,表示只匹配键。
keykey 是容忍度所适用的污点的键名。此字段为空意味着匹配所有的污点键。 如果 key 为空,则 operator 必须为 Exists;这种组合意味着匹配所有值和所有键
valuevalue 是容忍度所匹配的污点值。如果 operator 为 Exists,则此 value 值应该为空, 否则 value 值应该是一个正常的字符串。

8.2.4 其他

"dnsPolicy":"None",
"nodeName":"aaabbb-0.host.net",
"terminationGracePeriodSeconds":30,
"enableServiceLinks":true,
"serviceAccountName":"default",
"dnsConfig":{
    "nameservers":[
        "111.222.1.2"
    ]
},
"readinessGates":[
    {
        "conditionType":"www.example.com/servicediscovery-ready"
    }
],
"imagePullSecrets":[
    {
        "name":"myregistrykey"
    }
],
"priorityClassName":"online-low",
"priority":-1000,
"restartPolicy":"Never",
"schedulerName":"default-scheduler"
"serviceAccount":"default", 
字段名说明
dnsPolicy为 Pod 设置 DNS 策略。默认为 "ClusterFirst", "None"表示 Pod 不会自动配置 DNS
terminationGracePeriodSecondsPod 终止的优雅期限,即 Pod 被删除前等待多少秒让它处理完尚未完成的任务
enableServiceLinks是否将有关服务的信息注入到 Pod 的环境变量中,默认值为True
serviceAccountName用于运行此 Pod 的服务账号的名称
dnsConfig.nameserversDNS 服务器的 IP 地址列表。此列表将被追加到基于 dnsPolicy 生成的基本名字服务器列表。 重复的名字服务器将被删除。
readinessGates如果设置了此字段,则将评估所有就绪门控(Readiness Gate)以确定 Pod 就绪状况。 当所有容器都已就绪,并且就绪门控中指定的所有状况的 status 都为 "true" 时,Pod 被视为就绪。
imagePullSecrets要从私有仓库拉取镜像,Kubernetes 需要凭证。 配置文件中的 imagePullSecrets 字段表明 Kubernetes 应该通过名为 myregistrykey 的 Secret 获取凭证。imagePullSecrets是对同一命名空间中 Secret 的引用的列表,可以用于拉取此 Pod spec中使用的任何镜像,此字段可选。 如果指定,这些 Secret 将被传递给各个镜像拉取组件(Puller)实现供其使用
priorityClassName如果设置了此字段,则用来标明 Pod 的优先级。 "system-node-critical""system-cluster-critical" 是两个特殊关键字, 分别用来表示两个最高优先级,前者优先级更高一些。 任何其他名称都必须通过创建具有该名称的 PriorityClass 对象来定义。 如果未指定此字段,则 Pod 优先级将为默认值。如果没有默认值,则为零。
priority优先级值。各种系统组件使用该字段来确定 Pod 的优先级。 字段值越高,优先级越高。
restartPolicyPod 内所有容器的重启策略,可选值为AlwaysOnFailureNever,默认为 Always
schedulerName如果设置了此字段,则 Pod 将由指定的调度器调度。如果未指定,则使用默认调度器来调度 Pod。
serviceAccount此字段已被弃用,改用 serviceAccountName

8.3 spec.containers

Pod 的容器列表。Pod 中必须至少有一个容器。无法更新。

8.3.1 image

image:容器镜像名称,通常会创建应用的容器镜像并将其推送到某仓库(Registry),然后在 Pod 中引用它。

"containers":[
    {
        "image":"fictional.registry.example/faas-redis",
        ……
    }
]

8.3.2 imagePullPolicy

镜像拉取策略,有以下几个值

  • IfNotPresent:只有当镜像在本地不存在时才会拉取。
  • Always:每次 kubelet 启动容器时,kubelet 都会查询容器镜像仓库以获取镜像摘要,然后根据摘要拉取镜像。如果本地已缓存该摘要对应的镜像,kubelet 就会使用其缓存的镜像,否则 kubelet 将会拉取镜像并使用该镜像启动容器。
  • Never:Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。
"containers":[
    {
        "imagePullPolicy":"IfNotPresent",
        ……
    }
]

8.3.3 probes(探针)

8.3.3.1 livenessProbe

livenessProbe用于判断容器是否存活,如果探针失败,容器将重新启动。无法更新。

"livenessProbe":{
    "failureThreshold":30,
    "timeoutSeconds":1,
    "periodSeconds":3,
    "successThreshold":1,
    "httpGet":{
        "path":"/api/health/liveness",
        "scheme":"HTTP",
        "port":32078
    }
}
8.3.3.2 readinessProbe

readinessProbe用于定期检查容器是否已经准备好接受流量,如果容器已经准备好,则返回成功的状态码。如果探针失败,容器将被从服务端点中删除。无法更新。

"readinessProbe":{
    "failureThreshold":3,
    "timeoutSeconds":1,
    "periodSeconds":1,
    "successThreshold":1,
    "httpGet":{
        "path":"/api/health/readiness",
        "scheme":"HTTP",
        "port":32078
    }
}
8.3.3.3 字段说明
字段名说明
failureThreshold如果容器连续失败了多少次 livenessProbe 检查,则将其标记为失败。默认为 3。最小值为 1。
timeoutSeconds探针超时的秒数。默认为 1 秒。最小值为 1。
periodSeconds执行连续探针检查之间的时间间隔,单位为秒。默认为 10 秒。最小值为 1。
successThreshold探针失败后最小连续成功次数,超过此阈值才会被视为探针成功。默认为 1。最小值为 1。在此配置中,只要容器返回任何响应,即被视为成功。
httpGet定义执行 livenessProbe 检查所需的 HTTP GET 请求的细节,例如请求路径、协议和端口。

8.3.4 terminationMessagePolicy & terminationMessagePath

  • terminationMessagePolicy:容器终止后的消息策略。File表示将容器的终止信息记录到指定的文件中
  • terminationMessagePath:容器终止消息写入到该路径下的文件
"containers":[
	{
		"terminationMessagePolicy":"File",
        "terminationMessagePath":"/dev/termination-log",
		……
	}
]

8.3.5 resources

  • requests:所需的最小计算资源量
  • limits:所允许的最大计算资源量
"resources":{
    // 最小内存为 2Gi,最小 CPU 为 1
    "requests":{
        "memory":"2Gi",
        "cpu":"1"
    },
    // 最大内存为 2Gi,最大 CPU 为 1
    "limits":{
        "memory":"2Gi",
        "cpu":"1"
    }
}

8.3.6 securityContext

SecurityContext 定义了容器应该运行的安全选项。如果设置,SecurityContext 的字段将覆盖 PodSecurityContext 的等效字段。更多信息: kubernetes.io/zh-cn/docs/…

SecurityContext 保存将应用于容器的安全配置。某些字段在 SecurityContext 和 PodSecurityContext 中都存在。 当两者都设置时,SecurityContext 中的值优先。

"securityContext":{
    "privileged":true, // 特权容器
    "capabilities":{
​
    }
}

8.3.7 env(环境变量)

要在容器中设置的环境变量列表,无法更新。

"env":[
    {
        // Pod 的名称
        "name":"POD_NAME",
        "valueFrom":{
            "fieldRef":{
                "apiVersion":"v1",
                "fieldPath":"metadata.name"
            }
        }
    },
    {
        // Pod 的唯一标识符
        "name":"POD_UID",
        "valueFrom":{
            "fieldRef":{
                "apiVersion":"v1",
                "fieldPath":"metadata.uid"
            }
        }
    },
    {
        // Pod 的 IP 地址
        "name":"POD_IP",
        "valueFrom":{
            "fieldRef":{
                "apiVersion":"v1",
                "fieldPath":"status.podIP"
            }
        }
    },
    {
        // 发布ID
        "name":"RELEASE_ID",
        "value":"2512862"
    },
    {
        // 发布来源
        "name":"RELEASE_FROM",
        "value":"FAAS"
    }  
]

8.3.8 volumeMounts(挂载点)

volumeMounts表示 Pod 卷在容器中的挂载位置。临时容器不允许子路径挂载。无法更新。

"volumeMounts":[
    {
        "mountPath":"/var/run/secrets/kubernetes.io/serviceaccount",
        "name":"mysecret",
        "readOnly":true
    },
    {
        "mountPath":"/data/appdatas/cat",
        "name":"cat"
    },
    {
        "mountPath":"/data/webapps",
        "name":"webapps",
        "readOnly":true
    },
    {
        "mountPath":"/data/metadata",
        "name":"metadata",
        "readOnly":true
    },
    {
        "mountPath":"/app/logs",
        "name":"c-0-applog-vol"
    }
]

以上配置表示有5个挂载点:

  • "/var/run/secrets/kubernetes.io/serviceaccount":用于容器与 Kubernetes API 服务器进行身份验证的凭据。
  • "/data/appdatas/cat":一个名为 "cat" 的卷的挂载点。
  • "/data/webapps":一个名为 "webapps" 的只读卷的挂载点。
  • "/data/metadata":一个名为 "metadata" 的只读卷的挂载点。
  • "/app/logs":一个名为 "c-0-applog-vol" 的卷的挂载点。

字段说明如下:

字段名说明
mountPath容器内安装卷的路径,不能包含 ':'
name此字段必须与卷的名称匹配
readOnly如果为 true,则挂载卷为只读,否则为读写(false 或未指定)。默认值为 false。

8.4 status

Status 表示有关 Pod 状态的信息。状态内容可能会滞后于系统的实际状态。

8.4.1 phase

phase 是对 Pod 在其生命周期中所处位置的简单、高级摘要。 conditions 数组、reason 和 message 字段以及各个容器的 status 数组包含有关 Pod 状态的进一步详细信息。

phase 的取值有五种可能性:

  • Pending:Pod 已被 Kubernetes 系统接受,但尚未创建容器镜像。 这包括 Pod 被调度之前的时间以及通过网络下载镜像所花费的时间。
  • Running:Pod 已经被绑定到某个节点,并且所有的容器都已经创建完毕。至少有一个容器仍在运行,或者正在启动或重新启动过程中。
  • Succeeded:Pod 中的所有容器都已成功终止,不会重新启动。
  • Failed:Pod 中的所有容器都已终止,并且至少有一个容器因故障而终止。 容器要么以非零状态退出,要么被系统终止。
  • Unknown:由于某种原因无法获取 Pod 的状态,通常是由于与 Pod 的主机通信时出错。
"status":{
    "phase":"Running",
    ……
}

8.4.2 qosClass

QoS(Quality of Service),大部分译为“服务质量等级”,又译作“服务质量保证”,是作用在 Pod 上的一个配置,当 Kubernetes 创建一个 Pod 时,它就会给这个 Pod 分配一个 QoS 等级。

qosClass有以下几种取值:

  • Guaranteed:Pod 里的每个容器都必须有内存/CPU 限制和请求,而且值必须相等。
  • Burstable:Pod 里至少有一个容器有内存或者 CPU 请求且不满足 Guarantee 等级的要求,即内存/CPU 的值设置的不同。
  • BestEffort:容器必须没有任何内存或者 CPU 的限制或请求。
"status":{
	"qosClass":"Guaranteed",
	……
}

8.4.3 containerStatuses

containerStatuses列表中针对清单中的每个容器都有一个条目。

"containerStatuses":[
    {
        "image":"fictional.registry.example/faas-redis",
        "imageID":"docker-pullable://xxxxxxxxxxxxxxxxxxxxxxxx",
        "restartCount":0, // 容器重启的次数
        "ready":false, // 容器是否准备就绪
        "name":"redis",
        "state":{
            "running":{
                "startedAt":"2023-04-11T11:38:06Z"
            }
        },
        "lastState":{
            // 有关容器上次终止状况的详细信息
        },
        "containerID":"docker://xxxxxxxxxxxxxxxxxxxxxxxx"
    }
]

8.4.4 conditions

conditions 字段,用于描述 Pod 的健康状态。每个 condition 字段都有以下几个属性:

字段名说明
typePod 状况的名称
status该 condition 的状态,可能的取值有 "True"、"False" 或 "Unknown"
lastProbeTime上次探测 Pod 状况时的时间戳
lastTransitionTimePod 上次从一种状态转换到另一种状态时的时间戳
reason机器可读的、驼峰编码(UpperCamelCase)的文字,表述上次状况变化的原因
message人类可读的消息,给出上次状态转换的详细信息
"conditions":[
    {
        "reason":"ServiceDiscoveryReady",
        // 与 spec.readinessGates.conditionType 对应
        "type":"www.example.com/servicediscovery-ready", 
        "lastTransitionTime":"2023-04-11T11:38:07Z",
        "message":"No associated servicediscovery",
        "status":"True"
    },
    {
        "type":"Initialized",
        "lastTransitionTime":"2023-04-11T11:37:51Z",
        "status":"True"
    },
    {
        "reason":"ContainersNotReady",
        "type":"Ready",
        "lastTransitionTime":"2023-04-11T11:37:51Z",
        "message":"containers with unready status: [redis]",
        "status":"False"
    },
    {
        "reason":"ContainersNotReady",
        "type":"ContainersReady",
        "lastTransitionTime":"2023-04-11T11:37:51Z",
        "message":"containers with unready status: [redis]",
        "status":"False"
    },
    {
        "type":"PodScheduled",
        "lastTransitionTime":"2023-04-11T11:37:51Z",
        "status":"True"
    }
]

8.4.5 其他

字段名说明
podIp分配给 Pod 的 IP 地址。至少在集群内可路由。如果尚未分配则为空。
hostIPPod 被调度到的宿主机的 IP 地址。如果尚未被调度,则为字段为空。
startTimekubelet 确认 Pod 对象的日期和时间,格式遵从 RFC 3339。 此时间点处于 kubelet 为 Pod 拉取容器镜像之前。

9. 附录

完整的k8s日志

{
    "auditID":"d037ea0gnmioaaa-2475-4725-878d-d037ea0gnmioaaa",
    "requestReceivedTimestamp":"2023-04-11T11:41:01.470247Z",
    "objectRef":{
        "apiVersion":"v1",
        "resource":"pods",
        "namespace":"ns-faas-online-a",
        "name":"k8s-online-5n9m6a"
    },
    "level":"RequestResponse",
    "kind":"Event",
    "verb":"patch",
    "annotations":{
        "rbac.authorization.k8s.io/decision":"allow",
        "rbac.authorization.k8s.io/reason":""
    },
    "userAgent":"kubelet/v1.14.0 (linux/amd64) kubernetes/2gb7683",
    "requestURI":"/api/v1/namespaces/ns-faas-online-a/pods/k8s-online-5n9m6a",
    "responseStatus":{
        "metadata":{
​
        },
        "code":200
    },
    "stageTimestamp":"2023-04-11T11:41:01.482170Z",
    "sourceIPs":[
        "100.83.59.24"
    ],
    "responseObject":{
        "metadata":{
            "uid":"489e47ea-d95d-12ed-c4z1-fa37123asdfg",
            "finalizers":[
                "finalizer.stable.example.com"
            ],
            "resourceVersion":"1369468852",
            "name":"k8s-online-5n9m6a",
            "namespace":"ns-faas-online-a",
            "creationTimestamp":"2023-04-11T11:37:21Z",
            "annotations":{
                "imageregistry": "https://hub.docker.com/"
            },
            "generateName":"k8s-online-",
            "selfLink":"/api/v1/namespaces/ns-faas-online-a/pods/k8s-online-5n9m6a",
            "labels":{
                "service":"faas-redis",
                "env": "testing"
            },
            "ownerReferences":[
                {
                    "controller":true,
                    "apiVersion":"networking.istio.io/v1alpha3",
                    "kind":"ReplicaSet",
                    "name":"k8s-online",
                    "blockOwnerDeletion":true
                }
            ]
        },
        "apiVersion":"v1",
        "kind":"Pod",
        "spec":{
            "dnsPolicy":"None",
            "nodeName":"aaabbb-0.host.net",
            "terminationGracePeriodSeconds":30,
            "enableServiceLinks":true,
            "serviceAccountName":"default",
            "dnsConfig":{
                "nameservers":[
                    "111.222.1.2"
                ]
            },
            "readinessGates":[
                {
                    "conditionType":"www.example.com/servicediscovery-ready"
                }
            ],
            "imagePullSecrets":[
                {
                    "name":"myregistrykey"
                }
            ],
            "volumes":[
                {
                    "name":"mysecret",
                    "secret":{
                        "secretName":"mysecret",
                        "optional":true
                    }
                },
                {
                    "name":"cat",
                    "hostPath":{
                        "path":"/data/appdatas/cat",
                        "type":"Directory"
                    }
                },
                {
                    "name":"webapps",
                    "hostPath":{
                        "path":"/data/webapps",
                        "type":"Directory"
                    }
                },
                {
                    "name":"metadata",
                    "hostPath":{
                        "path":"/data/metadata",
                        "type":"Directory"
                    }
                },
                {
                    "name":"c-0-applog-vol",
                    "hostPath":{
                        "path":"/data0/logs/faas-redis/k8s-online-5n9m6a/redis",
                        "type":"DirectoryOrCreate"
                    }
                }
            ],
            "priorityClassName":"online-low",
            "serviceAccount":"default",
            "securityContext":{
                "sysctls":[
                    {
                        "name":"net.core.somaxconn",
                        "value":"8192"
                    },
                    {
                        "name":"net.ipv4.tcp_slow_start_after_idle",
                        "value":"0"
                    }
                ]
            },
            "priority":-1000,
            "restartPolicy":"Never",
            "tolerations":[
                {
                    "effect":"NoSchedule",
                    "key":"node.kubernetes.io/memory-pressure",
                    "operator":"Exists"
                },
                {
                    "effect":"NoExecute",
                    "tolerationSeconds":300,
                    "key":"node.kubernetes.io/not-ready",
                    "operator":"Exists"
                },
                {
                    "effect":"NoExecute",
                    "tolerationSeconds":300,
                    "key":"node.kubernetes.io/unreachable",
                    "operator":"Exists"
                }
            ],
            "containers":[
                {
                    "image":"fictional.registry.example/faas-redis",
                    "livenessProbe":{
                        "failureThreshold":30,
                        "timeoutSeconds":1,
                        "periodSeconds":3,
                        "successThreshold":1,
                        "httpGet":{
                            "path":"/api/health/liveness",
                            "scheme":"HTTP",
                            "port":32078
                        }
                    },
                    "imagePullPolicy":"IfNotPresent",
                    "terminationMessagePolicy":"File",
                    "terminationMessagePath":"/dev/termination-log",
                    "name":"redis",
                    "resources":{
                        "requests":{
                            "memory":"2Gi",
                            "cpu":"1"
                        },
                        "limits":{
                            "memory":"2Gi",
                            "cpu":"1"
                        }
                    },
                    "readinessProbe":{
                        "failureThreshold":3,
                        "timeoutSeconds":1,
                        "periodSeconds":1,
                        "successThreshold":1,
                        "httpGet":{
                            "path":"/api/health/readiness",
                            "scheme":"HTTP",
                            "port":32078
                        }
                    },
                    "securityContext":{
                        "privileged":true,
                        "capabilities":{
​
                        }
                    },
                    "env":[
                        {
                            "name":"POD_NAME",
                            "valueFrom":{
                                "fieldRef":{
                                    "apiVersion":"v1",
                                    "fieldPath":"metadata.name"
                                }
                            }
                        },
                        {
                            "name":"POD_UID",
                            "valueFrom":{
                                "fieldRef":{
                                    "apiVersion":"v1",
                                    "fieldPath":"metadata.uid"
                                }
                            }
                        },
                        {
                            "name":"POD_IP",
                            "valueFrom":{
                                "fieldRef":{
                                    "apiVersion":"v1",
                                    "fieldPath":"status.podIP"
                                }
                            }
                        },
                        {
                            "name":"RELEASE_ID",
                            "value":"2512862"
                        },
                        {
                            "name":"RELEASE_FROM",
                            "value":"FAAS"
                        }
                    ],
                    "volumeMounts":[
                        {
    "mountPath":"/var/run/secrets/kubernetes.io/serviceaccount",
                            "name":"mysecret",
                            "readOnly":true
                        },
                        {
                            "mountPath":"/data/appdatas/cat",
                            "name":"cat"
                        },
                        {
                            "mountPath":"/data/webapps",
                            "name":"webapps",
                            "readOnly":true
                        },
                        {
                            "mountPath":"/data/metadata",
                            "name":"metadata",
                            "readOnly":true
                        },
                        {
                            "mountPath":"/app/logs",
                            "name":"c-0-applog-vol"
                        }
                    ]
                }
            ],
            "schedulerName":"default-scheduler"
        },
        "status":{
            "phase":"Running",
            "podIP":"10.11.12.120",
            "containerStatuses":[
                {
                    "image":"fictional.registry.example/faas-redis",
                    "imageID":"docker-pullable://xxxxxxxxxxxxxxxxxxxxxxxx",
                    "restartCount":0, // 容器重启的次数
                    "ready":false, // 容器是否准备就绪
                    "name":"redis",
                    "state":{
                        "running":{
                            "startedAt":"2023-04-11T11:38:06Z"
                        }
                    },
                    "lastState":{
                        // 有关容器上次终止状况的详细信息
​
                    },
                    "containerID":"docker://xxxxxxxxxxxxxxxxxxxxxxxx"
                }
            ],
            "hostIP":"10.11.12.123",
            "startTime":"2023-04-11T11:37:51Z",
            "qosClass":"Guaranteed",
            "conditions":[
                {
                    "reason":"ServiceDiscoveryReady",
                    "type":"www.example.com/servicediscovery-ready",
                    "lastTransitionTime":"2023-04-11T11:38:07Z",
                    "message":"No associated servicediscovery",
                    "status":"True"
                },
                {
                    "type":"Initialized",
                    "lastTransitionTime":"2023-04-11T11:37:51Z",
                    "status":"True"
                },
                {
                    "reason":"ContainersNotReady",
                    "type":"Ready",
                    "lastTransitionTime":"2023-04-11T11:37:51Z",
                    "message":"containers with unready status: [redis]",
                    "status":"False"
                },
                {
                    "reason":"ContainersNotReady",
                    "type":"ContainersReady",
                    "lastTransitionTime":"2023-04-11T11:37:51Z",
                    "message":"containers with unready status: [redis]",
                    "status":"False"
                },
                {
                    "type":"PodScheduled",
                    "lastTransitionTime":"2023-04-11T11:37:51Z",
                    "status":"True"
                }
            ]
        }
    },
    "apiVersion":"audit.k8s.io/v1",
    "stage":"ResponseComplete",
    "requestObject":{
        "metadata":{
            "annotations":{
                "msg":"this is a example"
            }
        }
    },
    "user":{
        "groups":[
            "system:nodes",
            "system:authenticated"
        ],
        "username":" system:node:aaabbb-0.host.net"
    }
}