K8S中的Pod调度之亲和性调度
亲和性调度
亲和性调度是一种比硬性指定节点(使用 nodeName 或 nodeSelector)更灵活的调度策略,它允许定义一组规则,根据这些规则,调度器会尝试将 Pod 调度到最合适的节点上,但如果找不到完全匹配的节点,它仍然可以调度到其他节点上。
下面是亲和性调度的三种主要类型及其使用场景:
| 亲和性类型 | 描述 | 调度规则示例 |
|---|---|---|
| Node Affinity | 定义 Pod 可以调度到哪些节点的规则。 | 基于节点的标签选择节点,如调度到具有特定硬件配置或特定区域的节点。 |
| - requiredDuringSchedulingIgnoredDuringExecution | 必须满足所有规则才能调度。 | |
| - nodeSelectorTerms | 节点选择列表。 | |
| - matchFields | 按节点字段列出的节点选择器要求列表。 | |
| - matchExpressions | 按节点标签列出的节点选择器要求列表(推荐)。 | |
| - preferredDuringSchedulingIgnoredDuringExecution | 优先调度到满足规则的节点,如果没有,也可以调度到其他节点(软限制)。 | |
| - preference | 节点选择器项,与权重相关联。 | |
| - weight | 倾向权重,范围1-100。 | |
| Pod Affinity | 定义 Pod 应该与哪些已存在的 Pod 调度到相同的拓扑域。 | 适用于需要频繁交互的应用,减少通信延迟。 |
| - requiredDuringSchedulingIgnoredDuringExecution | 必须与指定的 Pod 调度到相同的拓扑域。 | |
| - preferredDuringSchedulingIgnoredDuringExecution | 优先与指定的 Pod 调度到相同的拓扑域,如果没有,也可以调度到其他拓扑域(软限制)。 | |
| Pod Anti-Affinity | 定义 Pod 不应该与哪些已存在的 Pod 调度到相同的拓扑域。 | 确保应用的多个实例分散在不同的拓扑域,提高可用性和容错性。 |
| - requiredDuringSchedulingIgnoredDuringExecution | 必须不与指定的 Pod 调度到相同的拓扑域。 | |
| - preferredDuringSchedulingIgnoredDuringExecution | 优先不与指定的 Pod 调度到相同的拓扑域,如果没有,也可以调度到其他拓扑域(软限制)。 |
每种亲和性都支持两种模式:
-
RequiredDuringSchedulingIgnoredDuringExecution:在调度时必须满足的规则,如果找不到匹配的节点,Pod 将不会被调度。但如果调度后节点的标签发生变化导致不再匹配,Pod 仍然会保留在该节点上。
-
PreferredDuringSchedulingIgnoredDuringExecution:在调度时优先考虑的规则,但如果找不到匹配的节点,Pod 仍然可以被调度到其他节点。
NodeAffinity(节点亲和性)
-
NodeAffinity 允许你根据节点的标签来指定 Pod 应该或倾向于调度到哪些节点上。
-
NodeAffinity 可选配置:
-
requiredDuringSchedulingIgnoredDuringExecution硬限制-
nodeSelectorTerms:节点选择列表,必须满足所有指定的规则才可以调度到节点上。
-
matchFields:按节点字段列出的节点选择器要求列表。
-
matchExpressions: 按节点标签列出的节点选择器要求列表,包括:
-
-
key:键
-
values:值
-
-
operator:关系符,支持
Exists、DoesNotExist、In、NotIn、Gt、Lt -
preferredDuringSchedulingIgnoredDuringExecution软限制 -
preference: 一个节点选择器项,与相应的权重相关联。
-
matchFields:按节点字段列出的节点选择器要求列表。
-
matchExpressions:按节点标签列出的节点选择器要求列表,包括:
-
key:键
-
values:值
-
-
operator:关系符,支持
In、NotIn、Exists、DoesNotExist、Gt、Lt -
weight:倾向权重,在范围1-100。
-
-
硬限制配置
因为没有找到被打上test标签的node所以调度失败
# vim pod-nodeaffinity-required.yaml
---
apiVersion: v1
kind: Pod
metadata:name: pod-nodeaffinity-requirednamespace: test
spec:containers:- name: nginximage: nginx:1.17.1affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: nodeenvoperator: Invalues: ["test","xxx"][root@k8s-master ~]# kubectl create ns test
namespace/test created
[root@k8s-master ~]# kubectl apply -f pod-nodeaffinity-required.yaml
pod/pod-nodeaffinity-required created
[root@k8s-master ~]# kubectl get pods pod-nodeaffinity-required -n test
NAME READY STATUS RESTARTS AGE
pod-nodeaffinity-required 0/1 Pending 0 22s
[root@k8s-master ~]# kubectl describe pods pod-nodeaffinity-required -n test
Name: pod-nodeaffinity-required
Namespace: test
Priority: 0
Node: <none>
Labels: <none>
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Containers:nginx:Image: nginx:1.17.1Port: <none>Host Port: <none>Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5f6rd (ro)
Conditions:Type StatusPodScheduled False
Volumes:kube-api-access-5f6rd:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: <nil>DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Warning FailedScheduling 34s default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match Pod's node affinity/selector.Warning FailedScheduling 33s default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match Pod's node affinity/selector.
接下来我们为node打上标签,继续测试
[root@k8s-master ~]# kubectl label nodes k8s-node1 nodeenv=dev
node/k8s-node1 labeled
[root@k8s-master ~]# kubectl label nodes k8s-node2 nodeenv=test
node/k8s-node2 labeled
[root@k8s-master ~]# kubectl delete -f pod-nodeaffinity-required.yaml
pod "pod-nodeaffinity-required" deleted
[root@k8s-master ~]# kubectl apply -f pod-nodeaffinity-required.yaml
pod/pod-nodeaffinity-required created
[root@k8s-master ~]# kubectl describe pods pod-nodeaffinity-required -n test
Name: pod-nodeaffinity-required
Namespace: test
Priority: 0
Node: k8s-node2/192.168.58.233
Start Time: Thu, 16 Jan 2025 04:14:35 -0500
Labels: <none>
Annotations: cni.projectcalico.org/containerID: eb576e210ed0daf158fc97706a7858428fdcbce61d89936cd60323c184bf65d7cni.projectcalico.org/podIP: 10.244.169.130/32cni.projectcalico.org/podIPs: 10.244.169.130/32
Status: Running
IP: 10.244.169.130
IPs:IP: 10.244.169.130
Containers:nginx:Container ID: docker://b58aa001a6b25893a091a726ede2ea57d96e6209c11a8c17d269d78087db505eImage: nginx:1.17.1Image ID: docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbbPort: <none>Host Port: <none>State: RunningStarted: Thu, 16 Jan 2025 04:14:38 -0500Ready: TrueRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-m5zx9 (ro)
Conditions:Type StatusInitialized True Ready True ContainersReady True PodScheduled True
Volumes:kube-api-access-m5zx9:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: <nil>DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 11s default-scheduler Successfully assigned test/pod-nodeaffinity-required to k8s-node2Normal Pulled <invalid> kubelet Container image "nginx:1.17.1" already present on machineNormal Created <invalid> kubelet Created container nginxNormal Started <invalid> kubelet Started container nginx
[root@k8s-master ~]# kubectl get pods pod-nodeaffinity-required -n test
NAME READY STATUS RESTARTS AGE
pod-nodeaffinity-required 1/1 Running 0 21s
-
requiredDuringSchedulingIgnoredDuringExecution:这个字段定义了一个强制性的调度规则,即 Pod 必须在满足以下条件的节点上调度,调度过程中会考虑这个规则,但在运行过程中如果节点标签发生变化,这个规则将被忽略。
-
nodeSelectorTerms:这个字段定义了一个或多个节点选择器条件列表。Pod 只有在所有这些条件都满足的情况下才会被调度到节点上。
-
matchExpressions:这个字段定义了一个或多个匹配表达式列表。每个匹配表达式都包含一个键(
key)、一个操作符(operator)和一个或多个值(values)Pod 只有在所有这些匹配表达式都满足的情况下才会被调度到节点上。
在这个配置文件中,matchExpressions 定义了一个条件:
-
key:
nodeenv,这意味着要匹配的节点标签的键是nodeenv。 -
operator:
In,这意味着要匹配的值必须在给定的列表中。 -
values:
["test","dev"],这意味着要匹配的节点标签的值必须是test或dev。 -
因此,这个 Pod 的亲和性规则要求它必须在标签
nodeenv的值为test或dev的节点上调度。
软限制配置
软限制只会优先调度被打上标签的node,如果没有任然会被调度到其他节点
[root@k8s-master ~]# vim pod-nodeaffinity-preferred.yaml
---
apiVersion: v1
kind: Pod
metadata:name: pod-nodeaffinity-preferrednamespace: test
spec:containers:- name: nginximage: nginx:1.17.1affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: nodeenvoperator: Invalues: ["xxx","yyy"][root@k8s-master ~]# kubectl apply -f pod-nodeaffinity-preferred.yaml
pod/pod-nodeaffinity-preferred created[root@k8s-master ~]# kubectl get pods pod-nodeaffinity-preferred -n test
NAME READY STATUS RESTARTS AGE
pod-nodeaffinity-preferred 0/1 ContainerCreating 0 32s
[root@k8s-master ~]# kubectl get pods pod-nodeaffinity-preferred -n test -w
NAME READY STATUS RESTARTS AGE
pod-nodeaffinity-preferred 0/1 ContainerCreating 0 36s
pod-nodeaffinity-preferred 1/1 Running 0 37s[root@k8s-master ~]# kubectl describe pods pod-nodeaffinity-preferred -n test
Name: pod-nodeaffinity-preferred
Namespace: test
Priority: 0
Node: k8s-node1/192.168.58.232
Start Time: Thu, 16 Jan 2025 04:28:24 -0500
Labels: <none>
Annotations: cni.projectcalico.org/containerID: eab55d3f2b78987484123e4f4b21434f4f1323620026e3946e5fe77476e4a761cni.projectcalico.org/podIP: 10.244.36.71/32cni.projectcalico.org/podIPs: 10.244.36.71/32
Status: Running
IP: 10.244.36.71
IPs:IP: 10.244.36.71
Containers:nginx:Container ID: docker://56be94e1afb802e91e86faf21ccce1925fa7f4204b418e6c5b8ac11024f75fc2Image: nginx:1.17.1Image ID: docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbbPort: <none>Host Port: <none>State: RunningStarted: Thu, 16 Jan 2025 04:29:00 -0500Ready: TrueRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-zv8s7 (ro)
Conditions:Type StatusInitialized True Ready True ContainersReady True PodScheduled True
Volumes:kube-api-access-zv8s7:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: <nil>DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 49s default-scheduler Successfully assigned test/pod-nodeaffinity-preferred to k8s-node1Normal Pulling <invalid> kubelet Pulling image "nginx:1.17.1"Normal Pulled <invalid> kubelet Successfully pulled image "nginx:1.17.1" in 32.615153362sNormal Created <invalid> kubelet Created container nginxNormal Started <invalid> kubelet Started container nginx
PodAffinity(Pod 亲和性)
-
PodAffinity主要实现以运行的Pod为参照,实现让新创建的Pod跟参照pod在一个区域的功能。
-
PodAffinity可选配置
-
requiredDuringSchedulingIgnoredDuringExecution硬限制-
namespaces:指定参照 Pod 的命名空间。
-
topologyKey:指定调度作用域,例如
kubernetes.io/hostname(以 Node 节点为区分范围)或beta.kubernetes.io/os(以 Node 节点的操作系统类型来区分)。 -
labelSelector:标签选择器,用于匹配 Pod 的标签。
-
matchExpressions:按节点标签列出的节点选择器要求列表,包括:
-
key:键
-
values:值
-
operator:关系符,支持
In、NotIn、Exists、DoesNotExist -
matchLabels:指多个
matchExpressions映射的内容
-
-
-
preferredDuringSchedulingIgnoredDuringExecution软限制-
weight:倾向权重,在范围1-100,用于指定这个推荐规则的优先级。
-
podAffinityTerm包含:
-
namespaces
-
topologyKey
-
labelSelector
-
matchExpressions
-
key
-
values
-
operator
-
matchLabels
-
-
-
-
topologyKey用于指定调度时作用域,例如:
-
如果指定为kubernetes.io/hostname,那就是以Node节点为区分范围
-
如果指定为beta.kubernetes.io/os,则以Node节点的操作系统类型来区分
-
-
硬限制配置
-
创建参照Pod
-
# vim pod-podaffinity-target.yaml
---
apiVersion: v1
kind: Pod
metadata:name: pod-podaffinity-targetnamespace: testlabels:podenv: pro
spec:containers:- name: nginximage: nginx:1.17.1nodeName: k8s-node1
[root@k8s-master ~]# kubectl apply -f pod-podaffinity-target.yaml
pod/pod-podaffinity-target created[root@k8s-master ~]# kubectl describe pods pod-podaffinity-target -n test
Name: pod-podaffinity-target
Namespace: test
Priority: 0
Node: k8s-node1/192.168.58.232
Start Time: Thu, 16 Jan 2025 04:58:54 -0500
Labels: podenv=pro
Annotations: cni.projectcalico.org/containerID: 48a68cbe52064a7eb4c3be9db7e24dff3176382ed16d18e9ede5d30312e6425fcni.projectcalico.org/podIP: 10.244.36.72/32cni.projectcalico.org/podIPs: 10.244.36.72/32
Status: Running
IP: 10.244.36.72
IPs:IP: 10.244.36.72
Containers:nginx:Container ID: docker://681c85e860b8e04189abd25d42de0e377cc297d73ef7965871631622704ecd19Image: nginx:1.17.1Image ID: docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbbPort: <none>Host Port: <none>State: RunningStarted: Thu, 16 Jan 2025 04:58:58 -0500Ready: TrueRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8vrrt (ro)
Conditions:Type StatusInitialized True Ready True ContainersReady True PodScheduled True
Volumes:kube-api-access-8vrrt:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: <nil>DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Pulled <invalid> kubelet Container image "nginx:1.17.1" already present on machineNormal Created <invalid> kubelet Created container nginxNormal Started <invalid> kubelet Started container nginx
-
创建建pod-podaffinity-required
[root@k8s-master ~]# vim pod-podaffinity-required.yaml
---
apiVersion: v1
kind: Pod
metadata:name: pod-podaffinity-requirednamespace: test
spec:containers:- name: nginximage: nginx:1.17.1affinity: #亲和性设置podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: podenv #选择带podenv标签的Podoperator: Invalues: ["xxx","yyy"] #匹配"xxx","yyy"标签topologyKey: kubernetes.io/hostname
[root@k8s-master ~]# kubectl apply -f pod-podaffinity-required.yaml
pod/pod-podaffinity-required created
[root@k8s-master ~]# kubectl describe pod pod-podaffinity-required -n test
Name: pod-podaffinity-required
Namespace: test
Priority: 0
Node: <none>
Labels: <none>
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Containers:nginx:Image: nginx:1.17.1Port: <none>Host Port: <none>Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-l7kjw (ro)
Conditions:Type StatusPodScheduled False
Volumes:kube-api-access-l7kjw:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: <nil>DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Warning FailedScheduling 39s default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match pod affinity rules, 2 node(s) didn't match pod affinity/anti-affinity rules.Warning FailedScheduling 38s default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match pod affinity rules, 2 node(s) didn't match pod affinity/anti-affinity rules.
[root@k8s-master ~]# vim pod-podaffinity-required.yaml
---
apiVersion: v1
kind: Pod
metadata:name: pod-podaffinity-requirednamespace: test
spec:containers:- name: nginximage: nginx:1.17.1affinity: #亲和性设置podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: podenv #选择带podenv标签的Podoperator: Invalues: ["pro","yyy"] #匹配"xxx","yyy"标签topologyKey: kubernetes.io/hostname
[root@k8s-master ~]# kubectl delete -f pod-podaffinity-required.yaml
pod "pod-podaffinity-required" deleted
[root@k8s-master ~]# kubectl apply -f pod-podaffinity-required.yaml
pod/pod-podaffinity-required created
[root@k8s-master ~]# kubectl describe pod pod-podaffinity-required -n test
Name: pod-podaffinity-required
Namespace: test
Priority: 0
Node: k8s-node1/192.168.58.232
Start Time: Thu, 16 Jan 2025 05:09:42 -0500
Labels: <none>
Annotations: cni.projectcalico.org/containerID: c459af771605b41fd74ae294344118acbdc2cd8fed3ae242982506c8eda9ad31cni.projectcalico.org/podIP: 10.244.36.73/32cni.projectcalico.org/podIPs: 10.244.36.73/32
Status: Running
IP: 10.244.36.73
IPs:IP: 10.244.36.73
Containers:nginx:Container ID: docker://501cb02e356ddb23e7e11fd48ac0403f83221afbba9d18c608f3415533fe4290Image: nginx:1.17.1Image ID: docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbbPort: <none>Host Port: <none>State: RunningStarted: Thu, 16 Jan 2025 05:09:45 -0500Ready: TrueRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-24cmw (ro)
Conditions:Type StatusInitialized True Ready True ContainersReady True PodScheduled True
Volumes:kube-api-access-24cmw:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: <nil>DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 6s default-scheduler Successfully assigned test/pod-podaffinity-required to k8s-node1Normal Pulled <invalid> kubelet Container image "nginx:1.17.1" already present on machineNormal Created <invalid> kubelet Created container nginxNormal Started <invalid> kubelet Started container nginx
-
Taints on Nodes: 集群中有一个节点上应用了一个 taint
node-role.kubernetes.io/master:, 这意味着这个节点不接受任何 Pod 的调度,除非这些 Pod 也被标记为可以容忍这个 taint。这种情况下,如果你的 Pod 没有设置相应的 toleration,就无法被调度到这个节点上。 -
Pod Affinity Rules: Pod 由于满足
requiredDuringSchedulingIgnoredDuringExecution的 pod affinity 规则而无法被调度到任何节点上。根据事件信息,集群中有 3 个节点没有匹配 pod affinity 规则,这意味着这些节点上没有满足 Pod affinity 规则的 Pod。
PodAntiAffinity 特性(Pod 反亲和性)
-
PodAntiAffinity 是 Kubernetes 中的一种亲和性调度规则,它与 PodAffinity 相反,用于确保带有特定标签的 Pod 不会被调度到同一个节点上。这种规则特别适用于那些天然互斥的应用组件,或者对于那些需要分散以提高容错性和性能的 Pod。
-
PodAntiAffinity主要实现以运行的Pod为参照,让新创建的Pod跟参照pod不在一个区域中的功能。它的配置方式和选项跟PodAffinty是一样的。
[root@k8s-master ~]# vim pod-podantiaffinity-required.yaml
---
apiVersion: v1
kind: Pod
metadata:name: pod-podantiaffinity-requirednamespace: test
spec:containers:- name: nginximage: nginx:1.17.1affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: podenvoperator: Invalues: ["pro"]topologyKey: kubernetes.io/hostname[root@k8s-master ~]# kubectl apply -f pod-podantiaffinity-required.yaml
pod/pod-podantiaffinity-required created
[root@k8s-master ~]# kubectl get pod pod-podantiaffinity-required -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-podantiaffinity-required 1/1 Running 0 9s 10.244.169.131 k8s-node2 <none> <none>
[root@k8s-master ~]# kubectl get pod pod-podantiaffinity-required -n test -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod-podantiaffinity-required 1/1 Running 0 19s 10.244.169.131 k8s-node2 <none> <none> <none>
[root@k8s-master ~]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-master Ready control-plane,master 21d v1.21.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-node1 Ready <none> 21d v1.21.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,nodeenv=pro
k8s-node2 Ready <none> 21d v1.21.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux,nodeenv=test
新Pod必须要与拥有标签nodeenv=pro的pod不在同一Node上
相关文章:
K8S中的Pod调度之亲和性调度
亲和性调度 亲和性调度是一种比硬性指定节点(使用 nodeName 或 nodeSelector)更灵活的调度策略,它允许定义一组规则,根据这些规则,调度器会尝试将 Pod 调度到最合适的节点上,但如果找不到完全匹配的节点&a…...
高等数学学习笔记 ☞ 不定积分的积分法
1. 第一换元积分法 1. 基础概念:形如的过程,称为第一换元积分法。 2. 核心思想:通过对被积函数的观察(把被积函数的形式与积分表的积分公式进行比较),把外部的部分项拿到的内部(求原函数), 然后进行拼凑,…...
【HTTP】详解
目录 HTTP 基本概念啥是HTTP,有什么用?一次HTTP请求的过程当你在浏览器中输入一个浏览器地址,它会发送什么 ?---(底层流程)HTTP的协议头请求头(对应客户端)一些请求头请求方法 响应头…...
cursor重构谷粒商城01——为何要重构谷粒商城
前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。 本项目将基于谷粒商城…...
如何在 ASP.NET Core 中实现速率限制?
在 ASP.NET Core 中实现速率限制(Rate Limiting)中间件可以帮助你控制客户端对 API 的请求频率,防止滥用和过载。速率限制通常用于保护服务器资源,确保服务的稳定性和可用性。 ASP.NET Core 本身并没有内置的速率限制中间件&…...
STM32-笔记43-低功耗
一、什么是低功耗? 低功耗是指通过优化设计和采用特定的技术手段,降低电子设备在运行过程中消耗的能量,从而延长电池寿命、提高性能和减少发热。低功耗设计主要从芯片设计和系统设计两个方面进行,旨在减少所有器件的功率损耗&am…...
Facebook 隐私风波:互联网时代数据安全警钟
在社交媒体飞速发展的今天,个人数据的隐私保护已成为全球关注的焦点。作为全球最大的社交平台之一,Facebook面临的隐私问题,尤其是数据泄露事件,频繁引发公众的广泛讨论。从用户信息被滥用到数据泄漏,Facebook的隐私挑…...
Java 中的 ZoneOffset
介绍 在我们的这个世界上因为地球是圆的,所以每个国家都会有自己特定的时区。 时区在我们对时间的使用上扮演了非常重要的角色。但又因为时区的存在,又给我们带来了很多的麻烦,比如北美地区使用的夏令时和中国统一使用东 8 区的时间等。 当…...
amis模板语法、数据映射与表达式
模板字符串 表达式中获取变量 可以支持在普通文本中,使用数据映射语法:${xxx} 获取数据域中变量的值 "Hello ${text}"渲染 html 使用数据映射语法:${xxx} 获取数据域中变量的值,并渲染 HTML "<h1>Hello<…...
频域增强通道注意力机制EFCAM模型详解及代码复现
背景与动机 在深度学习领域,如何有效处理时间序列数据一直是一个重要的研究方向。近年来, 频域分析技术 在时间序列处理中展现出了巨大潜力,特别是离散余弦变换(DCT)因其能够高效捕捉低频信息并避免高频噪声干扰而受到广泛关注。 FECAM模型的开发正是基于这一背景,旨在…...
GitLab 国际站中国大陆等地区停服,如何将数据快速迁移到云效
代码托管平台 GitLab 国际站(GitLab.com)近日发布公告,官宣即将停止对中国大陆、香港、澳门地区的用户账号提供服务,并提供 60 天过渡期自行迁移账户数据,超期未迁移的账号可能会被 GitLab 清除。这一重要决策引起了全…...
BPG图像库和实用程序(译)
1)快速介绍 编辑Makefile以更改编译选项(默认编译选项对于Linux应该是OK的)。输入make来编译,输入make install来安装编译后的二进制文件。bpgview:为了编译它,你需要安装SDL和SDL_image库。Emscripten的使用ÿ…...
简述1个业务过程:从客户端调用接口,再到调用中间件(nacos、redis、kafka、feign),数据库的过程
以下是一个常见的业务过程示例,展示了从客户端调用接口,再到调用中间件(Nacos、Redis、Kafka、Feign)和数据库的过程: 假设我们有一个电商系统,客户端要查询某个商品的详细信息,这个商品信息可…...
01.02、判定是否互为字符重排
01.02、[简单] 判定是否互为字符重排 1、题目描述 给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 在这道题中,我们的任务是判断两个字符串 s1 和 s2 是…...
什么是.NET中的反射,它有哪些应用场景
反射是.NET框架提供的一种强大的机制,它允许程序在运行时查询和操作对象的类型信息。以下是对.NET中反射的详细解释及其应用场景: 一、反射的定义 在.NET中,所有类型的信息(包括类、结构、委托、接口、枚举等以及它们的成员信息…...
Linux离线部署ELK
文章目录 前期准备开始安装安装elastic search安装logstash安装kibana 配置ELK配置ElasticSearch配置logstash配置kibana 启动ELK启动命令启动测试 设置ELK策略创建ILM策略将ILM策略与日志index关联查看索引是否被ILM策略管理 前期准备 ELK包含三部分软件 ElasticSearch用作搜…...
解决 chls.pro/ssl 无法进入问题
使用charles的xdm不知道有没有遇到这样的问题。手机上访问 chls.pro/ssl 就始终进不去了… 各种检查,ip地址、证书,ssl设置等等都正常,就是进不去。 在一位好心人的提醒下得到了一个解决办法。那就是换一个地址 最新地址是: charlesproxy…...
Rust 游戏开发框架指南
Rust 游戏开发框架指南 主流游戏引擎 1. Bevy 最受欢迎的 Rust 游戏引擎之一,基于 ECS(实体组件系统)架构。 特点: 🚀 高性能 ECS 系统📦 热重载支持🎨 现代渲染器🔊 内置音频系…...
hadoop3.3和hive4.0安装——单节点
hadoop3.3x和hive4.0安装部署 为什么我要安装hive4.0,因为阿里云镜像只有hive4.0 软件相互兼容性版本 系统centos7 uname -a如果内核3.0以上可以用 安装jdk1.8以上的版本(配置好环境变量) hadoop3.3.x与hive4.0.x 创建目录 mkdir -p /us…...
centos安装golang
1.下载golang golang所有版本网址 https://studygolang.com/dl //下载并解压到/usr/local文件下 wget https://studygolang.com/dl/golang/go1.18.3.linux-amd64.tar.gz //解压并复制到/user/local文件夹下 tar -C /usr/local -zxf go1.18.3.linux-amd64.tar.gz 2.编辑环境变…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
