kubernetes - Kubernetes AntiAffinity over Labels - 通过节点标签传播副本
问题描述
我们有 3 台 ESXi 主机,每台上有 2 个 Kubernetes 工作人员。所有节点都标有“esxhost:esxN”,我想在这些主机上传播副本。将副本分布在工作人员上很容易,在一台主机上没有相同的服务,但我想分布在 ESXi 主机上,拥有 HA,即使两个工作人员死了,因为 ESXi 主机死了。
我该如何管理?尝试了一些选择,但没有成功。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
namespace: someNS
spec:
replicas: 2
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo-mos-node
image: registry.docker.dev...../demo:2.1.2
ports:
- containerPort: 80
env:
- name: CONFIG
value: "https://config.git.dev....."
解决方案
您可以定义反关联规则。这些用于使豆荚彼此远离。有 2 个变体:
软(preferredDuringSchedulingIgnoredDuringExecution)
硬(需要DuringSchedulingIgnoredDuringExecution)
如果指定hard variant,如果该节点上已经有一个pod,则不会将pod调度到该节点
如果您指定软变体,如果该节点已经在运行一个标签为“app”且值为“demo”的 pod,则该 pod 不希望被调度到该节点上</p>
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- demo
topologyKey: "kubernetes.io/hostname"
此外,如果您想在主节点上调度 pod,则必须删除主节点的默认污点:
kubectl get nodes
kubectl describe node master_node_name
kubectl taint nodes master_node_name key:NoSchedule-
https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
推荐阅读
- java - 为什么要爆炸不包括 spring-boot-starter-logging 的日志文件?
- gcc - 本地构建的 GCC 交叉编译器使用 -D_FORTIFY_SOURCE=2 报告 MB_LEN_MAX 错误
- html - 重定向到 html href url(li a 标签)不起作用,样式问题?
- php - 如何获得最后一个 lambda 执行时间?
- centos - NTP 守护进程运行缓慢
- python - desc 中模型的 Order_by @property 不起作用
- python - 在与机器 IP 地址不同的 IP 范围内查找设备 IP 地址
- firebase - 如何为特定身份验证提供程序注销 Firebase 用户
- .net - Visual Studio 中的包部署卡住
- jquery - 在 MVC 5 上使用 Chart.Js 未在 X 轴上显示日期