- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有 4 个节点。 1是System,1是Dev,1是Qa,1是UAT。
我的亲和性如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth
namespace: dev
labels:
app: auth
environment: dev
app-role: api
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: auth
environment: dev
app-role: api
tier: backend
annotations:
build: _{Tag}_
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- auth
topologyKey: kubernetes.io/hostname
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: environment
operator: In
values:
- dev
containers:
- name: companyauth
image: company.azurecr.io/auth:_{Tag}_
imagePullPolicy: Always
env:
- name: ConnectionStrings__DevAuth
value: dev
ports:
- containerPort: 80
imagePullSecrets:
- name: ips
我打算确保在我的生产集群上,它在 3 个不同的可用性区域中有 3 个节点。所有 Pod 都将安排在不同的节点/可用区上。但是,如果我已经在节点上安排了 pod,那么当我进行部署时,它似乎不会覆盖已经存在的 pod。
0/4 个节点可用:1 个节点不匹配 pod 亲和性/反亲和性,3 个节点不匹配节点选择器。
但是,如果我删除 podAffinity,它会正常工作并且会用部署中的新 pod 覆盖当前节点。执行此操作的正确方法是什么,以确保我在生产集群上的部署始终在不同可用区的不同节点上安排一个 pod,并且还能够更新现有节点?
最佳答案
您的目标可以仅使用 PodAntiAffinity 来实现.
我已经使用我的 GKE
测试集群对此进行了测试,但它在 Azure
上的工作应该类似。
在您当前的设置中,您已将 podAntiAffinity
设置为 nodeAffinity
。
Pod anti-affinity
can prevent the scheduler from locating a new pod on the same node as pods with the same labels if the label selector on the new pod matches the label on the current pod.
在您的Deployment
设置中,新的 pod 将具有 labels喜欢:
app: auth
环境:dev
app-role: api
层:后端
PodAntiAffinity
被配置为不允许部署新的 pod,如果已经有带有标签的 pod:app: auth
。
NodeAffinity
被配置为仅在节点上 标签environment: dev
部署。
总结一下,你的错误:
0/4 nodes are available: 1 node(s) didn't match pod affinity/anti-affinity, 3 node(s) didn't match node selector.
1 node(s) didn't match pod affinity/anti-affinity
您的设置只允许在标签为 environment:dev
的节点上部署,并且只有一个标签为 app:auth
的 pod。
正如你所说
if I already have pods scheduled on a node, then when I do a deployment it will not overwrite the pods that already exist.
PodAntiAffinity
行为有效并且不允许部署带有标签 app: auth
的新 pod,因为已经有一个。
3 node(s) didn't match node selector.
NodeAffinity
允许仅在标签为 environment: dev
的节点上部署 pod。其他节点可能有标签,如 environment: system
、environment: uat
、environment: qa
与 environment: dev< 不匹配
标签因此与 node selector
不匹配。
最简单的方法是删除 NodeAffinity
。
虽然TolpologyKey
在PodAntiAffinity
中设置为kubernetes.io/hostname
就足够了。
The topologyKey uses the default label attached to a node to dynamically filter on the name of the node.
更多信息请查看this article .
如果您将使用 kubernetes.io/hostname
描述您的 nodes
并 grep
它们,您将获得唯一值:
$ kubectl describe node | grep kubernetes.io/hostname
kubernetes.io/hostname=gke-affinity-default-pool-27d6eabd-vhss
kubernetes.io/hostname=gke-affinity-default-pool-5014ecf7-5tkh
kubernetes.io/hostname=gke-affinity-default-pool-c2afcc97-clg9
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth
labels:
app: auth
environment: dev
app-role: api
tier: backend
spec:
replicas: 3
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: auth
environment: dev
app-role: api
tier: backend
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- auth
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
imagePullPolicy: Always
ports:
- containerPort: 80
部署此 YAML 之后。
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
auth-7fccf5f7b8-4dkc4 1/1 Running 0 9s 10.0.1.9 gke-affinity-default-pool-c2afcc97-clg9 <none> <none>
auth-7fccf5f7b8-5qgt4 1/1 Running 0 8s 10.0.2.6 gke-affinity-default-pool-5014ecf7-5tkh <none> <none>
auth-7fccf5f7b8-bdmtw 1/1 Running 0 8s 10.0.0.9 gke-affinity-default-pool-27d6eabd-vhss <none> <none>
如果您将副本数增加到 7,则不会部署更多的 pod。当 antiPodAffinity
工作时,所有新的 pod 将停留在 Pending
状态(每个节点已经有标签为 app:dev
的 pod)。
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
auth-7fccf5f7b8-4299k 0/1 Pending 0 79s <none> <none> <none> <none>
auth-7fccf5f7b8-4dkc4 1/1 Running 0 2m1s 10.0.1.9 gke-affinity-default-pool-c2afcc97-clg9 <none> <none>
auth-7fccf5f7b8-556h5 0/1 Pending 0 78s <none> <none> <none> <none>
auth-7fccf5f7b8-5qgt4 1/1 Running 0 2m 10.0.2.6 gke-affinity-default-pool-5014ecf7-5tkh <none> <none>
auth-7fccf5f7b8-bdmtw 1/1 Running 0 2m 10.0.0.9 gke-affinity-default-pool-27d6eabd-vhss <none> <none>
auth-7fccf5f7b8-q4s2c 0/1 Pending 0 79s <none> <none> <none> <none>
auth-7fccf5f7b8-twb9j 0/1 Pending 0 79s <none> <none> <none> <none>
High-Availability Deployment of Pods on Multi-Zone Worker Nodes 中描述了类似的解决方案博客。
关于kubernetes - 由于节点亲和性和 pod 亲和性,无法部署更新 Deployment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65017207/
我正在使用 JavaFX 8 创建一个应用程序。我使用拖/放动态更改网格 Pane 的内容。我希望每行或每行/列迭代 GridPane 内容。JavaFX 允许通过指定行和列在 GridPane 中添
我正在尝试将图像拖放到div上。图像没有被拖到div上并给出以下错误 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': pa
我正在 android studio 中创建内部构建 AR 导航。我正在寻找一种方法将 anchor 与其他 anchor 或 anchor 节点/节点“连接”起来。我不确定使用哪一个。基于我将强制用
我在 Hive 上运行一些作业:首先是 4 节点,然后是 2 节点。令我惊讶的是,我的 2 节点性能比我的 4 节点更好。 首先,我在一个 4 节点(4 个事件节点)上运行查询,然后关闭 2 个节点(
我有 Node* current ,我在其中存储指向列表“顶部”当前节点的指针。当我将一个新节点设置为当前节点时,出现错误: '=' : cannot convert from 'CircularDo
我是 dcos Mesos 的新手,在本地 Ubuntu 机器上安装了 dc os。 我可以查看 dcos 仪表板。 但我无法使用 dcos node ssh --master-proxy --lea
在 JavaFX 中,是否有类似 setLayout(); 的东西?或 setBounds(); ? 例如,我想将按钮定位到我想要的位置。 最佳答案 JavaFX 场景图上的所有内容都是 Node .
我正在开发一个 JavaFX 应用程序,其中我开发的类(从 javafx.scene.Parent 扩展)是根据用户在 ListView 控件中单击的条目动态创建的。 只是要清楚这个节点,它不是使用像
我正在尝试为节点-边缘关系创建一个类图,因为它可以在有向图中找到。我想传达的是,Nodes 引用了 Edges,Edges 也引用了 Nodes。每个 Edge 都恰好需要两个 Node(源和目标)。
在mapreduce作业期间,单个任务将在随机节点上运行,是否有任何方法限制应在其中运行任务的节点? 最佳答案 Hadoop不会选择节点来随机运行任务。考虑到数据局部性,否则将有很多网络开销。 任务与
有什么区别: a) nodetool 重建 b) nodetool 修复 [-pr] 换句话来说,各个命令到底是做什么的? 最佳答案 nodetool重建:类似于引导过程(当您向集群添加新节点时),但
我已将第一个 OneToMany 关系添加到我的 hibernate 3.6.10 项目中。这是一个类: /** * */ package com.heavyweightsoftware.leal
是否有可能找到正在监听触发当前函数的事件的元素? 在下面的代码中,event.target 返回 #xScrollPane 和 event.currentTarget 和 event 的最低子节点.f
我正在尝试覆盖我数据库中的一些数据。结构很简单,就是: recipes { user_1{ recipe_1{data} recipe_2{data} } user_2{
我使用 setInterval 来运行该函数,但它会多次执行函数 2... 如何在输入中插入一个值后执行函数 第一个输入与其余输入的距离不同 如何在插入 val(tab 选项)后将插入从 1 个输入移
我不知道代码有什么问题,但在 visual studio 中不断收到这些错误消息。 Error 18 error C1903: unable to recover from previous e
我正在尝试从其类中获取 SharePoint 搜索导航节点的对象。 var nodes = $("div.ms-qSuggest-listItem"); 我正在获取节点对象,现在想要获取“_promp
D:\nodeP>node main.js module.js:327 抛出错误; ^ 错误:在 Function.Module 的 Function.Module._resolveFilename
struct node{ int key, prior, cnt, val; node *l, *r; node(){} node(int nkey) : key(nkey),
我有以下代码使用迭代器将项目插入双链表。这就是我们被要求这样做的方式。代码有效,但问题是我有 24 字节的绝对内存泄漏。 NodeIterator insert(NodeIterator & itrP
我是一名优秀的程序员,十分优秀!