kubelet grpc实现

kubelet grpc

kubelet中用到grpc主要是操作runtime,kubelet截止到目前的版本1.16.0支持多种runtime:Docker,CRI-O,Containerd,Other CRI runtimes: frakti。这里主要讲的是docker runtime的grcp实现,实现的大致流程如下:kubelet在启动的时候,封装了关于runtime的操作的grpc server(通过docker的client)和client端,然后启动server端,完成server端的启动之后,在初始化对应server端的client,封装在kubelet的runtimeService和imageService中,后续对pod相关的容器的操作,都是通过runtimeService和imageService去操作的完成的,至于为什么kubelet不直接调用docker的client去实现container相关的功能,而是封装一层grpc server和client,其主要目的是为了适配后端不同的runtime。

grpc server 接口定义

type RuntimeServiceServer interface {
	Version(context.Context, *VersionRequest) (*VersionResponse, error)
	RunPodSandbox(context.Context, *RunPodSandboxRequest) (*RunPodSandboxResponse, error)
	StopPodSandbox(context.Context, *StopPodSandboxRequest) (*StopPodSandboxResponse, error)
	RemovePodSandbox(context.Context, *RemovePodSandboxRequest) (*RemovePodSandboxResponse, error)
	PodSandboxStatus(context.Context, *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error)
	ListPodSandbox(context.Context, *ListPodSandboxRequest) (*ListPodSandboxResponse, error)
	CreateContainer(context.Context, *CreateContainerRequest) (*CreateContainerResponse, error)
	StartContainer(context.Context, *StartContainerRequest) (*StartContainerResponse, error)
	StopContainer(context.Context, *StopContainerRequest) (*StopContainerResponse, error)
	RemoveContainer(context.Context, *RemoveContainerRequest) (*RemoveContainerResponse, error)
	ListContainers(context.Context, *ListContainersRequest) (*ListContainersResponse, error)
	ContainerStatus(context.Context, *ContainerStatusRequest) (*ContainerStatusResponse, error)
	UpdateContainerResources(context.Context, *UpdateContainerResourcesRequest) (*UpdateContainerResourcesResponse, error)
	ReopenContainerLog(context.Context, *ReopenContainerLogRequest) (*ReopenContainerLogResponse, error)
	ExecSync(context.Context, *ExecSyncRequest) (*ExecSyncResponse, error)
	Exec(context.Context, *ExecRequest) (*ExecResponse, error)
	Attach(context.Context, *AttachRequest) (*AttachResponse, error)
	PortForward(context.Context, *PortForwardRequest) (*PortForwardResponse, error)
	ContainerStats(context.Context, *ContainerStatsRequest) (*ContainerStatsResponse, error)
	ListContainerStats(context.Context, *ListContainerStatsRequest) (*ListContainerStatsResponse, error)
	UpdateRuntimeConfig(context.Context, *UpdateRuntimeConfigRequest) (*UpdateRuntimeConfigResponse, error)
	Status(context.Context, *StatusRequest) (*StatusResponse, error)
}


type ImageServiceServer interface {
	ListImages(context.Context, *ListImagesRequest) (*ListImagesResponse, error)
	ImageStatus(context.Context, *ImageStatusRequest) (*ImageStatusResponse, error)
	PullImage(context.Context, *PullImageRequest) (*PullImageResponse, error)
	RemoveImage(context.Context, *RemoveImageRequest) (*RemoveImageResponse, error)
	ImageFsInfo(context.Context, *ImageFsInfoRequest) (*ImageFsInfoResponse, error)
}

相关的接口定义以及grpc的代码所在位置:k8s.io/cri-api/pkg/apis/runtime/v1alpha2/api.pb.go

grpc server 接口实现

grpc server的代码实现主要在以下几个文件中:
k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_image.go实现接口 ImageServiceServer

k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go
k8s.io/kubernetes/pkg/kubelet/dockershim/docker_container.go
k8s.io/kubernetes/pkg/kubelet/dockershim/docker_streaming.go
k8s.io/kubernetes/pkg/kubelet/dockershim/docker_logs.go
实现RuntimeServiceServer接口

grpc server/client 实例化以及使用

func NewMainKubelet(...) (*Kubelet, error){
	...
	switch containerRuntime {
	case kubetypes.DockerContainerRuntime:
		// Create and start the CRI shim running as a grpc server.
		streamingConfig := getStreamingConfig(kubeCfg, kubeDeps, crOptions)
		ds, err := dockershim.NewDockerService(kubeDeps.DockerClientConfig, crOptions.PodSandboxImage, streamingConfig,
			&pluginSettings, runtimeCgroups, kubeCfg.CgroupDriver, crOptions.DockershimRootDirectory, !crOptions.RedirectContainerStreaming)
		if err != nil {
			return nil, err
		}
		if crOptions.RedirectContainerStreaming {
			klet.criHandler = ds
		}

		// The unix socket for kubelet <-> dockershim communication.
		klog.V(5).Infof("RemoteRuntimeEndpoint: %q, RemoteImageEndpoint: %q",
			remoteRuntimeEndpoint,
			remoteImageEndpoint)
		klog.V(2).Infof("Starting the GRPC server for the docker CRI shim.")
		server := dockerremote.NewDockerServer(remoteRuntimeEndpoint, ds)
		// Start 方法会吧ds的所有方法注册到grpc的server端
		if err := server.Start(); err != nil {
			return nil, err
		}

		// Create dockerLegacyService when the logging driver is not supported.
		supported, err := ds.IsCRISupportedLogDriver()
		if err != nil {
			return nil, err
		}
		if !supported {
			klet.dockerLegacyService = ds
			legacyLogProvider = ds
		}
	case kubetypes.RemoteContainerRuntime:
		// No-op.
		break
	default:
		return nil, fmt.Errorf("unsupported CRI runtime: %q", containerRuntime)
	}
	// 这里是grpc的client端的实例的实现
	runtimeService, imageService, err := getRuntimeAndImageServices(remoteRuntimeEndpoint, remoteImageEndpoint, kubeCfg.RuntimeRequestTimeout)
	if err != nil {
		return nil, err
	}
	klet.runtimeService = runtimeService
	...
	runtime, err := kuberuntime.NewKubeGenericRuntimeManager(
		kubecontainer.FilterEventRecorder(kubeDeps.Recorder),
		klet.livenessManager,
		seccompProfileRoot,
		containerRefManager,
		machineInfo,
		klet,
		kubeDeps.OSInterface,
		klet,
		httpClient,
		imageBackOff,
		kubeCfg.SerializeImagePulls,
		float32(kubeCfg.RegistryPullQPS),
		int(kubeCfg.RegistryBurst),
		kubeCfg.CPUCFSQuota,
		kubeCfg.CPUCFSQuotaPeriod,
		runtimeService,
		imageService,
		kubeDeps.ContainerManager.InternalContainerLifecycle(),
		legacyLogProvider,
		klet.runtimeClassManager,
	)
	...
}

在实例化kubelet类型struct的时候,会根据runtime的类型去创建对应的dockerService,然后创建的对应的关于runtime所有接口实现的grpc server端,并监听grpc链接请求,提供runtime操作的服务,到这里grpc server端的实例化已经完成。

紧接着是初始化kubelet的runtimeService和imageService,实际就是创建对应的grpc的client端。这个client端在后续的多个manager中都会用到。比如:syncPod后,需要创建对应的容器就是最终就是调用runtimeService和imageService去创建容器。

### 回答1: Spring Boot 是一个用于构建基于Java的微服务的开发框架。它提供了一种快速开发、简化配置的方式,使得开发者能够更容易地构建和部署应用程序。 Spring Boot MVC 是 Spring Boot 中用于构建Web应用程序的一部分。它基于 Spring MVC 框架,提供了简化的配置和开发方式,使得开发者能够更高效地构建和维护Web应用。 gRPC是一种高性能、开源的远程过程调用(RPC)框架,由Google开发并开源。它使用Protocol Buffers作为接口定义语言(IDL),可以跨语言地进行通信。与传统的HTTP+JSON通信相比,gRPC提供了更快、更轻量级、更高效的跨网络通信方式。 Spring Boot可以集成gRPC实现基于gRPC的远程过程调用。集成gRPC的步骤如下: 1. 在Spring Boot项目中添加gRPC的依赖,例如在pom.xml中添加相关依赖。 2. 使用Protocol Buffers编写接口定义文件(.proto文件),定义服务和消息格式。 3. 使用gRPC编译器生成相应的Java代码。 4. 编写服务的实现类,实现生成的接口。 5. 在Spring Boot中配置gRPC服务端和客户端的相关信息。 6. 启动Spring Boot应用程序。 通过上述步骤,就可以在Spring Boot中实现基于gRPC的远程过程调用。通过gRPC,服务端和客户端可以直接调用对方提供的方法,以实现跨网络的通信。gRPC使用Protocol Buffers进行序列化和反序列化,提供了高效的通信方式。同时,通过Spring Boot的集成,开发者可以更方便地进行开发和部署。总之,Spring Boot MVC gRPC实现可以为开发者提供快速、高效地构建基于gRPC的微服务应用的能力。 ### 回答2: Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了大量的开箱即用的功能。而MVC(Model-View-Controller)是一种常用的软件设计模式,用于将应用程序的业务逻辑、数据和呈现逻辑分离。 gRPC是一种高性能、开源的远程过程调用(RPC)框架,它使用Protocol Buffers作为接口定义语言。gRPC支持多种语言,包括Java和Spring Boot。使用gRPC,可以定义消息类型和服务接口,并生成用于客户端和服务器之间通信的代码。 在Spring Boot中使用gRPC实现通常需要以下步骤: 1.定义gRPC服务接口:使用Protocol Buffers定义服务接口和消息类型,并生成相应的代码。 2.实现gRPC服务接口:在Spring Boot应用程序中实现gRPC服务接口中定义的方法。 3.配置gRPC服务器:在Spring Boot应用程序中配置gRPC服务器,指定端口和服务实现类。 4.编写客户端代码:编写客户端代码以使用gRPC调用服务器端提供的服务。 使用gRPC的好处包括高性能、跨语言支持、自动化的代码生成等。在Spring Boot中使用gRPC可以方便地将gRPC集成到现有的Spring应用程序中,并利用Spring Boot提供的便利功能,如自动配置和部署。 总结:Spring Boot MVC和gRPC是两种不同的技术,分别用于构建Web应用程序和实现远程过程调用。在Spring Boot应用程序中使用gRPC实现时,需要通过定义gRPC服务接口、实现服务接口方法、配置和启动gRPC服务器等步骤来集成gRPC。这样可以在Spring Boot应用程序中使用gRPC高性能的远程过程调用功能。 ### 回答3: Spring Boot是一个基于Spring框架的快速开发框架,它简化了Spring的配置和部署过程。而MVC是Spring框架中的一种设计模式,通过它可以将应用程序的不同部分进行解耦,使得每个部分可以独立开发、测试和部署。 gRPC是一个高性能、开源的远程过程调用(RPC)框架,它使用Google Protocol Buffers作为接口定义语言,并支持多种编程语言。通过gRPC,我们可以轻松地定义RPC服务,然后使用自动生成的客户端和服务端代码进行通信。 在Spring Boot中集成MVC和gRPC可以实现两者的优势互补。我们可以使用Spring MVC来处理HTTP请求,同时使用gRPC来处理RPC请求。这样一来,我们就可以使用Spring Boot的自动配置和注解来简化开发,同时利用gRPC的高效性能和跨语言能力。 首先,我们需要在Spring Boot项目中引入gRPC的依赖。然后,我们可以定义gRPC的服务接口和实现类,就像定义普通的Java接口和实现类一样。接着,我们可以使用gRPC的注解来定义服务的类型、方法、输入参数和返回值。同时,我们也可以在服务实现类中编写具体的逻辑代码。 在Spring MVC中,我们可以使用@RestController注解来定义HTTP接口,通过调用gRPC服务来处理请求。这样,我们就可以将HTTP请求转发到gRPC服务,从而实现在一个应用中同时支持HTTP和RPC两种协议。 总之,通过Spring Boot集成MVC和gRPC,我们可以在一个应用中同时支持HTTP和RPC协议,并可以充分利用两者的优势。这样,我们就可以更加方便地开发和部署分布式系统,提高系统的性能和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值