从源码看k8s 1.36新特性PodsAPI

背景

k8s 1.36前想要获取节点当前运行的pod信息只能从apiserver获取,这样不仅不安全而且扩展性很差

在k8s 1.36中,新增了PodsAPI特性,开启后可以从kubelet获取当前节点的pod信息

源码

cmd/kubelet/app/server.go中

启动kubelet
func startKubelet(ctx context.Context, k kubelet.Bootstrap, podCfg *config.PodConfig, kubeCfg *kubeletconfiginternal.KubeletConfiguration, kubeDeps *kubelet.Dependencies, enableServer bool) {
    ...
    启动PodsAPI服务
    go k.ListenAndServePods(ctx)
}

pkg/kubelet/kubelet.go

启动PodsAPI服务

func (kl *Kubelet) ListenAndServePods(ctx context.Context) {
    if utilfeature.DefaultFeatureGate.Enabled(features.PodsAPI) {
        默认路径/var/lib/kubelet/pods-api/pods-api.sock
        endpoint, err := util.LocalEndpoint(kl.getPodsAPIDir(), pods.Socket)
        if err != nil {
            klog.FromContext(ctx).Error(err, "Failed to get local endpoint for pod api")
            return
        }
        server.ListenAndServePodsServer(
            ctx,
            endpoint,
            kl.podsServer,
        )
    }
}

pkg/kubelet/server/server.go

实际启动PodsAPI服务
func ListenAndServePodsServer(ctx context.Context, endpoint string, srv podsv1alpha1.PodsServer) {
    ...
    创建grpc server
    server := grpc.NewServer(apisgrpc.WithRateLimiter(ctx, "pods", pods.DefaultQPS, pods.DefaultBurstTokens))
    注册grpc server
    podsv1alpha1.RegisterPodsServer(server, srv)
    创建listener
    l, err := util.CreateListener(endpoint)
    ...

    go func() {
        运行grpc server
        if err := server.Serve(l); err != nil && !errors.Is(err, grpc.ErrServerStopped) {
            logger.Error(err, "Failed to serve")
            os.Exit(1)
        }
    }()

    等待grpc server结束
    <-ctx.Done()
    logger.Info("Shutting down pods API server")
    server.GracefulStop()
    ...
}

pkg/kubelet/apis/pods/server.go中

这里以listPods为例,也有WatchPods,GetPOd

获取当前节点pods
func (s *PodsServer) ListPods(ctx context.Context, req *podsv1alpha1.ListPodsRequest) (*podsv1alpha1.ListPodsResponse, error) {
    从podmanager获取pods
    podsToReturn := s.podManager.GetPods()
    按uid排序
    sort.Slice(podsToReturn, func(i, j int) bool {
        return podsToReturn[i].UID < podsToReturn[j].UID
    })

    protoPods := make([][]byte, len(podsToReturn))
    for i, p := range podsToReturn {
        podToMarshal := p
        从statusprovider获取pod状态
        if podStatus, ok := s.statusProvider.GetPodStatus(p.UID); ok {
            podCopy := *p
            podCopy.Status = podStatus
            podToMarshal = &podCopy
        }
        序列化pod
        podBytes, err := podToMarshal.Marshal()
        if err != nil {
            return nil, status.Errorf(codes.Internal, "failed to marshal pod: %v", err)
        }
        protoPods[i] = podBytes
    }

    return &podsv1alpha1.ListPodsResponse{Pods: protoPods}, nil

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 4,617评论 0 6
  • 1、expected an indented block 冒号后面是要写上一定的内容的(新手容易遗忘这一点); 缩...
    庵下桃花仙阅读 1,016评论 1 2
  • 一、工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)矩形、椭圆选框工具 【M】移动工具 【V...
    墨雅丫阅读 1,383评论 0 0
  • 跟随樊老师和伙伴们一起学习心理知识提升自已,已经有三个月有余了,这一段时间因为天气的原因休课,顺便整理一下之前学习...
    学习思考行动阅读 877评论 0 2
  • 一脸愤怒的她躺在了床上,好几次甩开了他抱过来的双手,到最后还坚决的翻了个身,只留给他一个冷漠的背影。 多次尝试抱她...
    海边的蓝兔子阅读 891评论 1 4

友情链接更多精彩内容