apiVersion: v1
kind: Node
metadata:
name: my-node
#...
spec:
taints:
- effect: NoExecute
key: key1
value: value1
#...
污点和容忍度允许节点控制哪些 Pod 应该(或不应该)在其上调度。
污点允许节点拒绝调度 Pod,除非该 Pod 具有匹配的容忍度。
您可以通过Node规范 (NodeSpec) 将污点应用于节点,并通过Pod规范 (PodSpec) 将容忍度应用于 Pod。当您将污点应用于节点时,除非 Pod 可以容忍该污点,否则调度程序无法将 Pod 放置在该节点上。
apiVersion: v1
kind: Node
metadata:
name: my-node
#...
spec:
taints:
- effect: NoExecute
key: key1
value: value1
#...
Pod规范中的容忍度示例apiVersion: v1
kind: Pod
metadata:
name: my-pod
#...
spec:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
#...
污点和容忍度由键、值和效果组成。
| 参数 | 描述 | ||||||
|---|---|---|---|---|---|---|---|
|
|
||||||
|
|
||||||
|
效果是以下之一
|
||||||
|
|
如果您向控制平面节点添加NoSchedule污点,则该节点必须具有node-role.kubernetes.io/master=:NoSchedule污点,该污点默认添加。
例如
apiVersion: v1
kind: Node
metadata:
annotations:
machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0
machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c
name: my-node
#...
spec:
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
#...
容忍度与污点匹配
如果运算符参数设置为等于
键参数相同;
值参数相同;
效果参数相同。
如果运算符参数设置为存在
键参数相同;
效果参数相同。
以下污点内置于 Red Hat OpenShift Service on AWS 中
node.kubernetes.io/not-ready:节点未准备好。这对应于节点状态Ready=False。
node.kubernetes.io/unreachable:节点控制器无法访问该节点。这对应于节点状态Ready=Unknown。
node.kubernetes.io/memory-pressure:节点存在内存压力问题。这对应于节点状态MemoryPressure=True。
node.kubernetes.io/disk-pressure:节点存在磁盘压力问题。这对应于节点状态DiskPressure=True。
node.kubernetes.io/network-unavailable:节点网络不可用。
node.kubernetes.io/unschedulable:节点不可调度。
node.cloudprovider.kubernetes.io/uninitialized:当节点控制器启动带有外部云提供程序时,此污点将设置在节点上以将其标记为不可用。云控制器管理器中的控制器初始化此节点后,kubelet 将删除此污点。
node.kubernetes.io/pid-pressure:节点存在 PID 压力。这对应于节点状态PIDPressure=True。
|
Red Hat OpenShift Service on AWS 不设置默认的 pid.available |
您可以使用 Pod 上的容忍度或节点选择器来控制 Loki Pod 在哪些节点上运行,并阻止其他工作负载使用这些节点。
您可以使用 LokiStack 自定义资源 (CR) 将容忍度应用于日志存储 Pod,并使用节点规范将污点应用于节点。节点上的污点是键:值对,指示节点排斥所有不允许该污点的 Pod。使用其他 Pod 上不存在的特定键:值对可确保只有日志存储 Pod 才能在该节点上运行。
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
name: logging-loki
namespace: openshift-logging
spec:
# ...
template:
compactor: (1)
nodeSelector:
node-role.kubernetes.io/infra: "" (2)
distributor:
nodeSelector:
node-role.kubernetes.io/infra: ""
gateway:
nodeSelector:
node-role.kubernetes.io/infra: ""
indexGateway:
nodeSelector:
node-role.kubernetes.io/infra: ""
ingester:
nodeSelector:
node-role.kubernetes.io/infra: ""
querier:
nodeSelector:
node-role.kubernetes.io/infra: ""
queryFrontend:
nodeSelector:
node-role.kubernetes.io/infra: ""
ruler:
nodeSelector:
node-role.kubernetes.io/infra: ""
# ...
| 1 | 指定应用于节点选择器的组件 Pod 类型。 |
| 2 | 指定移动到包含已定义标签的节点的 Pod。 |
在上一个示例配置中,所有 Loki Pod 都被移动到包含node-role.kubernetes.io/infra: ""标签的节点。
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
name: logging-loki
namespace: openshift-logging
spec:
# ...
template:
compactor:
nodeSelector:
node-role.kubernetes.io/infra: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/infra
value: reserved
- effect: NoExecute
key: node-role.kubernetes.io/infra
value: reserved
distributor:
nodeSelector:
node-role.kubernetes.io/infra: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/infra
value: reserved
- effect: NoExecute
key: node-role.kubernetes.io/infra
value: reserved
nodeSelector:
node-role.kubernetes.io/infra: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/infra
value: reserved
- effect: NoExecute
key: node-role.kubernetes.io/infra
value: reserved
indexGateway:
nodeSelector:
node-role.kubernetes.io/infra: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/infra
value: reserved
- effect: NoExecute
key: node-role.kubernetes.io/infra
value: reserved
ingester:
nodeSelector:
node-role.kubernetes.io/infra: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/infra
value: reserved
- effect: NoExecute
key: node-role.kubernetes.io/infra
value: reserved
querier:
nodeSelector:
node-role.kubernetes.io/infra: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/infra
value: reserved
- effect: NoExecute
key: node-role.kubernetes.io/infra
value: reserved
queryFrontend:
nodeSelector:
node-role.kubernetes.io/infra: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/infra
value: reserved
- effect: NoExecute
key: node-role.kubernetes.io/infra
value: reserved
ruler:
nodeSelector:
node-role.kubernetes.io/infra: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/infra
value: reserved
- effect: NoExecute
key: node-role.kubernetes.io/infra
value: reserved
gateway:
nodeSelector:
node-role.kubernetes.io/infra: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/infra
value: reserved
- effect: NoExecute
key: node-role.kubernetes.io/infra
value: reserved
# ...
要配置 LokiStack (CR) 的nodeSelector和tolerations字段,您可以使用oc explain命令查看特定资源的描述和字段
$ oc explain lokistack.spec.template
KIND: LokiStack
VERSION: loki.grafana.com/v1
RESOURCE: template <Object>
DESCRIPTION:
Template defines the resource/limits/tolerations/nodeselectors per
component
FIELDS:
compactor <Object>
Compactor defines the compaction component spec.
distributor <Object>
Distributor defines the distributor component spec.
...
有关更详细的信息,您可以添加特定字段
$ oc explain lokistack.spec.template.compactor
KIND: LokiStack
VERSION: loki.grafana.com/v1
RESOURCE: compactor <Object>
DESCRIPTION:
Compactor defines the compaction component spec.
FIELDS:
nodeSelector <map[string]string>
NodeSelector defines the labels required by a node to schedule the
component onto it.
...
默认情况下,日志收集器 Pod 具有以下tolerations配置
apiVersion: v1
kind: Pod
metadata:
name: collector-example
namespace: openshift-logging
spec:
# ...
collection:
type: vector
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/disk-pressure
operator: Exists
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/memory-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/pid-pressure
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/unschedulable
operator: Exists
# ...
您已安装 Red Hat OpenShift Logging Operator 和 OpenShift CLI (oc)。
通过运行以下命令,在您希望日志收集器 Pod 调度的节点上添加污点。
$ oc adm taint nodes <node_name> <key>=<value>:<effect>
$ oc adm taint nodes node1 collector=node:NoExecute
此示例在名为node1的节点上添加一个污点,该污点的键为collector,值为node,污点效果为NoExecute。您必须使用NoExecute污点效果。NoExecute仅调度与污点匹配的 Pod,并删除不匹配的现有 Pod。
编辑ClusterLogging自定义资源 (CR) 的collection部分,为日志收集器 Pod 配置容忍。
apiVersion: logging.openshift.io/v1
kind: ClusterLogging
metadata:
# ...
spec:
# ...
collection:
type: vector
tolerations:
- key: collector (1)
operator: Exists (2)
effect: NoExecute (3)
tolerationSeconds: 6000 (4)
resources:
limits:
memory: 2Gi
requests:
cpu: 100m
memory: 1Gi
# ...
| 1 | 指定您添加到节点的键。 |
| 2 | 指定Exists运算符,要求key/value/effect参数匹配。 |
| 3 | 指定NoExecute效果。 |
| 4 | 可选:指定tolerationSeconds参数来设置 Pod 在被驱逐之前可以绑定到节点的时间长度。 |
此容忍与oc adm taint命令创建的污点匹配。具有此容忍的 Pod 可以调度到node1。
管理员可以通过创建与支持它的ClusterLogForwarder CR 位于相同命名空间并具有相同名称的ClusterLogging自定义资源 (CR) 来修改收集器的资源或调度。
在部署中使用多个日志转发器时,ClusterLogging CR 的适用部分是managementState和collection。所有其他部分都将被忽略。
您拥有管理员权限。
您已安装 Red Hat OpenShift Logging Operator 5.8 或更高版本。
您已创建ClusterLogForwarder CR。
创建一个支持您现有ClusterLogForwarder CR 的ClusterLogging CR
ClusterLogging CR YAML 示例apiVersion: logging.openshift.io/v1
kind: ClusterLogging
metadata:
name: <name> (1)
namespace: <namespace> (2)
spec:
managementState: "Managed"
collection:
type: "vector"
tolerations:
- key: "logging"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 6000
resources:
limits:
memory: 1Gi
requests:
cpu: 100m
memory: 1Gi
nodeSelector:
collector: needed
# ...
| 1 | 名称必须与ClusterLogForwarder CR 的名称相同。 |
| 2 | 命名空间必须与ClusterLogForwarder CR 的命名空间相同。 |
通过运行以下命令来应用ClusterLogging CR
$ oc apply -f <filename>.yaml
您可以查看日志收集器 Pod 及其正在运行的相应节点。
在一个项目中运行以下命令以查看日志收集器 Pod 及其详细信息
$ oc get pods --selector component=collector -o wide -n <project_name>
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
collector-8d69v 1/1 Running 0 134m 10.130.2.30 master1.example.com <none> <none>
collector-bd225 1/1 Running 0 134m 10.131.1.11 master2.example.com <none> <none>
collector-cvrzs 1/1 Running 0 134m 10.130.0.21 master3.example.com <none> <none>
collector-gpqg2 1/1 Running 0 134m 10.128.2.27 worker1.example.com <none> <none>
collector-l9j7j 1/1 Running 0 134m 10.129.2.31 worker2.example.com <none> <none>