繁体   English   中英

使用 ansible 设置 kubernetes

[英]Setup kubernetes using ansible

我正在使用 ansible 设置 kubernetes 设置。 为了设置大师,我写了一个剧本,如下所示。

- 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”。

如果我按照剧本运行,那么 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”完成,然后只启动另一个命令?

有以下三种方式:

  1. wait_for执行一段时间后kubeadm init ansible任务。
- 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
  1. 在 ansible 中使用直到
- 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! 在输出中。

  1. 执行kubeadm init任务后检查文件/etc/kubernetes/admin.conf存在。
- 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 copy。

希望这可以帮助。

当我使用命令模块而不是 shell 模块时,它似乎在等待,因为制作 admin.conf 的副本没有问题。 在创建 .kube/config 之后,我的下一步是应用法兰绒覆盖,这也有效。 这是我的任务的样子。

  - 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM