【问题标题】:Setup kubernetes using ansible使用 ansible 设置 Kubernetes
【发布时间】:2020-01-17 02:46:15
【问题描述】:

我正在使用 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

问题是当我运行 playbook 时,它不会等待初始化完成,即命令“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”完成,然后只启动另一个命令?

【问题讨论】:

    标签: kubernetes ansible kubeadm


    【解决方案1】:

    有三种方式:

    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中使用until
    - 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 ansible任务后检查文件/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 复制。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      当我使用命令模块而不是 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
      

      【讨论】:

        猜你喜欢
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-15
        • 2015-09-26
        • 1970-01-01
        相关资源
        最近更新 更多