AnsibleのPlaybookでDockerとKubernetesのインストール

Ansible

Ansible icon

前2つの記事からの続きです。2つの記事は↓のリンクカードを読んでみてください。

今回はAnsibleを使ってdockerのインストールとkubernetesのインストールまでです。

筆者の動作確認環境

この記事で使用している動作確認環境は下記のとおりです。

Ansibleをインストールした端末です。。

コントロールノード (Control Node)
・H/W :Raspberry Pi 4 Model B 8GB
・OS  :ubuntu-22.04.1
・作業ユーザ:ubuntu
Ansibleから操作される側です。4台を想定して資材を用意してます。
管理ノード(Managed Node)
・H/W :Raspberry Pi 4 Model B 8GB
・OS  :ubuntu-22.04.1
・作業ユーザ:ubuntu

Inventoryファイル

ansiblesが各環境に接続するために使用するInventoryファイルです。

[controlplane]
kubernetes-controlplane-1 ansible_host=192.168.192.201 ansible_connection=ssh
kubernetes-controlplane-2 ansible_host=192.168.192.202 ansible_connection=ssh

[node]
kubernetes-node-1 ansible_host=192.168.192.211 ansible_connection=ssh
kubernetes-node-2 ansible_host=192.168.192.212 ansible_connection=ssh

[controlplane:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file="~/id_ed25519"

[node:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file="~/id_ed25519"

kubernetesのControlPlane2台とNode2台構成とした場合を想定したファイルになっています。
各サーバのIPアドレスとsshの設定が完了していることが前提条件です。

ControlPlane、Nodeのそれぞれの接続先のIPアドレスはそれぞれの環境に合わせて修正が必要になります。

AnsibleのPlaybook

AnsibleのPlaybookを1つにまとめて書いてみると下記のとおりです。長いので、次のセクションである程度のまとまりごとにメモをつけます。

手順はkubernetesの公式サイトとそこからのリンク先の手順をもとにしています。

- name: Setup docker and kubernetes
  hosts: 
    - controlplane 
    - node
  become: True
  tasks:
    - name: Update hosts file
      copy:
          src: hosts
          dest: /etc/
          follow: yes

    - name: Setup time zone
      command: timedatectl set-timezone Asia/Tokyo

    - name: Install packages for docker
      apt:
        name:
          - ca-certificates 
          - curl
          - gnupg
        update_cache: true 

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu jammy stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: 
          - docker-ce
          - docker-ce-cli
          - containerd.io
          - docker-buildx-plugin
          - docker-compose-plugin
        state: latest
        update_cache: true

    - name: Install golang
      apt:
        name:
          golang-go
        update_cache: true

    - name: Checkout cri-dockerd from git
      git:
        repo: 'https://github.com/Mirantis/cri-dockerd.git'
        dest: /home/ubuntu/cri-dockerd
        
    - name: Make bin directory
      shell: mkdir -p bin
      args:
        chdir: /home/ubuntu/cri-dockerd
        
    - name: Build cri-dockerd
      shell: go build -o bin/cri-dockerd
      args:
        chdir: /home/ubuntu/cri-dockerd

    - name: Make user local bin directory
      shell: mkdir -p /usr/local/bin
      
    - name: Install cri-dockerd
      shell: install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
      args:
        chdir: /home/ubuntu/cri-dockerd

    - name: Copy program
      shell: cp -a packaging/systemd/* /etc/systemd/system
      args:
        chdir: /home/ubuntu/cri-dockerd

    - name: Create cri-docker.service
      shell: sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
      args:
        chdir: /home/ubuntu/cri-dockerd

    - name: Deamon-reload
      systemd: 
        daemon-reload: true

    - name: Enable cri-docker.service
      systemd:
        name: cri-docker
        enabled: true
        state: restarted

    - name: Enable ipv4 forwarding
      shell: cat << EOF | sudo tee /etc/modules-load.d/k8s.conf
        overlay
        br_netfilter
        EOF

    - name: Enable ipv4 forwarding2
      command: modprobe overlay

    - name: Enable ipv4 forwarding3
      command: modprobe br_netfilter

    - name: Enable ipv4 forwarding4
      shell: cat << EOF | sudo tee /etc/sysctl.d/k8s.conf
        net.bridge.bridge-nf-call-iptables  = 1
        net.bridge.bridge-nf-call-ip6tables = 1
        net.ipv4.ip_forward                 = 1
        EOF

    - name: Enable ipv4 forwarding5
      shell: sysctl --system

    - name: Install package for kubernetes
      apt:
        pkg: 
          - apt-transport-https
          - ca-certificates
          - curl
        update_cache: true

    - name: Download google cloud archive key
      shell: curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

    - name:  Add apt repo
      shell: echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

    - name: Install kubernetes
      apt:
        pkg:
          - kubelet
          - kubeadm
          - kubectl
        update_cache: true

    - name: mark version
      shell: apt-mark hold kubelet kubeadm kubectl

 

ホストの設定

playbookの先頭に対象のホストを設定します。

- name: Setup docker and kubernetes
  hosts: 
    - controlplane 
    - node
  become: True
  tasks:

3,4行目の「controlPlane」「node」はinventory.txtのグループ名と一致させています。
6行目のtasks以下に個々のタスクを定義します。

ホストファイルの配布とタイムゾーンの設定

hostsファイルの配布とタイムゾーンの設定になります。
サーバの初期設定の中に組み込んでもよいと思います。

    - name: Update hosts file
      copy:
          src: hosts
          dest: /etc/
          follow: yes

    - name: Setup time zone
      command: timedatectl set-timezone Asia/Tokyo

上記の3行目はAnsibleをインストールした側のパス。
4行目は各サーバ側のパスです。hostsファイルは通常「/etc/」に配置します。
5行目は既存のファイルがある場合に上書きするかどうか。hostsファイルは通常配置されています。今回はお勉強用なので、follow(上書き)としています。

8行目はタイムゾーンを設定するコマンドです。

Dockerインストールに必要なパッケージのインストール

Dockerのインストールに必要なパッケージのインストールになります。

    - name: Install packages for docker
      apt:
        name:
          - ca-certificates 
          - curl
          - gnupg
        update_cache: true 

上記の2行目がubuntuのパッケージインストールコマンドの「apt」に該当するタスクになります。
4~6行目に対象のパッケージを設定、
7行目はキャッシュをクリアするための設定になります。

詳細はDockerの公式サイトにあります。ここの内容を引っ張ってきています。

Dockerの公式GPGキーとリポジトリの設定

ここは公式に書かれている手順をトレースしただけです。

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu jammy stable
        state: present

2行目と7行目がそれぞれ独自のタスクになるので、注意です。
最初、commandでできないかと試していましたが、動きませんでした。Ansibleの公式を見ながらなんとか動作させることができました。

Dockerのインストール

Dockerのインストールです。ここのタスクは序盤に説明したaptなので、特に問題ないかと思います。

    - name: Update apt and install docker-ce
      apt:
        name: 
          - docker-ce
          - docker-ce-cli
          - containerd.io
          - docker-buildx-plugin
          - docker-compose-plugin
        state: latest
        update_cache: true

ここまでがDockerの公式サイトに書かれている手順をPlaybookのタスクに変換した部分になります。

cri-dockerdのインストール

Kubernetesの公式では、Dockerをコンテナエンジンにする場合、cri-dockerdのインストールを推奨していました。

cri-dockerdについては下記の際をとみてほしいです。

    - name: Install golang
      apt:
        name:
          golang-go
        update_cache: true

    - name: Checkout cri-dockerd from git
      git:
        repo: 'https://github.com/Mirantis/cri-dockerd.git'
        dest: /home/ubuntu/cri-dockerd
        
    - name: Make bin directory
      shell: mkdir -p bin
      args:
        chdir: /home/ubuntu/cri-dockerd
        
    - name: Build cri-dockerd
      shell: go build -o bin/cri-dockerd
      args:
        chdir: /home/ubuntu/cri-dockerd

    - name: Make user local bin directory
      shell: mkdir -p /usr/local/bin
      
    - name: Install cri-dockerd
      shell: install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
      args:
        chdir: /home/ubuntu/cri-dockerd

    - name: Copy program
      shell: cp -a packaging/systemd/* /etc/systemd/system
      args:
        chdir: /home/ubuntu/cri-dockerd

    - name: Create cri-docker.service
      shell: sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
      args:
        chdir: /home/ubuntu/cri-dockerd

    - name: Deamon-reload
      systemd: 
        daemon-reload: true

    - name: Enable cri-docker.service
      systemd:
        name: cri-docker
        enabled: true
        state: restarted

cri-dockerdのgithubの説明を見ていてどうしてもうまくいかなかったのが、golang(Go言語)のインストールでした。最終的にはaptでgolang-goをインストールすることで解決。

githubからのチェックアウト以降のタスクはcri-dockerdの公式サイトを参考にしたら特に問題なくPlaybookに変換できました。

IPv4フォワーディングの有効化

これもKubernetesの公式にある手順です。この辺りで、shellタスクとcommandタスクの動作の違いに気づいてきました。

    - name: Enable ipv4 forwarding
      shell: cat << EOF | sudo tee /etc/modules-load.d/k8s.conf
        overlay
        br_netfilter
        EOF

    - name: Enable ipv4 forwarding2
      command: modprobe overlay

    - name: Enable ipv4 forwarding3
      command: modprobe br_netfilter

    - name: Enable ipv4 forwarding4
      shell: cat << EOF | sudo tee /etc/sysctl.d/k8s.conf
        net.bridge.bridge-nf-call-iptables  = 1
        net.bridge.bridge-nf-call-ip6tables = 1
        net.ipv4.ip_forward                 = 1
        EOF

    - name: Enable ipv4 forwarding5
      shell: sysctl --system

公式の手順をトレースしているだけなので、とくには解説なしです。

kubernetesのインストールに必要なパッケージのインストール

ここまできたらaptでパッケージを複数まとめてインストールするのも問題なくなってきましたね。

    - name: Install package for kubernetes
      apt:
        pkg: 
          - apt-transport-https
          - ca-certificates
          - curl
        update_cache: true

ここもとくには解説不要でしょうw

Google Cloudの公開鍵のインストールとKubernetesのリポジトリ追加

ここも素直に公式の手順に従っています。

    - name: Download google cloud archive key
      shell: curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

    - name:  Add apt repo
      shell: echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

この辺りは解説なしにはなかなかできないところですね。

Kubernetesのインストールとバージョンの固定化

最後にKubernetesのインストールですね。

    - name: Install kubernetes
      apt:
        pkg:
          - kubelet
          - kubeadm
          - kubectl
        update_cache: true

    - name: mark version
      shell: apt-mark hold kubelet kubeadm kubectl

ここまでで、Playbookの解説は終わりです。

Playbookを実行する

インベントリファイルとPlaybookを同じディレクトリに配置して、コマンドを実行します。

$ ansible-playbook install_kubernetes.yaml -v -i inventory.txt

このコマンドを実行すると、4台のサーバにKubernetesのインストールが完了します。

結構時間がかかるとは思いますが、たぶん動作すると思います。たぶん。。。

まとめ

KubernetesのインストールはここまででOKのはずです。

次はKubernetesの環境とコンテナ動作までをPlaybookで表現できればと思いますが。まだ手を出していないので、記事にできるのはいつになるかは保証できません。。。

コメント

タイトルとURLをコピーしました