如何将新的工作节点引入现有的Kubernetes集群,并仅进行选择性调度

107次阅读
没有评论

问题描述

在一个已经工作正常的 Kubernetes 集群中,包含一个主节点和一些工作节点。我们需要添加一个节点来运行一个特定的 pod,并使其成为集群的一部分以满足网络需求。随后,该节点将被主节点在后续的 pod 创建中忽略。由于需要避免在每个 deployment 中添加选择器来排除该节点,这不是一个可行的方案。

解决方案

请注意以下操作可能涉及到版本差异,根据实际情况进行调整。

最佳解决方案

为了实现在新节点加入集群后只运行特定 pod,并在之后的主节点 pod 创建中忽略该节点,您可以使用以下步骤:

  1. 使用 kubeadm 添加新节点时设置 taint。
  2. 使用节点选择器和容忍度(tolerance)来确保只有特定 pod 被调度到新节点。

以下是详细的操作步骤:

步骤1:添加新节点并设置 taint

  1. 创建一个名为 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` 替换为证书的哈希值。
  2. 使用以下命令将新节点加入集群并设置 taint(确保将 config.yaml 替换为您的配置文件路径):
    bash
    kubeadm join --config=config.yaml

步骤2:使用节点选择器和容忍度

  1. 创建一个 Deployment,您可以通过添加 nodeSelectortolerations 来控制 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。如果您希望节点不会立即被使用,可以考虑以下步骤:

  1. 加入新节点。
  2. 使用 kubectl drain 命令驱逐新节点上的 pod,使其暂时无法调度。
  3. 设置 taint,并解除驱逐。
  4. 使用节点选择器和容忍度来调度特定的 pod。

请注意,这种方案可能会涉及更多的手动操作,但可以更好地控制新节点的使用情况。

请根据您的实际需求选择适合您情况的方案,并在进行任何更改之前务必备份您的集群数据。

以上操作示例仅供参考,请根据实际情况进行修改和测试。

总结

通过设置 taint 和使用节点选择器、容忍度等功能,您可以在新节点加入集群后,灵活地控制特定 pod 在新节点上的调度情况。根据您的实际需求,选择最适合您的解决方案,并确保在操作之前充分备份数据。

正文完