问题描述
在一个已经工作正常的 Kubernetes 集群中,包含一个主节点和一些工作节点。我们需要添加一个节点来运行一个特定的 pod,并使其成为集群的一部分以满足网络需求。随后,该节点将被主节点在后续的 pod 创建中忽略。由于需要避免在每个 deployment 中添加选择器来排除该节点,这不是一个可行的方案。
解决方案
请注意以下操作可能涉及到版本差异,根据实际情况进行调整。
最佳解决方案
为了实现在新节点加入集群后只运行特定 pod,并在之后的主节点 pod 创建中忽略该节点,您可以使用以下步骤:
- 使用
kubeadm
添加新节点时设置 taint。 - 使用节点选择器和容忍度(tolerance)来确保只有特定 pod 被调度到新节点。
以下是详细的操作步骤:
步骤1:添加新节点并设置 taint
创建一个名为
config.yaml
的配置文件,其中包含在初始化集群时从主节点获得的配置信息。示例配置如下,您需要根据实际情况进行更新:
“`yaml
apiVersion: kubeadm.k8s.io/v1beta1
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: “:6443”
token: “your_token”
caCertHashes:- sha256:$CERT_HASH
nodeRegistration:
taints: - effect: NoSchedule
key: specialnode1.kubernetes.io/SpecialNode1
``
请确保将替换为控制平面的 IP 地址,
your_token替换为您的令牌,以及
$CERT_HASH` 替换为证书的哈希值。
- sha256:$CERT_HASH
使用以下命令将新节点加入集群并设置 taint(确保将
config.yaml
替换为您的配置文件路径):
bash
kubeadm join --config=config.yaml
步骤2:使用节点选择器和容忍度
- 创建一个 Deployment,您可以通过添加
nodeSelector
和tolerations
来控制 pod 被调度的节点。例如:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: your-deployment
spec:
replicas: 1
selector:
matchLabels:
app: your-app
template:
metadata:
labels:
app: your-app
spec:
containers:
- name: your-container
image: your-image
tolerations:
- key: specialnode1.kubernetes.io/SpecialNode1
operator: Exists
effect: NoSchedule
nodeSelector:
specialnode1.kubernetes.io/SpecialNode1: "true"
请根据实际情况修改上述示例中的名称、标签、容器信息和其他配置。
替代方案
上述方案中,在节点加入时就设置了 taint。如果您希望节点不会立即被使用,可以考虑以下步骤:
- 加入新节点。
- 使用
kubectl drain
命令驱逐新节点上的 pod,使其暂时无法调度。 - 设置 taint,并解除驱逐。
- 使用节点选择器和容忍度来调度特定的 pod。
请注意,这种方案可能会涉及更多的手动操作,但可以更好地控制新节点的使用情况。
请根据您的实际需求选择适合您情况的方案,并在进行任何更改之前务必备份您的集群数据。
以上操作示例仅供参考,请根据实际情况进行修改和测试。
总结
通过设置 taint 和使用节点选择器、容忍度等功能,您可以在新节点加入集群后,灵活地控制特定 pod 在新节点上的调度情况。根据您的实际需求,选择最适合您的解决方案,并确保在操作之前充分备份数据。