前2つの記事からの続きです。2つの記事は↓のリンクカードを読んでみてください。
今回はAnsibleを使ってdockerのインストールとkubernetesのインストールまでです。
筆者の動作確認環境
この記事で使用している動作確認環境は下記のとおりです。
Ansibleをインストールした端末です。。
・H/W :Raspberry Pi 4 Model B 8GB
・OS :ubuntu-22.04.1
・作業ユーザ:ubuntu
・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で表現できればと思いますが。まだ手を出していないので、記事にできるのはいつになるかは保証できません。。。
コメント