You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Kubernetes加入令牌成功复制到所有Worker节点?

解决K8s集群Worker节点复制kubeadm令牌失败问题

问题背景

搭建单Master双Worker的Kubernetes集群时,已为两个Worker节点配置SSH密钥,但kubeadm加入令牌仅能复制到wk1,复制到wk2时报错Source (filepath) not found。

用户配置文件与任务代码:

host.ini

[masters]
master ansible_host=ipaddr

[workers]
wk1 ansible_host=ipaddr1
wk2 ansible_host=ipaddr2

Master节点任务(role/master/tasks/main.yaml)

- name: Get the token for joining the worker nodes
  tags: createjointoken
  become: yes
  command: kubeadm token create  --print-join-command
  register: join_worker_command

- name: copy the token to a file
  tags: createjointoken
  copy:
    content: "{{join_worker_command.stdout }}"
    dest: path to copy the file
    mode: 0644

Worker节点任务(role/worker/tasks/main.yaml)

- name: Copy the file 
  tags: copytkn
  become: yes
  copy:
    remote_src: yes
    src: path to file
    dest: path to file

问题原因

Worker任务中使用remote_src: yes时,Ansible会从目标Worker节点本地读取源文件,而非从Master节点拉取。wk2本地不存在该令牌文件,因此触发Source not found错误。

修复方案

以下三种方法任选其一即可解决问题:

方案1:直接传递令牌变量(最简洁)

无需依赖文件复制,直接将Master节点注册的join_worker_command变量内容写入Worker节点:
修改role/worker/tasks/main.yaml:

- name: Write kubeadm join command to worker node
  tags: copytkn
  become: yes
  copy:
    content: "{{ hostvars['master']['join_worker_command'].stdout }}"
    dest: /opt/k8s/join-command.sh  # 替换为你需要的目标路径
    mode: 0755

方案2:先拉取到控制节点再分发

  1. 在Master任务末尾添加fetch任务,将令牌文件拉取到Ansible控制节点:
    修改role/master/tasks/main.yaml:
- name: Get the token for joining the worker nodes
  tags: createjointoken
  become: yes
  command: kubeadm token create  --print-join-command
  register: join_worker_command

- name: copy the token to a file
  tags: createjointoken
  copy:
    content: "{{join_worker_command.stdout }}"
    dest: /opt/k8s/join-command.sh  # 替换为实际Master文件路径
    mode: 0644

- name: Fetch join command file to control node
  tags: createjointoken
  fetch:
    src: /opt/k8s/join-command.sh
    dest: ./tmp/join-command.sh
    flat: yes
  1. 修改Worker任务,从控制节点复制文件到Worker:
- name: Copy join command to worker node
  tags: copytkn
  become: yes
  copy:
    src: ./tmp/join-command.sh
    dest: /opt/k8s/join-command.sh  # 替换为Worker目标路径
    mode: 0755

方案3:从Master节点直接复制到Worker

通过delegate_to指定任务在Master节点执行,直接将Master上的文件复制到目标Worker:
修改role/worker/tasks/main.yaml:

- name: Copy kubeadm join command from master to worker
  tags: copytkn
  become: yes
  copy:
    src: /opt/k8s/join-command.sh  # Master上的令牌文件路径
    dest: /opt/k8s/join-command.sh  # Worker的目标路径
    remote_src: yes
  delegate_to: master

额外检查项

  • 确保Master上的文件路径在所有任务中拼写一致,无笔误
  • 验证Ansible与wk2的连接:执行ansible wk2 -m ping确认连通性
  • 检查Master上的令牌文件权限:执行ansible master -a 'ls -l /opt/k8s/join-command.sh'确保文件存在且可读

内容的提问来源于stack exchange,提问作者galaxy01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:30:54