我正在使用 Ansible 设置 Kubernetes。为了设置 master,我编写了一个剧本,如下所示。
- hosts: master
become: yes
tasks:
- name: initialize the cluster
shell: kubeadm init --pod-network-cidr=10.244.0.0/16
- name: create .kube directory
become: yes
become_user: ubuntu
file:
path: $HOME/.kube
state: directory
mode: 0755
- name: copy admin.conf to user's kube config
copy:
src: /etc/kubernetes/admin.conf
dest: /home/ubuntu/.kube/config
remote_src: yes
owner: ubuntu
- name: install Pod network
become: yes
become_user: ubuntu
shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml >> pod_network_setup.txt
args:
chdir: $HOME
creates: pod_network_setup.txt
问题是,当我运行剧本时,它不会等待初始化完成,即命令“kubeadm init”返回并依次运行每个任务。由于初始化需要时间并且完成后仅创建文件“/etc/kubernetes/admin.conf”。由于 Ansible 不等待它完成,因此在任务 3 中出现错误,找不到“/etc/kubernetes/admin.conf”。
如果我运行以下 playbook,则 Ansible 会等待初始化完成,即控件挂起,直到“kubeadm init”返回。
- hosts: master
become: yes
tasks:
- name: initialize the cluster
shell: kubeadm init --pod-network-cidr=10.244.0.0/16
如何让 Ansible 等待命令“kubeadm init”完成,然后只启动另一个命令?
共有三种方式:
kubeadm init
ansible 任务后wait_for一段时间。
- hosts: master
become: yes
tasks:
- name: initialize the cluster
shell: kubeadm init --pod-network-cidr=10.244.0.0/16
- name: sleep for 20 seconds
wait_for:
timeout: 20
- hosts: master
become: yes
tasks:
- name: initialize the cluster
shell: kubeadm init --pod-network-cidr=10.244.0.0/16
register: result
until: result.stdout.find("Your Kubernetes master has initialized successfully!") != -1
retries: 1
delay: 20
注意: 这里我们重试
kubeadm init
,直到在输出中得到字符串 Your Kubernetes master has initialized successfully!
。
/etc/kubernetes/admin.conf
ansible任务后检查文件kubeadm init
是否存在。- hosts: master
become: yes
tasks:
- name: initialize the cluster
shell: kubeadm init --pod-network-cidr=10.244.0.0/16
- name: create .kube directory
become: yes
become_user: ubuntu
file:
path: $HOME/.kube
state: directory
mode: 0755
- name: Check admin.conf file exists.
stat:
path: /etc/kubernetes/admin.conf
register: k8s_conf
- name: copy admin.conf to user's kube config
copy:
src: /etc/kubernetes/admin.conf
dest: /home/ubuntu/.kube/config
remote_src: yes
owner: ubuntu
when: k8s_conf.stat.exists
注意:这里我们仅当k8s配置文件
/etc/kubernetes/admin.conf
存在时才执行admin.conf副本。
当我使用命令模块而不是 shell 模块时,它似乎在等待,因为它在复制 admin.conf 时没有遇到任何问题。创建 .kube/config 后,我的下一步是应用 flannel 覆盖,这也有效。这是我的任务。
- name: Initialize the Kubernetes cluster using kubeadm
command: kubeadm init --config /etc/kubernetes/kubeadminit.yaml
- name: create .kube in root home
file:
path: /root/.kube
state: directory
- name: copy kubernetes admin.conf to root home dir
copy:
src: /etc/kubernetes/admin.conf
dest: /root/.kube/config
remote_src: yes