具体的には、Docker と同じくコンテナの管理ができる Containerd のインストールを行うための各設定をおこない、インストールしてサービスの起動を行ってみます。
私が以前書いた記事を読んだことがある方は、せっかく前いろいろやったのに Docker 使わないの? と思われるかもしれません。
ちょっとした理由がありまして・・・
この環境を使って次回以降に Kubernetes(以降 k8s) を作成していこうと思ったのですが、k8s が Docker で構築できなくなりました。
K8s は Docker からコンテナを管理する部分の機能を使わせてもらいたくて Dockershim というモジュールを用意していたのですが、k8s がそれを使うのをやめることにしたためです。
昔は Docker しかなかったんですが、現在は Docker と同様にコンテナを管理する機能を提供してくれるCRIランタイム(Containerd 等)があります。
そちらを使ったほうが無駄が省けるという事のようです。(開発する部品が少なくなるほうが開発側も楽でしょうしね)
それでは、実際にどんなプレイブックを用意するのかこちらをご覧ください。
これは、ザーッっと流してみてください。
のちほど分解して説明します。(もしかしたら、コマンドとかからなんとなく処理がわかるかもしれませんが・・・)
Containerd のための設定の他に、k8s 用の設定変更も一部入っています。
参考情報:
https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/#containerd
https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
ファイル名:containerd-set.yaml
- name: setup Containerd hosts: continard remote_user: root tasks: - name: Swap Stop shell : swapoff -a shell : sed -i '/centos-swap/s/^/# /g' /etc/fstab - 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 - 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やってることは、サービスの起動と停止、設定ファイルの作成と内容の追記、yumのリポジトリ追加とパッケージのインストールなどです。
書き方なんですが、YAML形式となっていてインデントなどの位置が重要ですので自分で作成するときはご注意ください。
内容が長く読むのが大変だと思いますが、中身の解説に入りたいと思います。
- name: setup Containerd hosts: continard remote_user: rootこの部分は処理を行わせる対象の指定と処理を行うユーザーの指定となります。
『name: 』プレイブックの名前を設定しています。
『hosts: 』で inventry ファイルに記載したどのホストを対象にするのかを指定しています。
『remote_user: 』対象にアクセスしに行く際のユーザーを指定しています。
『tasks:』以降からが実際に行ってもらう作業の内容になります。
『- name: 』で各処理に名前を付けています。 どこでエラーになったのかなどを確認する際に重要になるので重複する名前は避けたほうがいいです。
tasks: - name: Swap Stop shell : swapoff -a shell : sed -i '/centos-swap/s/^/# /g' /etc/fstabk8s の要件でスワップを停止しています。
- name: SElinux Disable ansible.posix.selinux: state=disabled become: true - name: Reboot ansible.builtin.reboot: reboot_timeout=600 become: true余計なことをされると困るので、SElinux を停止します。
『ansible.posix.selinux:』モジュールを使って、設定を変更しています。
disabledにするには再起動が必要(しないと permissive)なので『ansible.builtin.reboot:』を入れています。
- name: FW Stop service: name: firewalld state: stopped enabled: no『service:』モジュールを使ってファイアウォールを止めています。
本来は K8s の必要ポートを開放するのですが検証環境なのでこうしました。
- 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『file:』モジュールを使って、/etc/modules-load.d/containerd.conf を作成
『lineinfile:』モジュールを使って、作成したファイルに "overlay" と "br_netfilter" を追記しています。
『shell :』モジュールを使って、modprobe を実行し読み込んでいます。
- 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こちらも同様に『file:』でファイルを作成し、『lineinfile:』で追記をして、『shell :』で読み込むコマンドを実行しています。
- name: Package Install yum: name: yum-utils name: device-mapper-persistent-data name: lvm2『yum:』モジュールを使って、必要なパッケージのインストールをしています。
- name: containerd add repository shell : yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoContainerd をインストールするためのリポジトリを追加しています。
お気づきかもしれませんが Docker を入れるときのリポジトリと同じです。
実はContainerd も Docker社が作ってたものなのです。
- 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: noContainerd をインストールして、設定を入れるためのファイルを作成し、内容を追記してサービスを起動しています。
というわけで内容の説明はここまでです。
本当は設定変更後に、その設定を確認するコマンドを打って『register:』に格納して『debug:』で表示するとかも入れようかと思ったんですが、さすがに長くなりすぎるので次回以降で説明するタイミングがあったら入れたいと思います。
プレイブックの他に、ホストの情報を記入する hosts ファイルも修正しなければなりません。
「/etc/ansible」配下の hosts に以下のような内容を追記します。
xxx.xxx.xxx.xxx には Ansible からアクセスを行う対象のIPアドレスを入れてください。
[continard] demo-server ansible_host=xxx.xxx.xxx.xxx実際に、実行してみましょう。
以下のコマンドで実行できます。
# ansible-playbook containerd-set.yaml・・・どうでしょうか。
人によってはエラーになると思います。
というのもですね、sshでアクセスしますのでそのサーバーに初回アクセスする状態だと認証ではじかれちゃうんですよね。
というわけで、そうなっちゃった方は以下のコマンドでsshの鍵を渡してあげましょう。
xxx.xxx.xxx.xxx には Ansible からアクセスを行う対象のIPアドレスを入れてください。
# ssh-copy-id root@xxx.xxx.xxx.xxxその後改めて実行してみてください。
そもそものプレイブックの書き方でエラーになってしまう場合は、インデントのズレなどがないか確認してみてください。
うまく処理ができた方は、Containerd をインストールしたマシンにログインして以下のコマンドを実行してください。
バージョン情報が確認できると思います。
# ctr -v ctr containerd.io 1.6.9これで kubernetes の構築を行う準備が整った状態となりました。 次回のブログ(来月)はいよいよ kubernetesK8s の構築を Ansible で行っていきたいと思います。 ただ、年末なのでいろいろ忙しく確認の時間が取れなかったりしたら1月のブログ投稿になるかもしれません。