k8s想让pod分布到不同节点? k8s节点宕机后pod如何迁移?
原标题:k8s想让pod分布到不同节点? k8s节点宕机后pod如何迁移?
导读:
【技术干货】k8s学习-calico的默认配置1、Calico后端(calico_backend)默认配置:bird说明:Calico使用bird构建BGP mesh的全连接...
【技术干货】k8s学习-calico的默认配置
1、Calico后端(calico_backend)默认配置:bird说明:Calico使用bird构建BGP MESh的全连接网络。Bird是Linux提供的一个BGP客户端工具,负责读取路由信息,并与其他节点的bird一起构建BGP网络。
2、Calico 适用场景:在 k8s 环境中,Pod 之间需要隔离。设计思想:Calico 不采用隧道或 NAT 来实现转发,而是将所有二三层流量转换为三层流量,并通过主机上的路由配置完成跨主机转发。设计优势:更优的资源利用:三层路由方法完全抑制二层广播,减少资源开销。
3、配置containerd:确保containerd已正确配置为Kubernetes的容器运行时。初始化集群:在控制端执行kubeadm init命令初始化集群,生成和修改配置文件,完成kubeadm的初始化和kubectl的授权。扩容集群:在Node节点上执行kubeadm join命令,将节点加入集群,确保集群状态为Ready。
4、// calico有两种模式:ipip(默认)、bgp,bgp效率更高。如果宿主机在同一个网段,可以使用ipip模式;如果宿主机不在同一个网段,pod通过BGP的hostGW是不可能互相通讯的,此时需要使用ipip模式(如果仍想使用bgp模式,除非你在中间路由器上手动添加路由)。
5、调整calicao 网络插件的网卡发现机制,修改IP_AUTODETECTION_METHOD对应的value值。官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node-to-nodemesh。
6、在控制端执行kubeadm初始化集群,生成和修改配置文件,完成kubeadm的初始化和kubectl授权。在node节点上扩容集群,确保集群状态为Ready。 安装和测试calico网络插件安装calico网络插件,配置其相关文件。为node节点打上标签,确认集群状态变为Ready。进行calico网络测试,确保网络功能正常。
K8S学习指南(44)-k8s调度之NodeAffinity
kubernetes(K8s)的调度系统凭借Node Affinity这一特性,能智能地根据POD与节点的亲和关系部署应用。本文将深入探讨Node Affinity的概念、用法,并通过实例展示其实用性。Node Affinity是K8s调度器的关键工具,允许开发者指定Pod与特定节点的关联性,以满足性能和资源需求。
K8s调度之Node Affinity学习指南:Node Affinity概念:Node Affinity是Kubernetes调度器的一个关键特性,允许开发者指定Pod与特定节点的关联性。通过Node Affinity,可以满足Pod对性能和资源需求的特定要求,实现更精细的资源分配。
在 Kubernetes 的调度机制中,nodeSelector 和 nodeAffinity 是两种用于决定 Pod 部署到哪个节点的关键规则。nodeSelector:定义:允许用户基于特定标签选择节点。用途:确保 Pod 被部署到具有特定属性的节点上,例如具有 SSD 硬盘的节点。限制:相对简单,只支持基于标签的精确匹配。
如果需要将另一个工作负载test也调度至节点k8s-0002,可以通过调整InterpodAffinity权重来实现。在调整后,test工作负载在调度时score得分为100 * 权重100,总共10000分,最终调度至k8s-0002节点。通过调整NodeAffinity权重,可以将工作负载test调度至节点k8s-0001。
k8s环境下,将REST Service部署至指定node list,需借助Node Selector、Affinity、nodeName等机制实现精准控制。基本策略包含三类:Node Selector、Affinity、nodeName。其中,Node Selector通过Pod中的nodeSelector属性直接指定目标node,通过key-value pairs匹配,仅需一对即可。
方式一:通过指定nodeSelector匹配Node。此方法需要定义nodeSelector来匹配特定Node。示例如下:查看node已有的label。默认情况下,Kubernetes为节点添加用于记录操作系统、角色、hostname等信息的label。例如,给节点添加disk=ssd标签。在Pod定义中添加nodeSelector。创建Pod并检查状态,验证其被调度至指定节点。
k8s将pod调度到指定节点的几种方式
方式二:通过指定NodeName。在Pod中配置nodeName字段,直接指派对应节点。示例如下:查看node名称。列出节点名称,例如k8s-master。在Pod中使用nodeName指定此节点。通过kubectl APPly创建Pod后,检查Pod是否调度至指定节点。使用nodeName选择节点方式存在局限性。方式三:亲和性和反亲和性。
通过指定nodeSelector匹配Node 方法说明:通过定义nodeSelector来匹配具有特定标签的Node,从而实现Pod的调度。操作步骤:首先查看节点的已有标签,然后在Pod定义中添加与期望节点匹配的nodeSelector。 通过指定NodeName 方法说明:直接在Pod配置中指定nodeName字段,将Pod调度到指定的节点。
在score阶段,为每个节点打分,分数计算方式是插件打分乘以插件权重。节点分数最高者将被选为最终目标节点。例如,在环境中有两个节点k8s-0001和k8s-0002,已有一个工作负载Nginx调度至节点k8s-0002。如果需要将另一个工作负载test也调度至节点k8s-0002,可以通过调整IntERPodAffinity权重来实现。
Node Selector是Kubernetes中用于将Pod调度到指定节点的一种机制。以下是关于Node Selector的详细解基本工作原理:Node Selector通过Pod定义中的nodeSelector属性直接指定目标节点。它使用键值对进行匹配,仅需一对匹配即可将Pod调度到目标节点。
将Pod迁移到其他节点
因服务器升级迁移,需要将升级的节点上的pod迁移到其他节点。 可以改yaml中指定临时标签,重新部署,但比较麻烦,通常会采用cordon/uncordon节点的方案。
方式二:通过指定NodeName。在Pod中配置nodeName字段,直接指派对应节点。示例如下:查看node名称。列出节点名称,例如k8s-master。在Pod中使用nodeName指定此节点。通过kubectl apply创建Pod后,检查Pod是否调度至指定节点。使用nodeName选择节点方式存在局限性。方式三:亲和性和反亲和性。
Kubernetes将Pod调度到指定节点的方式主要有以下几种: 通过指定nodeSelector匹配Node 方法说明:通过定义nodeSelector来匹配具有特定标签的Node,从而实现Pod的调度。操作步骤:首先查看节点的已有标签,然后在Pod定义中添加与期望节点匹配的nodeSelector。
nfs持久化从一个节点迁移到另一个节点时,可以通过删除并重启Pod、删除PVC和PV,并注意迁移前后的数据备份和配置更新来解决可能遇到的问题。具体步骤如下:删除并重启Pod:首先尝试删除并重启相关的Pod,看是否能解决与原节点绑定的问题。但这种方法可能并不总是有效,特别是当持久化存储无法连接时。
在score阶段,为每个节点打分,分数计算方式是插件打分乘以插件权重。节点分数最高者将被选为最终目标节点。例如,在环境中有两个节点k8s-0001和k8s-0002,已有一个工作负载nginx调度至节点k8s-0002。如果需要将另一个工作负载test也调度至节点k8s-0002,可以通过调整InterPodAffinity权重来实现。
k8s控制面组件
1、Kubernetes(k8s)的控制面组件相互协作,共同确保了集群中的服务和应用程序能够按预期工作。
2、K8s集群主要由以下组件构成:控制平面组件(Control plane COMponents):相当于服务端,为集群做出全局决策,比如资源的调度,以及检测和响应集群事件。控制平面组件可以在集群中的任何节点上运行,但通常会只运行在Master上,并且不会在此服务器上运行用户容器。
3、组件部署:用户K8s的控制面组件(ETCd、API-server、Controller-manager、scheduler)以Pod形式运行在管控K8s中,并且每个用户K8s集群的控制面组件都单独分配一个命名空间(namespace)。
4、作为系统的数据中心,kube-apiserver 负责存储和检索 Kubernetes 资源的状态信息。它是集群内数据总线的一部分,确保所有组件都能获取到最新的资源状态。安全机制 kube-apiserver 实现了认证、授权和准入控制等安全功能,确保集群操作的安全性。