控制节点选择
本节提供有关如何安排 Redis Enterprise 集群 pod 仅放置在特定节点或节点池上的信息。
许多 Kubernetes 集群部署都有不同类型的节点,这些节点具有不同的 CPU 和内存资源,可用于调度集群工作负载。Redis Enterprise for Kubernetes 具有多种功能,可通过 Redis Enterprise 集群自定义资源定义 (CRD) 中指定的属性来控制 Redis Enterprise 集群节点 Pod 的调度。
Redis Enterprise 集群 (REC) 部署为 StatefulSet,用于管理 Redis Enterprise 集群节点 Pod。在以下情况下,调度程序会选择一个节点来部署新的 Redis Enterprise 集群节点 Pod:
- 集群已创建
- 集群大小已调整
- Pod 发生故障
以下是你可以控制 Pod 调度的方法:
使用节点选择器
nodeSelector
集群规范的属性使用与 Kubernetes 相同的值和结构。通常nodeSelector,节点标签是一种确保特定节点用于 Redis Enterprise pod 的简单方法。例如,如果节点“n1”和“n2”标记为“高内存”:
kubectl label nodes n1 memory=high
kubectl label nodes n2 memory=high
Redis Enterprise 集群 CRD 可以请求在以下节点上进行调度:
apiVersion: app.redislabs.com/v1
kind: RedisEnterpriseCluster
metadata:
name: rec
spec:
nodes: 3
nodeSelector:
memory: high
然后,当操作员创建与 pod 关联的 StatefulSet 时,nodeSelector 部分是 pod 规范的一部分。当调度程序尝试创建新的 pod 时,它需要满足节点选择约束。
使用节点池
节点池是 Kubernetes 集群部署和提供商的底层基础架构的通用部分。通常,节点池是配置类似的节点类,例如分配了相同数量的内存和 CPU 的节点。实施者通常会使用一组一致的标签来标记这些节点。
在 Google Kubernetes Engine (GKE) 上,所有节点池都具有标签cloud.google.com/gke-nodepool,其值为配置期间使用的名称。在 Microsoft Azure Kubernetes System (AKS) 上,您可以创建具有一组特定标签的节点池。其他托管集群服务可能具有类似的标签方案。
您可以使用该nodeSelector部分通过标签值请求特定节点池。例如,在 GKE 上:
apiVersion: app.redislabs.com/v1
kind: RedisEnterpriseCluster
metadata:
name: rec
spec:
nodes: 3
nodeSelector:
cloud.google.com/gke-nodepool: 'high-memory'
使用节点污点
您可以使用多个节点污点和一组容忍度来控制 Redis Enterprise 集群节点 pod 调度。集群规范的属性指定要使用的 pod 容忍度列表。该值是Kubernetes 容忍度podTolerations列表。
例如,如果集群只有一个节点池,节点污点可以控制节点允许的工作负载。您可以向节点添加污点,例如节点 n1、n2 和 n3,为 Redis Enterprise 集群保留一组节点:
kubectl taint nodes n1 db=rec:NoSchedule
kubectl taint nodes n2 db=rec:NoSchedule
kubectl taint nodes n3 db=rec:NoSchedule
这会阻止任何 pod 被调度到节点上,除非这些 pod 可以容忍污点db=rec。
然后,您可以将此污点的容忍度添加到集群规范中:
apiVersion: app.redislabs.com/v1
kind: RedisEnterpriseCluster
metadata:
name: rec
spec:
nodes: 3
podTolerations:
- key: db
operator: Equal
value: rec
effect: NoSchedule
一组污点还可以处理更复杂的用例。例如,可以使用role=test或污点通过 pod 容忍度将某个节点指定为专用于测试或开发工作负载的节点。role=dev
使用 pod 反亲和性
默认情况下,不允许将 Redis Enterprise 节点 pod 放置在同一集群的同一节点上:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: redis-enterprise
redis.io/cluster: rec
redis.io/role: node
topologyKey: kubernetes.io/hostname
每个 pod 都有上面的三个标签,其中redis.io/cluster是集群名称的标签。
您可以更改此规则以限制或包含 Redis Enterprise 集群节点 pod 可以在其上运行的节点。例如,您可以删除标签,redis.io/cluster这样即使来自不同集群的 Redis Enterprise 节点 pod 也无法在同一个 Kubernetes 节点上调度:
apiVersion: app.redislabs.com/v1
kind: RedisEnterpriseCluster
metadata:
name: rec
spec:
nodes: 3
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: redis-enterprise
redis.io/role: node
topologyKey: kubernetes.io/hostname
或者您可以防止 Redis Enterprise 节点与其他工作负载一起调度。例如,如果所有数据库工作负载都有标签“local/role: database”,则可以使用此标签避免在同一节点上调度两个数据库:
apiVersion: app.redislabs.com/v1
kind: RedisEnterpriseCluster
metadata:
name: rec
spec:
nodes: 3
extraLabels:
local/role: database
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
local/role: database
app: redis-enterprise
redis.io/cluster: rec
redis.io/role: node
topologyKey: kubernetes.io/hostname
在这种情况下,任何使用该标签部署的 podlocal/role: database都不能被安排在同一个节点上。
使用机架意识
您可以为 Redis Enterprise 配置机架区域感知,以提高分区或其他机架(或区域)相关故障期间的可用性。
机架区域感知是 Redis Enterprise 集群 CRD 中的单个属性,名为rackAwarenessNodeLabel。此标签的此值通常topology.kubernetes.io/zone如
“在多个区域中运行”中所述。
您可以使用以下命令检查节点中此标签的值:
$kubectl get nodes -o custom-columns="name:metadata.name","rack\\zone:metadata.labels.failure-domain\.beta\.kubernetes\.io/zone"
name rack\zone
ip-10-0-x-a.eu-central-1.compute.internal eu-central-1a
ip-10-0-x-b.eu-central-1.compute.internal eu-central-1a
ip-10-0-x-c.eu-central-1.compute.internal eu-central-1b
ip-10-0-x-d.eu-central-1.compute.internal eu-central-1b
启用集群角色
为了让操作员读取集群节点信息,必须为操作员创建一个集群角色,然后将该角色绑定到服务账户。
这是一个集群角色:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: redis-enterprise-operator
rules:
# needed for rack awareness
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list", "get", "watch"]
应用该角色的方法如下:
kubectl apply -f https://raw.githubusercontent.com/RedisLabs/redis-enterprise-k8s-docs/master/rack_awareness/rack_aware_cluster_role.yaml
绑定通常到redis-enterprise-operator服务帐户:
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: redis-enterprise-operator
subjects:
- kind: ServiceAccount
namespace: OPERATOR_NAMESPACE
name: redis-enterprise-operator
roleRef:
kind: ClusterRole
name: redis-enterprise-operator
apiGroup: rbac.authorization.k8s.io
可以通过运行来应用:
kubectl apply -f https://raw.githubusercontent.com/RedisLabs/redis-enterprise-k8s-docs/master/rack_awareness/rack_aware_cluster_role_binding.yaml
一旦应用了集群角色和绑定,您就可以配置 Redis Enterprise 集群以使用机架感知标签。
配置机架感知
您可以通过设置以下属性来配置要读取机架区域的节点标签rackAwarenessNodeLabel:
apiVersion: app.redislabs.com/v1
kind: RedisEnterpriseCluster
metadata:
name: example-redisenterprisecluster
spec:
nodes: 3
rackAwarenessNodeLabel: topology.kubernetes.io/zone
rackAwarenessNodeLabel属性时,操作员会将反亲和性规则的 topologyKey 更改为使用的标签名称,除非您podAntiAffinity还指定了该属性。如果您同时使用rackAwarenessNodeLabel和podAntiAffinity,则必须确保将topologyKeypod 反亲和性规则中的设置为节点标签名称。