如何将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:先拉取到控制节点再分发
- 在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
- 修改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
相关产品推荐
相关产品推荐

