Kubernetesのインストール方法の解説 (Ubuntu20.04.3+containerd+flannel)

kubernetesインストール2

 コンテナオーケストレーションツール「Kubernetes」をUbuntu上にセットアップしました。その際に構築した環境、手順、トラブル対応などについて解説しております。

 CRIランタイムにはContainerdオーバーレイネットワーク機能にはflannelを利用しています。

 Hyper-V上にUbuntuを2台用意しまして、マスターノードとワーカーノードを1台ずつセットアップしてから、サンプルとしてApacheコンテナを動かすところまでの内容です。

 これまではCRIとしてDocker本体を使用していましたが、今後のことを考えてContainerdのみを利用したほうが良いと思いまして、本記事の手順で構築しました。

 お役に立てれば幸いです。

Kubernetesの構築環境について

 構築した環境は以下のとおりです。

kubernetes構成図

 サーバは仮想サーバ(Hyper-V)を利用しました。

 OSは、私が普段利用していますUbuntuです。

 インストールには、便利で確実なkubeadmコマンドを使用して行いました。

 各コンポーネントのバージョンは以下のとおりです。

名称バージョン概説
Ubuntu20.04.3OS
Kubernetes1.22.2Kubernetesプロジェクト
 kube-apiserver1.22.2Kubernetesのフロントエンド
 kube-controller-manager1.22.2Kubernetesのコントローラ
 kube-scheduler1.22.2Kubernetesのスケジューラ
 kubectl1.22.2Kubernetesのコマンドラインツール
 kubeadm1.22.2Kubernetes構築ツール
 kubelet1.22.2ワーカー用エージェント
 kube-proxy1.22.2ワーカー用ネットワークプロキシ
etcd3.5.0キーバリューストア
containerd1.4.9-1CRI
flannel0.14.0オーバーレイネットワーク

Kubernetesのセットアップ

 セットアップの流れは、以下のようになります。

  1.  仮想マシン作成
  2.  OS(Ubuntu)インストール
  3.  UbuntuのKubernetes用設定
  4.  containerd(CRIランタイム)のインストールおよび設定
  5.  Kubernetesのインストール
  6.  kubernetesのマスターノード(もしくはワーカーノード)のセットアップ

 上の項目の内の1~5(黄色いアンダーライン)は、マスターノードとワーカーノードで同じ手順です。(注:IPアドレスやホスト名など設定内容に関しては異なる部分があります)

 以下で各手順を詳しく説明します。

 なお、本手順は特に断り書きが無い場合はroot権限で行って下さい。

Kubernetes(マスターノード)の構築

 最初はマスターノードからです。

仮想マシン作成

※マスターとワーカー共通の手順

 Hyper-Vは、Windows10Pro(バージョン21H1)上のものを使用しました。

 最初の1台は新規に仮想マシンを作成してUbuntuのインストールを行いましたが、2台目は仮想マシンのインポート機能を利用して作成(インポートの種類はコピー)しました。もちろん2台ともインストールしても問題ありません。

 1台目を作成した際に、作成ウィザードで設定した主な項目は以下のとおりです。

※全部の設定項目ではなく、ポイントになる部分のみ挙げています。

名称設定値
起動メモリ4096MB
「この仮想マシンに動的メモリを使用します」→ON
仮想ハードディスク127GB(デフォルト)
ネットワークの構成ブリッジ接続した仮想スイッチを選択

 仮想スイッチを作成して、ブリッジ接続にてインターネット接続できるようにしてください。

 仮想マシン作成後に、「設定」から「プロセッサ」内の仮想プロセッサの数を「2」に設定します。

OS(Ubuntu)インストール

※マスターとワーカー共通の手順

 Ubuntuは、「Ubuntu Server 20.04.3 LTS」のISOイメージをダウンロードしました。

 OSインストール時の設定内容は、特に気をつける点などはなく、ほぼデフォルトです。

 いくつかポイントになりそうなところを挙げておきます。

  • IPアドレスは固定IPを設定(デフォルトGWとDNSサーバの設定も)
  • 初期ユーザ作成時にサーバのホスト名を設定
  • 「OpenSSH server」のインストールにチェックを入れる
  • 「Featured Server Snaps」(追加で入れるパッケージを選択する部分)はチェック無し

UbuntuのKubernetes用設定

※マスターとワーカー共通の手順

 Kubernetesを動作させるために必要な設定として、Ubuntuに以下の設定を行います。

  • Swapシステム停止
  • /etc/hostsファイルへのサーバ追加

 以下で説明します。

swapシステム停止

 Kubernetesの要件として、Swapの停止があります。

 以下のコマンドで停止させてください。

# swapoff -a

 停止後は、topコマンドでswap容量がゼロになっていることを確認しましょう。

 これだけですとサーバを再起動させるとswapが起動してしまいますので、/etc/fstabファイル内のswap設定に関する行をコメントアウトします。

# vi /etc/fstab
<略>
/dev/disk/by-uuid/9b2893-7d4b-43b1-9dad-xxxxxxxxxxx /boot ext4 defaults 0 0
# /swap.img     none  swap  sw    0     0  (←この行をコメントアウトする)
<略>

※サーバの再起動は後ほど行います

/etc/hostsファイルへのサーバ追加

 マスターノードとワーカーノードの名前解決が可能となるように設定します。

 DNSなどの他システムですと、DNSにトラブルが発生しますとKubernetesにも影響が出る可能性があります。

 ですので、原始的なhostsファイルを利用した方が良いでしょう。

# vi /etc/hosts
<略>
192.168.1.100 master01
192.168.1.101 worker01

※上の内容は一例です。

 Ubuntuのインストール時に指定したIPアドレスとホスト名を使用して、すべてのマスターノードとワーカーノードに設定してください。

Containerd(CRIランタイム)のインストール

※マスターとワーカー共通の手順

 Kubernetesの公式手順に従ってContainerdをインストールします。

Containerdインストールの準備

 Containerdをインストールする前に、事前に必要となる設定を行います。

 以下の手順にて、読み込むカーネルモジュールを設定します。

# cat <<EOF | tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

 カーネルモジュールをロードします。

# modprobe overlay
# modprobe br_netfilter

 必要となるカーネルパラメータを設定します。

# cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

 カーネルパラメータを反映します。

# sysctl --system
Containerdのインストール

 Containerdをインストールしていきます。

 まずは、パッケージリストの更新です。

# apt-get update

 インストールに必要となるパッケージを入れます。

# apt-get install -y apt-transport-https ca-certificates curl software-properties-common

 Dockerの公式GPGキーを追加します。

# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

 Dockerリポジトリを追加します。

# add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"

 再度パッケージリストのアップデートを行います。

# apt-get update

 Containerdをインストールします。

# apt-get install containerd.io

 Containerdの設定を行います。

# mkdir -p /etc/containerd
# containerd config default | tee /etc/containerd/config.toml

 Containerdを再起動して定義を反映します。

# systemctl restart containerd

 Containerdのインストールはここまでです。

 念のため、以下のコマンドにてContainerdサービスが起動していることを確認しましょう。

# systemctl status containerd
● containerd.service - containerd container runtime
     Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor pr>
     Active: active (running) since Sun 2021-09-03 11:52:30 UTC; 6s ago
       Docs: https://containerd.io
    Process: 8201 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SU>
   Main PID: 8215 (containerd)
      Tasks: 9
     Memory: 15.6M
     CGroup: /system.slice/containerd.service
             mq8215 /usr/bin/containerd
・・・・・・・
<略>

 上記の青線部分が「active (running)」になっていれば起動成功です。

Kubernetesのインストール

※マスターとワーカー共通の手順

 本手順のメインとなりますKubernetesのインストールです。

 最初に、GoogleのGPGキーを取得します。

# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add

 Kubernetesのリポジトリを追加します。

# apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

 パッケージリストのアップデートを行います。

# apt-get update

 Kubernetes関連パッケージをインストールします。

# apt install kubeadm kubelet kubectl kubernetes-cni

 これでインストールは完了しました。

 サーバを再起動して、Kubernetesに必要なサービスが自動的に起動するか確認します。

Kubernetesのマスターノードのセットアップ

※ワーカーノードのセットアップの場合は不要

 マスターノードのセットアップは、以下の2つの作業になります。

  • kubeadmコマンドによるマスターノードとしてのKubernetesの起動
  • 管理者ユーザ環境のセットアップ
  • オーバーレイネットワークを制御するflannelのインストール
kubectlコマンドによるマスターとしてのKubernetesの起動

 以下のコマンドでKubernetesのマスターノードのセットアップを行います。

# kubeadm init --cri-socket=/run/containerd/containerd.sock --pod-network-cidr=10.244.0.0/16

 オプションの「--cri-socket」は、Kubernetesが使用するCRIのソケットを指定しています。

 この設定によって、CRIとしてContainerdが使用されることになります。オプションを指定しなくても自動的に認識されるようですが、明示的に指定しました。

 もうひとつのオプション「--pod-network-cidr」は、podが使用するネットワークのアドレスです。

 上に記載してます「10.244.0.0/16」の値は、後ほど出てきますflannelで作成するオーバレイネットワークのデフォルト値になります。

 問題が無いようでしたら、そのままの値をお使いください。

 コマンドを実行しますと、画面上に大量のメッセージが出力されます。

 最後に以下のようなメッセージが出力されれば正常終了です。

<略>
・・・・・・・・
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.100:6443 --token 7ycxxx.xxx372opcxxx \
        --discovery-token-ca-cert-hash sha256:xxx692e6ccxxx7667ecbxxxd725727xxx860b61xxx376418cxxx1ecb62xxx38f

 途中でエラーメッセージが出力された場合は、内容を確認して原因を取り除いてください。

 正常終了メッセージの最後に出力されているメッセージは重要ですので、テキストエディタなどにコピペして保存しておきましょう。

 ワーカーノードで実行するコマンドになります。このコマンドを実行することでワーカーのセットアップが完了します。

管理者ユーザ環境のセットアップ

 Kubernetesの管理(kubectlなどのコマンドを利用する)をrootユーザで行う場合は、お使いのシェルのプロファイル(bashの場合はホームディレクトリの.bashrc)の最後の行に以下の内容を記載してください。

export KUBECONFIG=/etc/kubernetes/admin.conf

 記載したあと、プロファイルを読込むために以下のコマンドを実行します。(シェルがbashの場合)

# source ~/.bashrc

 もちろん、ログインし直しでも大丈夫です。

 もし上の設定を行わずにkubectlコマンドなどを実行した場合は、以下のようなエラーでコマンドが実行できないはずです。

The connection to the server localhost:8080 was refused - did you specify the right host or port?

 もし一般ユーザを管理ユーザにする場合は、対象のユーザでログイン後、以下のコマンドを実行してください。(対象の一般ユーザでのオペレーションになります。)

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
flannel(オーバーレイネットワーク機能)のインストール

 flannelのインストールはkubectlコマンドにて行います。

 コマンドのオプションとして、ネット上に公開されてますflannel公式の定義ファイルを指定します。

 公開されているファイルの内容をそのまま使う場合は、以下のコマンドを実行してください。

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 定義ファイルを別途ダウンロードする場合や、定義内容を変更して利用する場合などは、curlコマンドなどでファイルをダウンロードして編集した後、kubectlコマンドで反映しても大丈夫です。

 その場合は、例えば以下のようにしてください。

# curl https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml -o flannel.yml

入手したflannel.ymlファイルを編集する

# kubectl apply -f flannel.yml

 以上でマスターノードのインストールは完了です。

 次はワーカーノードのインストールになります。

Kubernetes(ワーカーノード)の構築

 最初の方で書きましたKubernetesのセットアップの流れの手順1~5に関しましては、マスターノードと同じですので、ここでは省略させてください。

 お手数ですが、上にお戻りになって、「Kubernetesのインストール」まで行った後で以下の手順にお進みください。

 こちらから戻れます。

kubernetesのワーカーノードのセットアップ

 kubernetesのワーカーノードのセットアップは、マスターノードのセットアップ時に出力されたコマンドを実行するだけです。

 本記事の例では、以下の内容になります。

# kubeadm join 192.168.1.100:6443 --token 7ycxxx.xxx372opcxxx \
        --discovery-token-ca-cert-hash sha256:xxx692e6ccxxx7667ecbxxxd725727xxx860b61xxx376418cxxx1ecb62xxx38f

 ワーカーノードのセットアップに成功しますと、以下のメッセージが出力されます。

<略>
・・・・・・・・・
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

 ワーカーノードのセットアップは以上で終了です。

セットアップ後の動作確認

 簡単な動作確認として、以下を行いました。

  • マスターノードにて各ノードのステータス確認
  • Apacheのpodを作成、起動、動作確認

マスターノードにて各ノードのステータス確認

 マスターノードで以下のコマンドを実行します。

# kubectl get nodes

 以下のような内容が出力されました。

NAME      STATUS     ROLES                  AGE    VERSION
master01  Ready      control-plane,master   13m    v1.22.2
worker01  Ready      <none>                 2m     v1.22.2

 master01とworker01は、マスターノードとワーカノードに設定した名前です。

 両ノードともSTATUSが「Ready」になっています。マスターノードはワーカーノードを正常に認識していることがわかります。

(参考)

 ワーカーノードのサービスが起動処理中の場合には、以下のようにSTATUSが「NotReady」になる場合があります。

NAME      STATUS     ROLES                  AGE   VERSION
master01  Ready      control-plane,master   12m   v1.22.2
worker01  NotReady   <none>                 22s   v1.22.2

 もう少し待ってからステータスを確認しますと、Readyになると思います。(経験上は遅くとも1分以内)

Apacheのpodを作成、起動、動作確認

 Apacheのdockerイメージを使用してポッドを起動してみましょう。

 以下の内容のマニフェストファイルapache.yamlを作成してください。ファイル名は任意です。

apiVersion: v1
kind: Pod
metadata:
  name: apache-test
spec:
  containers:
  - image: httpd:latest
    name: apache

 以下のコマンドでKubernetesに登録してみます。

# kubectl apply -f apache.yaml
pod/apache-test created

 「pod/apache-test created」と出力されれば成功です。

 以下のコマンドで、ポッドが作成されていることを確認します。

# kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
apache-test  1/1     Running   0          43s

(参考)

ポッドが起動処理中の場合は、以下のようにSTATUSが「ContainerCreating」になる場合があります。

NAME         READY   STATUS              RESTARTS   AGE
apache-test  0/1     ContainerCreating   0          15s

 もう少し待ってからステータスを確認しますと、Runningになると思います。(経験上は遅くとも1分以内)

 以下のコマンドで「apache-test」ポッドの詳細情報を確認してみましょう。

# kubectl describe pod apache-test
Name:         apache-test
Namespace:    default
Priority:     0
Node:         kube002c/192.168.1.157
Start Time:   Mon, 04 Oct 2021 06:12:21 +0000
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.244.1.3
IPs:
  IP:  10.244.1.3
Containers:
  apache:
・・・・・・・・・・・・・
<略>

 出力内容の「IP」のところに、「10.244.1.3」と出力されています。

 このIPアドレスは、ポッドが存在するKubernetesの内部ネットワーク内での「apache-test」ポッドのものです。

 curlコマンドで接続してみましょう。

# curl http://10.244.1.3/
<html><body><h1>It works!</h1></body></html>

 Apacheのデフォルトページのhtmlソースの内容が表示されました。

 本記事はここまでとします。

おわりに

 冒頭でもふれましたが、いままではDockerをCRIとして利用していました。でも今後のことを考えて、Containerdを採用することにしました。

 ContainerdはCNCFという財団が管理しているソフトウエアですが、元々はDocker社が開発していたそうです。その後Docker社はContainerdをCNCFに寄贈し、業界標準のコンテナランタイムとして広く利用されています。

 ですので、Docker愛好者としましては安心してContainerdを利用することができます。

 今後は、Dockerはもちろんのこと、Containerd単体についても深堀していきたいと考えています。

 KubernetesのCRIとしてDockerを使用する際のインストール方法に関しましては、以下の記事をご覧ください。

 最後までお読みいただきありがとうございました!

コメント