kerbernets 中CPU 亲和性实现

19 篇文章 3 订阅
17 篇文章 0 订阅
kerbernets 中CPU亲和性是1.8中的alpha 特性.这个特性主要功能是可以控制启动容器在cpu核数控制和具体运行在哪个核上。
这个特性主要修改的代码在pkg/kubelet/cm 中。
首先在cmd/kubelet/app/server.go中启动容器管理器ContainerManager。
kubeDeps.ContainerManager, err = cm.NewContainerManager(
而在启动容器管理器时候。初始CPU管理器cpumanager。
pkg/kubelet/cm/container_manager_linux.go:197:
func NewContainerManager(mountUtil mount.Interface, cadvisorInter
// Initialize CPU manager
	if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CPUManager) {
		cm.cpuManager, err = cpumanager.NewManager(
			nodeConfig.ExperimentalCPUManagerPolicy,
			nodeConfig.ExperimentalCPUManagerReconcilePeriod,
			machineInfo,
			cm.GetNodeAllocatableReservation(),
			nodeConfig.KubeletRootDir,
		)
		if err != nil {
			glog.Errorf("failed to initialize cpu manager: %v", err)
			return nil, err
		}
	}
当kubelet启动或者销毁容器前,容器生命周期实现都会调用CPU管理器来管理CPU相关特性。
pkg/kubelet/cm/internal_container_lifecycle.go
func (i *internalContainerLifecycleImpl) PreStartContainer(pod *v1.Pod, container *v1.Container, containerID string) error {
	if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CPUManager) {
		return i.cpuManager.AddContainer(pod, container, containerID)
	}
	return nil
}

func (i *internalContainerLifecycleImpl) PreStopContainer(containerID string) error {
	if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CPUManager) {
		return i.cpuManager.RemoveContainer(containerID)
	}
	return nil
}

func (i *internalContainerLifecycleImpl) PostStopContainer(containerID string) error {
	if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CPUManager) {
		return i.cpuManager.RemoveContainer(containerID)
	}
	return nil
}
其中添加容器到CPU管理器
err = m.updateContainerCPUSet(containerID, cpus)
m.containerRuntime.UpdateContainerResources(
		containerID,
		&runtimeapi.LinuxContainerResources{
			CpusetCpus: cpus.String(),
		})
}
调用docker 客户端修改容器资源
pkg/kubelet/dockershim/docker_container.go
func (ds *dockerService) UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources) error {
	updateConfig := dockercontainer.UpdateConfig{
		Resources: dockercontainer.Resources{
			CPUPeriod:  resources.CpuPeriod,
			CPUQuota:   resources.CpuQuota,
			CPUShares:  resources.CpuShares,
			Memory:     resources.MemoryLimitInBytes,
			CpusetCpus: resources.CpusetCpus,
			CpusetMems: resources.CpusetMems,
		},
	}

	err := ds.client.UpdateContainerResources(containerID, updateConfig)//最终调用docker API post更新数据
	if err != nil {
		return fmt.Errorf("failed to update container %q: %v", containerID, err)
	}
	return nil
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值