このブログを検索

この記事の内容は、個人の見解、検証の範囲のものであり、誤りがある可能性があります。
個人の責任において情報活用をお願いします。


2023年1月13日金曜日

やってみよう自動化ツール Ansible その4 ワーカーノード作成を自動でつくってみる

あけましておめでとうございます。
今年も当ブログをよろしくお願いします。

今回は去年作ったコントロールプレーンに追加するワーカーノードを作成していこうと思います。
なお、今回は1つの yamlファイルに命令をすべて書くのではなく、処理を『OSのセットアップ』『Containerd のセットアップ』『ワーカー用セットアップ』3つに分けて呼び出したいと思います。
ansible-playbook コマンドで呼び出すファイルには『コレとコレとコレの処理を使います』と書く感じですね。

実際にはこんな感じになります。
worker_node.yaml
- name: setup worker node
  hosts: worker
  remote_user: root

  tasks:
    - name: setup os
      include_role:
        name: os-set

    - name: setup containerd
      include_role:
        name: containerd-set

    - name: setup worker
      include_role:
        name: worker-set

このように記述すると、rolesディレクトリ配下のディレクトリ『os-set』『containerd-set』『worker-set』にある『tasks』ディレクトリ内の『main.yaml』に書かれた処理を読み込んでくれます。
文章だとよくわからないので以下のような構造にする必要があるということになります。
├── worker_node.yaml
│ 
├── roles
│     ├── os-set
│     │     └── tasks
│     │            └── main.yaml
│     │ 
│     ├── containerd-set
│     │     └── tasks
│     │            └── main.yaml
│     │ 
│     └── worker-set
│            └── tasks
│                   └── main.yaml
では、それぞれの処理を見ていきましょう。
まずはOSのセットアップです。
SElinux停止やFWの停止をしています。
roles/os-set/tasks/main.yaml
  - name: SElinux Disable
    ansible.posix.selinux: state=disabled
    become: true

  - name: Reboot
    ansible.builtin.reboot: reboot_timeout=600
    become: true

  - name: FW Stop
    service:
      name: firewalld
      state: stopped
      enabled: no
続いて、Containerd をインストールします。
  - name: Swap Stop swapoff
    shell : swapoff -a

  - name: Swap Stop /etc/fstab
    shell : sed -i '/centos-swap/s/^/# /g' /etc/fstab

  - name: kernel module file create
    file:
      path: /etc/modules-load.d/containerd.conf
      state: touch

  - name: kernel module file add line
    lineinfile:
      dest: /etc/modules-load.d/containerd.conf
      line: "{{ item }}"
    with_items:
      - "overlay"
      - "br_netfilter"

  - name: kernel module Load
    shell : modprobe overlay
    shell : modprobe br_netfilter

  - name: kernel parameter file create
    file:
      path: /etc/sysctl.d/99-kubernetes-cri.conf
      state: touch

  - name: kernel parameter file add line
    lineinfile:
      dest: /etc/sysctl.d/99-kubernetes-cri.conf
      line: "{{ item }}"
    with_items:
      - "net.bridge.bridge-nf-call-iptables  = 1"
      - "net.ipv4.ip_forward                 = 1"
      - "net.bridge.bridge-nf-call-ip6tables = 1"

  - name: System Reload
    shell : sysctl --system

  - name: Package Install
    yum:
      name: yum-utils
      name: device-mapper-persistent-data
      name: lvm2

  - name: containerd add repository
    shell : yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  - name: Containerd Install
    yum:
      name: containerd.io

  - name: containerd Setting folder create
    file:
      path: "/etc/containerd"
      state: directory

  - name: containerd Setting file create
    shell : containerd config default | sudo tee /etc/containerd/config.toml

  - name: containerd Restart
    service:
      name: containerd
      state: restarted
      enabled: no
最後に、kubeadmin をインストールします。
roles/worker-set/tasks/main.yaml
  - name: kubernetes.repo create
    file:
      path: /etc/yum.repos.d/kubernetes.repo
      state: touch

  - name: add kubernetes.repo
    lineinfile:
      dest: /etc/yum.repos.d/kubernetes.repo
      line: "{{ item }}"
    with_items:
      - "[kubernetes]"
      - "name=Kubernetes"
      - "baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64"
      - "enabled=1"
      - "gpgcheck=1"
      - "repo_gpgcheck=1"
      - "gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg"

  - name: Install kubeadm
    yum:
      name: kubeadm
上記のファイルを正しく配置して準備はおしまいです。
あとは、ansible-playbook worker_node.yaml を実行すると自動で処理を行ってくれるはずです。

このあと、コントロールプレーンで kubeadm token create --print-join-command を実行し、ワーカーで kubeadm join を実行するのですがそこはちょっと手動でお願いします・・・ 実はそこまで試したんですが、token を表示させて register: するところまではうまくいったんですがそこからコマンドだけを引っ張り出すのがうまくいかなかったのでいったん保留としています。
うまくいったら次回はそこの自動化について書きたいと思います。