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>