基于web的K8S仿真调度平台设计5-POD部署失败,重新整理思路

给node打标签,方便后面部署pod

package main

import (
	"context"
	"time"

	//"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	//"fmt"
	//corev1 "k8s.io/api/core/v1"
	//"k8s.io/apimachinery/pkg/api/resource"
	//metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	//v1 "k8s.io/client-go/applyconfigurations/core/v1"
	"k8s.io/client-go/kubernetes"
	//"k8s.io/client-go/tools/cache"
	"k8s.io/client-go/tools/clientcmd"
	//"strings"

	"k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/api/resource"
)

func getResourceList(cpu, memory string) v1.ResourceList {
	res := v1.ResourceList{}
	if cpu != "" {
		res[v1.ResourceCPU] = resource.MustParse(cpu)
	}
	if memory != "" {
		res[v1.ResourceMemory] = resource.MustParse(memory)
	}
	return res
}

func getResourceRequirements(requests, limits v1.ResourceList) v1.ResourceRequirements {
	res := v1.ResourceRequirements{}
	res.Requests = requests
	res.Limits = limits
	return res
}


func main() {
	// uses the current context in kubeconfig
	// path-to-kubeconfig -- for example, /root/.kube/config
	config, err := clientcmd.BuildConfigFromFlags("", "C:\\Users\\HJW\\.kube\\config")
	if err!= nil{
		panic(err)
	}

	// creates the clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err!= nil{
		panic(err)
	}

	var labels=map[string]string{"node1":"node1"}
	
	//pod模版
	//newPod := &v1.Pod{
	//	TypeMeta: metav1.TypeMeta{
	//		Kind: "Pod",
	//		APIVersion: "v1",
	//	},
	//	ObjectMeta: metav1.ObjectMeta{
	//		Name: "pod2",
	//	},
	//	Spec: v1.PodSpec{
	//		Containers: []v1.Container{
	//			{Name: "pod2", Image: "busybox:latest", Command: []string{"sleep", "1000"},
	//				Resources: getResourceRequirements(getResourceList("10m", "1Gi"), getResourceList("50m", "1Gi"))},
	//		},
	//		//NodeSelector:"node1",
	//	},
	//}

	//node模板
	lastheartbeattime,_ :=time.Parse("2006-01-02 15:04:05", "2019-06-05 18:38:35")
	lasttransitiontime,_ :=time.Parse("2006-01-02 15:04:05", "2019-06-05 11:41:27")
	newNode := &v1.Node{
		ObjectMeta: metav1.ObjectMeta{
					Name: "node1",
					Labels: labels,
		},
		Spec: v1.NodeSpec{},
		Status: v1.NodeStatus{
			Capacity: getResourceList("50m", "1Gi"),
			Allocatable:getResourceList("50m", "1Gi"),
			Phase:"running",
			//Conditions:Conditions.Type="Ready",Conditions.Status="True"
			Conditions: []v1.NodeCondition{
				{"Ready","True",metav1.Time{lastheartbeattime},metav1.Time{lasttransitiontime},"KubeletReady","kubelet is posting ready status"},
			},
		},
	}
	//创建pod
	//pod, err := clientset.CoreV1().Pods("kube-system").Create(context.Background(), newPod, metav1.CreateOptions{})
	//if err != nil {
	//	panic(err)
	//}
	//fmt.Printf("Created pod %q.\n", pod.GetObjectMeta().GetName())
	//clientset.CoreV1().Pods("kube-system").Delete(context.Background(),"pod2",metav1.DeleteOptions{})
	clientset.CoreV1().Nodes().Create(context.Background(), newNode, metav1.CreateOptions{})
	//clientset.CoreV1().Nodes().Delete(context.Background(),"node1",metav1.DeleteOptions{})
}

标签的类型是map[string]string,是go里面的键值对,要事先定义应用了之后可以查看到node已经被打上标签
在这里插入图片描述
然后创建同样标签的pod

package main

import (
	"context"
	"fmt"
	//"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	//"fmt"
	//corev1 "k8s.io/api/core/v1"
	//"k8s.io/apimachinery/pkg/api/resource"
	//metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	//v1 "k8s.io/client-go/applyconfigurations/core/v1"
	"k8s.io/client-go/kubernetes"
	//"k8s.io/client-go/tools/cache"
	"k8s.io/client-go/tools/clientcmd"
	//"strings"

	"k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/api/resource"
)

func getResourceList(cpu, memory string) v1.ResourceList {
	res := v1.ResourceList{}
	if cpu != "" {
		res[v1.ResourceCPU] = resource.MustParse(cpu)
	}
	if memory != "" {
		res[v1.ResourceMemory] = resource.MustParse(memory)
	}
	return res
}

func getResourceRequirements(requests, limits v1.ResourceList) v1.ResourceRequirements {
	res := v1.ResourceRequirements{}
	res.Requests = requests
	res.Limits = limits
	return res
}


func main() {
	// uses the current context in kubeconfig
	// path-to-kubeconfig -- for example, /root/.kube/config
	config, err := clientcmd.BuildConfigFromFlags("", "C:\\Users\\HJW\\.kube\\config")
	if err!= nil{
		panic(err)
	}

	// creates the clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err!= nil{
		panic(err)
	}

	var labels=map[string]string{"node1":"node1"}

	//pod模版
	newPod := &v1.Pod{
		TypeMeta: metav1.TypeMeta{
			Kind: "Pod",
			APIVersion: "v1",
		},
		ObjectMeta: metav1.ObjectMeta{
			Name: "pod2",
		},
		Spec: v1.PodSpec{
			Containers: []v1.Container{
				{Name: "pod2", Image: "busybox:latest", Command: []string{"sleep", "1000"},
					Resources: getResourceRequirements(getResourceList("10m", "1Gi"), getResourceList("50m", "1Gi"))},
			},
			NodeSelector:labels,
		},
	}

	//node模板
	//lastheartbeattime,_ :=time.Parse("2006-01-02 15:04:05", "2019-06-05 18:38:35")
	//lasttransitiontime,_ :=time.Parse("2006-01-02 15:04:05", "2019-06-05 11:41:27")
	//newNode := &v1.Node{
	//	ObjectMeta: metav1.ObjectMeta{
	//				Name: "node1",
	//				Labels: labels,
	//	},
	//	Spec: v1.NodeSpec{},
	//	Status: v1.NodeStatus{
	//		Capacity: getResourceList("50m", "1Gi"),
	//		Allocatable:getResourceList("50m", "1Gi"),
	//		Phase:"running",
	//		//Conditions:Conditions.Type="Ready",Conditions.Status="True"
	//		Conditions: []v1.NodeCondition{
	//			{"Ready","True",metav1.Time{lastheartbeattime},metav1.Time{lasttransitiontime},"KubeletReady","kubelet is posting ready status"},
	//		},
	//	},
	//}
	//创建pod
	pod, err := clientset.CoreV1().Pods("kube-system").Create(context.Background(), newPod, metav1.CreateOptions{})
	if err != nil {
		panic(err)
	}
	fmt.Printf("Created pod %q.\n", pod.GetObjectMeta().GetName())
	//clientset.CoreV1().Pods("kube-system").Delete(context.Background(),"pod2",metav1.DeleteOptions{})
	//clientset.CoreV1().Nodes().Create(context.Background(), newNode, metav1.CreateOptions{})
	//clientset.CoreV1().Nodes().Delete(context.Background(),"node1",metav1.DeleteOptions{})
}

在这里插入图片描述
一开始确实创建了
在这里插入图片描述
但是过了一分钟就出了问题
0/2 nodes are available: 1 Too many pods, 1 node(s) didn’t match Pod’s node affinity/selector, 1 node(s) had untolerated taint {node.kubernetes.io/unreachable: }. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.
有0/2个节点可用:1个Pod太多,1个节点与Pod的节点关联/选择器不匹配,1个节点具有无法容忍的污染{node.kubernetes.io/unreachable:}。抢占:0/2个节点可用:2抢占对调度没有帮助。
在这里插入图片描述
他说node1pod太多,还有无法忍受的污染,查了挺长时间,client-go里面的node.creat只是创建一个结构体数据而已,欺骗scheduler的,这里要转变一下思路。调度仿真平台不能真的部署,创建node和pod之后在数据库里面匹配模拟调度。

### 下载 Popper.min.js 文件的方法 对于希望获取 `popper.min.js` 的开发者来说,可以通过多种方式来实现这一目标。通常情况下,推荐通过官方渠道或可靠的分发网络 (CDN) 来获得最新的稳定版文件。 #### 使用 CDN 获取 Popper.min.js 最简单的方式之一是从流行的 CDN 中加载所需的 JavaScript 库。这不仅简化了集成过程,还可能提高性能,因为许多用户已经缓存了来自这些服务提供商的内容。例如: ```html <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2/dist/umd/popper.min.js"></script> ``` 这种方式不需要手动下载文件到本地服务器;只需将上述 `<script>` 标签添加至 HTML 文档中的适当位置即可立即使用 Popper 功能[^1]。 #### 从 npm 或 yarn 安装 如果项目采用模块化构建工具链,则可以直接利用包管理器如 npm 或 Yarn 进行安装。命令如下所示: ```bash npm install @popperjs/core # 或者 yarn add @popperjs/core ``` 之后可以根据具体需求引入特定功能模块,而不是整个库,从而减少打包后的体积并优化加载速度[^2]。 #### 访问 GitHub 发布页面下载压缩包 另一种方法是访问 Popper.js 的 [GitHub Releases](https://github.com/popperjs/popper-core/releases) 页面,在这里可以选择不同版本的 tarball 或 zip 归档进行下载解压操作。这种方法适合那些偏好离线工作环境或是想要定制编译选项的人群[^3]。 #### 手动克隆仓库 最后一种较为少见但也可行的办法便是直接克隆完整的 Git 存储库副本。这样可以获得开发分支以及历史记录等更多信息,适用于贡献代码或者深入学习内部机制的情况。 ```bash git clone https://github.com/popperjs/popper-core.git cd popper-core ``` 完成以上任一途径后便能成功取得所需版本的 Popper.min.js 文件,并将其应用于个人项目之中[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值