一、现象
在生产环境中遇到 api-server 服务发生陆续重启的现象, 查看监控,APIServer 所在的 master 节点的CPU、内存和网络流量发生抖动。
在 APIServer 日志中可以看到日志中存在 it has no resources 的警告日志:
{
"log":"W0814 03:04:44.058851 1 genericapiserver.go:342] Skipping API image.openshift.io/1.0 because it has no resources.\n","stream":"stderr","time":"2020-08-14T03:04:44.059033849Z"}
{
"log":"W0814 03:04:44.058851 1 genericapiserver.go:342] Skipping API image.openshift.io/1.0 because it has no resources.\n","stream":"stderr","time":"2020-08-14T03:04:44.059033849Z"}
{
"log":"W0814 03:04:49.422600 1 genericapiserver.go:342] Skipping API pre012 because it has no resources.\n","stream":"stderr","time":"2020-08-14T03:04:49.422708175Z"}
二、源码分析
查阅源码,警告日志的地方发生在 staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go 文件中的 installAPIResources 方法:
func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo) error {
for _, groupVersion := range apiGroupInfo.PrioritizedVersions {
if len(apiGroupInfo.VersionedResourcesStorageMap[groupVersion.Version]) == 0 {
glog.Warningf("Skipping API %v because it has no resources.", groupVersion)
continue
}
...
}
return nil
}
apiGroupInfo 的 VersionedResourcesStorageMap 字段用于存储资源版本、资源和资源存储对象的映射关系,其表现形式为 map[string]map[string]rest.Storage,比如 Pod 资源与资源对象的映射关系为:v1/pods/PodStorage (资源版本/资源/资源存储对象)。
那么资源存储对象是什么呢?
type PodStorage struct {
Pod *REST
Binding *BindingREST
Eviction *EvictionREST
Status *StatusREST
Log