改版履歴

  • 1.0.0 : 2020/9/25

    • k8s-installer: v1.19.1-1

1. はじめに

1.1. 本書の位置づけ

本書では、オンプレミス環境に Kubernetes をインストール・利用するための手順について説明したものです。

1.2. 用語集

用語 意味

マスターノード

Kubernetesのマスターノード。 Kubernetesのマスターサーバ(kube-apiserver, kube-controller-manager, kube-scheduler, etcd) が動作する。

ワーカーノード

Kubernetesのワーカーノード。ワークロードを実行するためのノード。

HA

High Availability。HA構成を組む場合はマスターノード3台構成が必要。

2. 必要環境

2.1. システム構成

Kubernetes をインストールする際のシステム構成としては以下の3通りがあります。 構成に応じて必要なマシン数が変わってきます。

  1. スタンドアロン: 1台のみの構成

    • 1台のマシンのみを使用し、Kubernetes マスター・ワーカーを同居させる構成です。

    • ワークロードも同一マシン上で動作することになります。

    • 開発環境や検証・デモ用途でのみの利用を推奨します

  2. シングルマスター: マスター1台、ワーカー1台以上の構成

    • マスター1台に、複数台のワーカーで構成します。

    • ワークロードはワーカー上で動作します。

    • マスターノードが SPOF になりますので、本番環境での利用は推奨しません。

  3. HA構成: マスター3台、ワーカー1台以上の構成

    • マスター3台でHA構成を組む構成です。

    • マスター上で稼働する kube-apiserver に対して負荷分散をする必要があるため、別途 L4 ロードバランサが必要です。

HA構成を組む場合は、マスターノードとして最低3台のマシンが必要です。 またこれに加えてワーカーノードが最低1台、推奨3台以上が必要です。 ワーカーノードの台数は、実行するワークロードの量によって変わります。

2.2. 必要マシン

Kubernetes を構成する各マシンについて説明します。

なお、以下の必要環境は kubeadmのインストール に記載されているものとほぼ同等です。

2.2.1. OS

以下いずれかの OS がインストールされたマシンが必要です。

  • RedHat Enterprise Linux (RHEL) 7 (7.7以上), 8

    • subscription-manager で RedHat サブスクリプションの register を完了させている必要があります。

  • CentOS 7 (7.7以上), 8

  • Ubuntu 18.04, 20.04

RHEL8 / CentOS8 / Ubuntu は Ansible インストーラのみ対応しています。
RHEL8 / CentOS8 を使用する場合、firewalld を併用することはできません。

2.2.2. スペック

マシンのスペックとしては以下のものが必要です。

  • 1台あたり2GB以上のメモリ

    • ただし、2GBの場合アプリ用のスペースはほとんどありません。推奨は16GB以上です。

  • 2コア以上のCPU

2.2.3. ネットワーク

ネットワークについては以下の要件が必要です。

  • クラスター内のすべてのマシン間で通信可能なネットワーク

    • パブリックネットワークでもプライベートネットワークでも構いません

  • インターネット接続

    • Proxyサーバを経由した接続でも構いません。

    • オフラインインストール時はインターネット接続は不要です。ただし、その場合でもデフォルトルートは設定されている必要があります。

2.2.4. その他の要件

  • ユニークなhostname、MACアドレス、product_uuidが各ノードに必要

    • hostname は hostname コマンドで確認してください。

    • MAC アドレスは ip link または ifconfig -a で確認してください。

    • product_uuid は sudo cat /sys/class/dmi/id/product_uuid で確認してください。

    • 詳細は kubeadmのインストール の「MACアドレスとproduct_uuidが全てのノードでユニークであることの検証」を参照してください。

  • マシン内の特定のポートがファイヤウォールで開放されていること。

    • 開放するポートの詳細は 必須ポートの確認 を参照してください。

    • インストーラを使用する場合は、自動的にファイヤウォールの設定が行われます。

  • Swapがオフであること。

    • kubeletが正常に動作するためにはswapは必ずオフでなければなりません。

    • インストーラを使用する場合は、自動的に Swap をオフにします。

2.3. ロードバランサ

HA構成を組む場合は、L4(TCP)レベルのロードバランサが必要です。

  • ロードバランサには DNS 解決可能な FQDN 名が設定されていること

  • L4 レベルの負荷分散を行うこと

    • TCP 6443 番ポートをマスターノード(3台)の TCP 6443番ポートに負荷分散すること

    • TCPコネクションでのヘルスチェックを行うこと

3. Kubernetes インストールの概要

3.1. インストール手順

インストール手順として以下の3種類があります。Ansibleインストーラの使用を推奨します。

  1. 手動インストール: kubeadm を使用した手動インストール

    • 本手順は参考として提示しています。通常は k8s-installer インストーラを使った自動インストールを使用してください。

    • 詳細は Chapter 4, 手動インストール を参照してください。

  2. スクリプトインストーラ: shスクリプトベースのインストーラを使用した自動インストール

    • スタンドアロン・シングルマスター構成をサポートします。

    • 本インストーラは簡易版で、Kubernetes クラスタのみをセットアップします(アプリケーション類はインストールしません)。

    • 詳細は Chapter 5, スクリプトインストーラ を参照してください。

  3. Ansibleインストーラ

    • Ansibleを使用したクラスタ一括での自動インストールです。

    • Kubernetes だけでなく、ネットワーキング・ストレージ・アプリケーションのデプロイも実行します。

    • 詳細は Chapter 6, Ansibleインストーラを参照してください。

また、スクリプトインストーラ・Ansibleインストーラでは、オフラインインストールにも対応しています。 オフラインインストールでは、Internetに接続されたマシンでインストールに必要なファイルをすべて取得しておき、 これをUSBメモリ・ハードディスクなどを使用してインストール先の環境に転送してインストールします。

RHEL8 / CentOS8 / Ubuntu は Ansible インストーラのみ対応しています。

3.2. インストーラ

スクリプトインストーラ・Ansibleインストーラは、 k8s-installer に含まれています。

https://github.com/k8s-installer/k8s-installer/releases からダウンロードしてください。

4. 手動インストール

本章では手動で Kubernetes をインストールする手順ついて説明します。

なお、本項目の手順は kubeadmのインストール 手順に準じています。

本手順は RHEL7 / CentOS7 のみ対応しています。
Ansibleインストーラの利用を推奨します

手動インストール手順は、参考用として提示しています。

通常はインストーラ(推奨はAnsibleインストーラ)を使用して自動インストールを行ってください。 インストーラはここに示す手順を自動的に実行するようになっています。

4.1. 共通手順

Kubernetes のインストールに先立ち実施が必要な共通手順を説明します。 本手順はどの構成を使用する場合であっても全マシンについて実施する必要があります。

本手順はすべて root 権限で実行する必要があります。sudo -i してから実行するなどしてください。

4.1.1. Proxy 設定

インターネット接続に Proxy サーバ経由が必要な場合は、以下の手順が必要です。

4.1.1.1. Yum

/etc/yum.conf に以下の一行を追加してください。

proxy={PROXY_URL}

{PROXY_URL} には、プロキシサーバのURLを http://[proxy_hostname]:[proxy_port] 形式で指定してください。

4.1.1.2. Docker

/etc/systemd/system/docker.service.d/http-proxy.conf を以下の手順で作成してください。

mkdir -p /etc/systemd/system/docker.service.d

cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY={PROXY_URL}" "HTTPS_PROXY={PROXY_URL}" "NO_PROXY=127.0.0.1,localhost"
EOF

4.1.2. ファイヤウォール

ファイヤウォールについては、無効化するか、以下に示すInbound TCPポートをすべて開放する必要があります。 開放するポートの詳細は 必須ポートの確認 を参照してください。

  • マスターノード

    • 6443

    • 2379-2380

    • 10250-10252

  • ワーカーノード

    • 10250

    • 30000-32767

開放する手順は以下の通りです。

# for master node
firewall-cmd --add-port=6443/tcp --permanent
firewall-cmd --add-port=2379-2380/tcp --permanent
firewall-cmd --add-port=10250-10252/tcp --permanent
firewall-cmd --reload

# for worker-node
firewall-cmd --add-port=10250tcp --permanent
firewall-cmd --add-port=30000-32767/tcp --permanent
firewall-cmd --reload

4.1.3. Docker コンテナランタイムのインストール

コンテナランタイムとして、RHEL7/CentOS7標準の Docker を使用します。

RHEL7 の場合は、rhel-7-server-extra-rpms リポジトリを有効にしてください。

subscription-manager repos --enable=rhel-7-server-extras-rpms

以下手順で docker をインストール・起動してください。

yum install -y docker
systemctl enable --now docker

4.1.4. SELinux の無効化

SELinux を無効化してください。

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

4.1.5. Swap の無効化

Swap が無効化されていない場合は無効化してください。

sudo swapoff -a

また /etc/fstab を確認し、swap 設定が存在する場合はその行を無効化してください。 以下に手順例を示します。

sed -i 's/^\([^#].* swap .*\)$/#\1/' /etc/fstab

4.1.6. sysconfig 設定変更

ネットワークをブリッジできるよう、sysctl の設定を変更します。

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

4.1.7. kubeadm / kubelet / kubectl インストール

kubeadm / kubelet / kubectl を以下手順でインストールし、kubelet を起動してください。

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
EOF

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet

kubeadm / kubelet / kubectl が更新されないよう、バージョンロックを掛けてください。

yum install yum-plugin-versionlock
yum versionlock add kubeadm kubelet kubectl

4.2. シングルマスター構成インストール

シングルマスター構成のインストール手順を示します。

4.2.1. マスターノードインストール

マスターノードに Kubernetes コントロールプレーンをインストールします。

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

ここでは Pod を動作させるネットワークアドレス(CIDR)として 192.168.0.0/16 を使用しています。 使用中のアドレスと衝突している場合は、適宜変更が必要です。

インストールは数分で完了します。画面には以下のようなログが表示されるはずです。

...
[bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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

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

You can now join any number of machines by running the following on each node
as root:

  kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

上記の末尾に表示される kubadm join…​ の表示は保存(ファイルに保存するなど)してください。 kubeadm join 手順はワーカーノードが Kubernetes クラスタに参加する際に必要になります。

上記手順に従い、~/.kube/config を作成してください。

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

以下手順で Kubernetes クラスタに正常に接続できることを確認してください。

kubectl cluster-info

4.2.2. ネットワークアドオン

Podネットワークアドオンをインストールします。本手順書では、 Calico を採用しています。

以下手順で Calico をインストールしてください。

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml

4.2.3. スケジューリング設定

スタンドアロン構成の場合のみ、マスターノードをスケジュール可能に変更します。 これを実施しないと、マスターノード上でワークロードを実行できません。

kubectl taint nodes --all node-role.kubernetes.io/master:NoSchedule-

4.3. ワーカーノード追加

各ワーカーノードで以下を実行し、ワーカーノードを Kubernetes クラスタに接続します。

kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

ここで kubeadm join に指定する引数は、マスターノードのインストール時に表示された内容をそのまま利用してください。

kubeadm join の内容を忘れてしまった場合、あるいは24時間以上経過して token が無効になってしまった場合は、 マスターノード上で以下手順を実行することで token の再生成と kubeadm join コマンド再取得が可能です。

kubeadm token create --print-join-command

5. スクリプトインストーラ

スクリプトインストーラを使用したインストール手順について説明します。 スクリプトインストーラは k8s-installerscript ディレクトリに格納されています。

スクリプトインストーラを使用する場合は、各マシン上にインストーラを展開し、各マシン上でそれぞれインストール 作業を行う必要があります。

5.1. 設定

config.sample.shconfig.sh にコピーし、設定を行ってください。

  • HA構成にする場合:

    • ロードバランサのDNS名(FQDN)とポート番号をを LOAD_BALANCER_DNS, LOAD_BALANCER_PORT に指定してください。

    • ロードバランサは、指定したポートを全マスターノードにL4負荷分散するよう設定しておく必要があります。

    • 詳細は kubeadmを使用した高可用性クラスターの作成 を参照してください。

  • Internet接続に Proxy を経由する必要がある場合は、PROXY_URL, NO_PROXY の値を設定してください。

    • NO_PROXY には必ず kube-apiserver の IPアドレスまたはDNS名を指定しなければなりません。 シングルホストの場合はマスターノードの、HA構成の場合はロードバランサの値を指定してください。 これが適切に設定されていないとマスターノードのインストールが失敗します。

  • オフラインインストールを行う場合は、OFFLINE_INSTALLyes に設定してください。詳細は後述します。

5.2. Docker / kubeadm インストール

Docker, kubeadm などをインストールします。

本手順はマスター・ワーカー全マシン上でそれぞれ行う必要があります。

sudo 可能な一般ユーザ権限でログインしてください(root での直接ログインは不可)。 以下手順でインストールを実行してください。

$ sudo ./install-common.sh

5.3. マスターノードのインストール

マスターノードに Kubernetes マスターコントロールプレーンをインストールします。

マスターノード(HA構成の場合は1台目のマスターノード)にログインし、以下手順を実行してください。

# シングルマスター構成の場合
$ sudo ./install-master-single.sh
# HA構成の場合(1台目のマスターノード)
$ sudo ./install-master-ha.sh

インストールには数分かかります。 画面にワーカーノードを join するための kubeadm join コマンドラインが表示されるので、メモしてください。

インストールが完了したら、以下手順で ~/.kube/config をインストールします。

$ ./install-kubeconfig.sh

kubectl cluster-info を実施し、正常にコントロールプレーンが動作していることを確認します。

最後に calico ネットワークアドオンをインストールします。

$ ./install-cni.sh

5.4. HA構成: 残りのマスターノードのインストール

HA構成の2台目以降のマスターノードのインストール手順は、 kubeadmを使用した高可用性クラスターの作成 の「残りのコントロールプレーンノードの手順」を参照してください。

5.5. ワーカーノードのインストール

各ワーカーノードにログインし、上記取得した kubeadm join コマンドを sudo 付きで実行し、 ノードを Kubernetes クラスタに参加させてください。

5.6. インストール後の確認

マスターノード上で kubectl get nodes を実行し、全ノードが追加されていて Ready になっていることを確認してください。

また、kubectl get all -n kube-system を実行し、Podがすべて正常に起動していることを確認してください。

6. Ansibleインストーラ

Ansible ベースインストーラを使用してインストールする手順を説明します。

Ansibleインストーラを使う場合は、インストール作業は Ansible をインストールした任意のマシンで実施します。 以下、本マシンを Ansibleノードと呼びます。 なお、マスターノード・ワーカーノードのいずれかを Ansibleノードとして兼用しても構いません。

本手順は k8s-installeransible ディレクトリで作業してください。

6.1. 仕様

Ansible インストーラでデプロイされる Kubernetes クラスタの仕様は以下の通りです。

  • 全ノードに以下の設定がなされます。

    • Swap が無効になります。

    • SELinux が無効になります。

    • ファイヤウォールはデフォルトで off になります (オプションで on に設定可能)

    • sysctl 設定が変更されます。

    • コンテナランタイムがインストールされます。

      • 設定に応じて Docker または containerd がインストールされます。デフォルトは Docker です。

    • 以下のパッケージがインストールされます。

      • kubeadm, kubectl, cfssl, libselinux-python, lvm2, gnupg2, nfs-utils, nfs-common

  • kubeadm を使用して Kubernetes クラスタがデプロイされます。

    • CA 証明書有効期限は 30 年です (kubeadm デフォルトは 10年)

    • マスターノードは Schedulable に設定されます (オプションで NoSchedule に設定可能)

  • マスターノード上に ~/.kube/config が設定されます。

  • Calico network plugin がデプロイされます。

    • Overlay network (IPIP/VXLAN) は使用しません。全ノードは同一の L2 ネットワークに接続されている必要があります。

  • Kubernetes クラスタ上に以下のものがデプロイされます。ただし (*) が付与されているものはデフォルトではデプロイされません。

    • Nginx ingress controller

    • MetalLB (*)

    • rook-nfs (*)

    • rook-ceph (*)

    • storageclassデフォルト値設定 (*)

    • metrics-server

    • docker registry (*)

なお、インストールの全シーケンスは k8s-installer シーケンス を参照してください。

6.2. 必要環境

Ansibleノードに Ansible 2.9 以上をインストールする必要があります。

Ansibleノードから全マスターノード・ワーカーノードに対して ssh でログインできる必要があります。 この際、以下の条件が必要です。

  • Ansibleノードから各ノードに対して公開鍵認証で ssh 接続が可能であること。

    • この際、ログインユーザとして root は使用しないでください。

    • ログインするユーザ名は全マシンで同一にすることを推奨します。

    • パスワード認証は使用できません。必ず公開鍵認証を使用してください。

  • 公開鍵認証を行う際、パスフレーズの入力が不要であること。

    • パスフレーズを設定している場合、ssh-agent を使用する必要があります。

  • Ansibleノードから各ノードに対して ssh ログインしたあと、ログインユーザで sudo を実行可能であること。

6.2.1. ssh 公開鍵認証のセットアップ手順

Ansibleノード上に ssh 鍵ペアがまだない場合は、以下手順で作成してください。 ~/.ssh/id_rsa, ~/.ssh/id_rsa.pub が生成されます。

$ ssh-keygen

Ansibleノード上で、各マスターノード・ワーカーノード毎に以下手順を実行し公開鍵認証でログインできるようにします。 公開鍵は各ノードの ~/.ssh/authorized_keys に追加されます。

$ ssh-copy-id [hostname]

6.2.2. ssh-agent

ssh 鍵にパスフレーズを設定している場合は(セキュリティ上パスフレーズは設定すべきです)、 ssh-agent を使用してパスフレーズ入力無しで ssh ログインできるようにする必要があります。

ssh-agent の起動方法はいくつかありますが、最も簡単な方法は Ansibleノードで以下を実行する方法です。

$ exec ssh-agent $SHELL

以下手順でパスフレーズを ssh-agent に設定してください。

$ ssh-add

ログアウトすると ssh-agent は終了しますので、本手順はAnsibleノードへのログインの度に毎回実行する必要があります。

6.2.3. Ansible のインストール手順

Ansibleノード上でPython 仮想環境を作成してください。 Python 2 + virtualenv または Python 3 + venv を使用します。

Python2 + virtualenv の場合の仮想環境作成例を示します。

$ sudo yum install python-virtualenv
$ virtualenv $HOME/venv

Python 3 + venv の場合の仮想環境作成例を示します。

$ sudo subscription-manager repos --enable rhel-7-server-optional-rpms  # RHEL7の場合
$ sudo yum install python3 python3-pip gcc openssl-devel python3-devel
$ python3 -m venv $HOME/venv

以下手順で仮想環境を activate します。

$ . $HOME/venv/bin/activate

以下手順で Ansible をインストールしてください。

$ pip install -U -r requirements.txt

オフライン環境の Ansible マシンに Ansible をインストールする必要がある場合は python-offline-env を使用してください。

6.3. 設定

Ansibleノードに作業ユーザでログインします。 インストーラを展開し、以下作業を行います。

6.3.1. インベントリ

sample/hosts ファイルを inventory/hosts ファイルにコピーし、インストール先のノードの情報を設定してください。

グループが以下3つありますので、適切なグループにマシンを定義してください。

  • master_first: 1台目のマスタノードを指定してください。

  • master_secondary: HA構成を取る場合に2台目以降のマスタノードを指定してください。

  • worker: ワーカーノードを指定してください。

シングルマスター構成の場合は master_first, worker のみ設定してください (master_secondary は空にしてください)

HA構成の場合はマスターノードが3台以上の奇数台が必要です。 最初の1台をmaster_first に、残りを master_secondary に指定してください。

マシンの指定方法の例を示します。

master1 ansible_user=johndoe ansible_host=10.0.1.10 ip=10.0.1.10
  • hostname: 先頭にホスト名を指定します。指定した文字列がそのまま Kubernetes のノード名となります。

  • ansible_user: ssh ログインする際に使用するターゲットノード上のユーザ名を指定します。

    • Ansibleノード上のユーザと同一ユーザ名の場合は省略可能です。

  • ansible_host: ssh で接続する際に使用するホスト名またはIPアドレスを指定します。

    • ホスト名と同一の場合は省略可能です。

  • ip: ノードの IP アドレスを指定します。

    • クラスタの他ノードと直接通信可能な IP アドレスを指定してください。これが kube-apiserver および kubelet で使用(広告)する IP アドレスになります。

    • 省略した場合は、リモートマシンのデフォルトゲートウェイに指定されたインタフェースのIPアドレスが使用されます。

6.3.2. 変数設定

sample/group_vars/all/*.yml ファイルを inventory/group_vars/all/ ディレクトリにコピーし、適宜編集してください。

  • main.yml

    • lb_apiserver_address: HA構成の場合、ロードバランサの FQDN名またはIPアドレスを設定してください。

    • pod_subnet: Podサブネット(CIDR)を指定してください。通常は変更不要ですが、IPアドレスが既存アドレスと衝突する場合は変更が必要です。

  • offline.yml

    • offline_install: オフラインインストールをする場合は yes に設定してください。オフラインインストール手順の詳細は Chapter 10, オフラインインストール を参照してください。

  • proxy.yml

    • Internet 接続にプロキシを経由する必要がある場合は、proxy_url, proxy_noproxy を設定してください。

  • version.yml

    • インストールする Kubernetes バージョンを適宜指定します。無指定の場合は k8s-installer のデフォルト値が使用されます。

  • networking.yml

  • storage.yml

  • registry.yml

プロキシを使用する場合、proxy_noproxy には必ず kube-apiserver の IPアドレスまたはDNS名を指定しなければなりません。 シングルホストの場合はマスターノードの、HA構成の場合はロードバランサの値を指定してください。

これが適切に設定されていないとマスターノードのインストールが失敗します。

6.4. インストール

6.4.1. 共通処理

以下手順を実行し、全ノード共通の事前処理を実行します。 本手順により、オフラインリポジトリ設定、Proxy設定、必要なパッケージ(Docker/kubeadm含む)のインストール、 共通のコンフィグレーション処理、などが実行されます。

$ ansible-playbook -i inventory/hosts common.yml -K
ログイン先マシンで sudo パスワードが不要な場合は -K (--ask-become-pass) オプションを省略できます。

6.4.2. 1台目のマスターノードへの Kubernetes デプロイ

以下を実行し、1台目のマスターノードへ Kubernetes マスターをインストールします。

$ ansible-playbook -i inventory/hosts master-first.yml -K

この時点で Kubernetes はシングルノードで動作している状態になります。 当該ホストに ssh ログインし、kubectl get all --all-namespaces を実行すれば、各種 Pod が稼働していることを確認できます。

6.4.3. 2台目以降のマスターノードへのデプロイ

以下を実行し、2台目以降のマスターノードを Kubernetes クラスタに参加させます。

$ ansible-playbook -i inventory/hosts master-secondary.yml -K

6.4.4. ワーカーノードへのデプロイ

以下を実行し、全ワーカーノードを Kubernetes クラスタに参加させます。

$ ansible-playbook -i inventory/hosts worker.yml -K

6.4.5. ネットワーク・ストレージ・アプリケーション類のデプロイ

以下を実行し、ネットワーク・ストレージ・アプリケーションをデプロイします。

$ ansible-playbook -i inventory/hosts networking.yml -K
$ ansible-playbook -i inventory/hosts storage.yml -K
$ ansible-playbook -i inventory/hosts apps.yml -K
全手順を一括で行う方法

以下手順を実行することで、上記の全手順を一括で行うことも可能です。 ただし、通常は順を追って1ステップずつ確認しながら実行することをお勧めします。

$ ansible-playbook -i inventory/hosts site.yml -K

6.5. 動作確認

マスターノード上で kubectl get nodes を実行し、全ノードが追加されていて Ready になっていることを確認してください。

また、kubectl get all --all-namespaces を実行し、Podがすべて正常に起動していることを確認してください。

7. ネットワーキング

7.1. ファイヤウォール

各ノードのファイヤウォール(firewalld) はデフォルトで無効化されます。

有効化したい場合は、inventory/group_vars/all/networking.ymlfirewall_enabled の値を yes に設定してください。

RHEL 8 / CentOS 8 ではファイヤウォールは必ず無効化してください。 有効化すると kube-proxy の nftables 設定と干渉し、正常に動作しません。

7.2. Calico

CNI Plugin として Calico がインストールされます。

デフォルトでは Overlay network (IPIP/VXLAN) は使用しません。 全ノードは同一の L2 ネットワークに接続されている必要があります。

設定を変更したい場合は、inventory/group_vars/all/networking.yml をエディタで編集し設定を追加してください。

  • IPIP を使用する場合は calico_ipv4pool_ipipAlways に設定してください。

  • VXLAN を使用する場合は calico_ipv4pool_vxlanAlways に設定してください。

7.3. MetalLB

LoadBalancer の実装として MetalLB を使用することができます。

詳細は MetalLB を参照してください。 MetalLB の動作モードには L2 モードと BGP モードがありますが、本インストーラでは L2 モードのみ対応しています。

MetalLB を使用したい場合は、inventory/group_vars/all/networking.yml をエディタで編集し設定を追加してください。 設定例を以下に示します。

# Enable MetalLB?
metallb_enabled: yes

# MetalLB IP address pool range
metallb_ip_range: 192.168.1.200-192.168.1.210
  • metallb_enabled: yes に設定してください。

  • metallb_ip_range: LoadBalancer に使用する IP アドレスプールの範囲を指定してください。 各ノードが接続されたサブネット上の空きIPアドレスを指定する必要があります。

8. ストレージ

8.1. 概要

Chapter 6, Ansibleインストーラ を使用する場合は、 Rook を使用してストレージをセットアップすることができます。

以下の2種類をサポートしています。

8.2. Rook / NFS

Rook + NFS (Network File System) を使用することができます。

NFSサーバは Kubernetes クラスタ上の Pod として起動されます。 ストレージは、指定した特定の1台のノード上のストレージ(local volume)を使用し、 このノード上でNFSサーバ Pod を起動するように設定されます。

詳細は Rook Documentation の NFS を参照してください。

本設定では特定の1つのノード上のストレージを使用するため、可用性はありません。

8.2.1. 設定・デプロイ

NFS を使用する場合は inventory/group_vars/all/storage.yml に設定を記述します。 例を示します。

#----------------------------------------------------------
# rook-nfs config
#----------------------------------------------------------

# rook-nfs Enabled?
rook_nfs_enabled: yes

# Hostname hosts NFS PV local volume
rook_nfs_pv_host: "worker-1"

# NFS local volume size
#rook_nfs_pv_size: 10Gi

# NFS local volume dir on host
#rook_nfs_pv_dir: /var/lib/rook-nfs
  • rook_nfs_enabled: NFS を使用する場合、yes に設定してください。

  • rook_nfs_pv_host: Local Volume PV を作成するノード名を指定してください。

    • Inventory に記載されたノード名のいずれか1つを指定してください。

    • 指定したノード上に NFS サーバストレージが確保されます。また NFS サーバ Pod もこのノード上で動作します。

    • 指定したノードは Schedulable である必要があります。

  • rook_nfs_pv_size: Local Volume のサイズ(NFSサーバとして使用するストレージサイズ)を指定します。デフォルトは 10Gi です。

  • rook_nfs_pv_dir: Local Volume を作成するディレクトリを指定します。デフォルトは /var/lib/rook-nfs です。

以下手順でデプロイを行ってください。

$ ansible-playbook -i inventory/hosts apps.yml --tags=rook-nfs

8.2.2. ストレージクラス

本 NFS サーバに対応するストレージクラスとして、rook-nfs-share1 が追加されます。

本ストレージを使用するための Persistent Volume Claim (PVC) の例を示します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rook-nfs-pv-claim
spec:
  storageClassName: rook-nfs-share1
  accessModes:
    - ReadWriteMany
  resources:
  requests:
    storage: 100Mi

8.3. Rook / Ceph

Rook + Ceph を使用することができます。

詳細は Rook Documentation の Ceph Storage Quickstart を参照してください。

8.3.1. 必要条件

以下の条件が必要です。

  • ワーカーノードが3台以上必要です。

  • 未フォーマット/パーティション無しの Raw block device がワーカーノードに接続されている必要があります。

Ceph Prerequisites も参照してください。

8.3.2. 設定・デプロイ

Ceph を使用する場合は inventory/group_vars/all/storage.yml に設定を記述します。

#----------------------------------------------------------
# rook-ceph config
#----------------------------------------------------------
rook_ceph_enabled: yes

rook_ceph_enabled を yes に設定してください。

以下手順でデプロイを行ってください。

$ ansible-playbook -i inventory/hosts apps.yml --tags=rook-ceph

Rook / Ceph のデプロイには10分程度かかります。watch kubectl -n rook-ceph get all で状態を確認してください。

8.3.3. ストレージクラス

以下のストレージクラスが追加されます。

  • rook-ceph-block : ブロックストレージ(rbd)

  • rook-cephfs : ファイルシステム (cephfs)

本ストレージを使用するための Persistent Volume Claim (PVC) の例を示します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rook-ceph-pv-claim
spec:
  storageClassName: rook-ceph-block
  accessModes:
    - ReadWriteOnce
  resources:
  requests:
    storage: 100Mi

9. アプリケーション

Chapter 6, Ansibleインストーラ を使用している場合、いくつかのアプリケーションのデプロイを自動実行することができます。

9.1. プライベートレジストリ

プライベートレジストリをデプロイすることができます。

レジストリには、 Docker Registry を使用します。

また、コンテナイメージを格納するために Persistent Volume が必要です。 Rook / NFS または Rook / Ceph をデプロイしている場合は、これをそのまま使用できます。

9.1.1. 設定・デプロイ

プライベートレジストリを使用する場合は inventory/group_vars/all/registry.yml に設定を記述します。

# Registry enabled?
registry_enabled: yes

# Registry type: static-pod or pv
registry_type: pv

# Auth user
registry_user: registry

# Auth password
registry_password: registry

# Registry image version
#registry_version: 2.7.1

# PVC storage class name
#registry_pvc_storage_class: rook-nfs-share1  # Default to use rook-nfs
registry_pvc_storage_class: rook-ceph-block  # Use rook-ceph block storage

# PVC storage size
registry_pvc_size: 10Gi
  • registry_enabled: レジストリを有効にします。yes に設定してください。

  • registry_type: レジストリタイプを指定します。'pv' を指定してください。デフォルトは 'pv' です。

  • registry_user: レジストリ認証ユーザ名を指定します。適宜変更してください。

  • registry_password: レジストリ認証パスワードを指定します。適宜変更してください。

  • registry_pvc_storage_class: 使用する PV のストレージクラスを指定します。

    • Rook / NFS を使用する場合は rook-nfs-share1 を指定してください。

    • Rook / Ceph を使用する場合は rook-ceph-block を指定してください。

  • registry_pvc_size: レジストリとして確保する PV のサイズを指定してください。

以下手順でデプロイを行ってください。

$ ansible-playbook -i inventory/hosts apps.yml --tags=registry

9.1.2. レジストリの使用

レジストリは Node Port service として export されます。 以下手順でポート番号を確認してください。

$ kubectl -n registry get svc

レジストリの URL は https://[node]:[nodeport] となります。 ここで、node はいずれかのノードのアドレス/ホスト名、nodeport は上記で確認した NodePort のポート番号です。

以下手順で login 可能です。

$ docker login https://[node]:[nodeport]

10. オフラインインストール

10.1. 概要

オフラインインストールでは、Internetに接続されたマシンでインストールに必要なファイルをすべて取得しておき、 これをUSBメモリ・ハードディスクなどを使用してインストール先の環境に転送してインストールします。

オフラインインストールの手順は以下のようになります。

  1. Internet接続されたマシン上でスクリプトを使用してインストールに必要なファイルを取得します。

    • 具体的には、Dockerやkubeadm/kubeletなどの RPMファイル、コンテナイメージファイルなどを取得します。

    • これらのファイルをまとめた k8s-offline-files.tar.gz ファイルを生成します。

  2. 本ファイルを何らかの手段(USBメモリ・ハードディスク、VPNなど)を使用してインストール先のマシンに転送します。

  3. インストーラを使用してインストールを実行します。

10.2. オフラインインストールファイルの生成

オフラインインストールファイルを生成する手順を説明します。

10.2.1. 必要環境

  • Internet 接続されているマシン。Kubernetesクラスタを構成するマシンと同一の OS がインストールされていること。

以下手順は、上記マシンで実行してください。

10.2.2. 事前準備

RHEL 7 を使用する場合は、以下手順で rhel-7-server-extras-rpms リポジトリを有効にしておく必要があります。

$ subscription-manager repos --enable=rhel-7-server-extras-rpms

10.2.3. Proxy 設定

Internet 接続に Proxy サーバを経由する必要がある場合は、事前に Proxy 設定が必要です。

なお、config.sh に Proxy 設定を追記し sudo ./setup-proxy.sh を実行することで以下設定を自動投入可能です。

10.2.3.1. yum

/etc/yum.conf に proxy=http://proxy.example.com の行を追加して Proxy サーバを指定してください。

10.2.3.2. Docker

/etc/systemd/system/docker.service.d/http-proxy.conf を以下例を参考に作成し、docker を再起動してください。

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080" "HTTPS_PROXY=http://proxy.example.com:8080" "NO_PROXY=localhost,127.0.0.1,..."

10.2.4. オフラインインストールファイルの生成

sudo 可能な一般ユーザ権限でログインしてください。

以下手順でオフラインインストールファイルを生成してください。

$ sudo ./generate-offline.sh

オフラインインストールファイルは k8s-offline-files.tar.gz というファイル名で生成されます。

10.3. スクリプトベースインストーラ

k8s-offline-files.tar.gz をスクリプトベースインストーラのディレクトリにコピーしてください。

config.shOFFLINE_INSTALL= の値を yes に変更します。 この状態でインストールを実行するとオフラインインストールが実施されます。

10.4. Ansibleインストーラ

k8s-offline-files.tar.gz をAnsibleインストーラのディレクトリで展開してください。

inventory/group_vars/all/offline.ymloffline_install の値を yes に変更してください。 この状態でインストールを実行するとオフラインインストールが実施されます。

11. クラスタのアップグレード

Kubernetes クラスタのアップグレード手順を説明します。

11.1. 注意事項

Kubernetes クラスタは一度にバージョン 0.1 ずつしかアップグレードできません。

11.2. Ansibleインストーラ

Ansibleインストーラを使用している場合、自動でアップグレードを行うことができます。

11.2.1. オフラインインストール準備

オフラインインストールを使用している場合は、事前にオフラインインストールファイルの取得・展開が必要です。

11.2.2. バージョン設定

inventory/group_vars/all/version.yml の以下の値を変更してください。

  • kube_version: Kubernetes のバージョン

  • kubeadm_version, kubelet_version, kubectl_version: kubeadm, kubelet, kubectl のバージョン (RPMバージョン)

11.2.3. アップグレードの実行

以下手順でマスターノードをアップグレードしてください。

$ ansible-playbook -i inventory/hosts upgrade-master.yml

以下手順でワーカーノードをアップグレードしてください。

$ ansible-playbook -i inventory/hosts upgrade-worker.yml

12. 運用

12.1. 証明書の更新

Kubernetes のサーバ証明書・クライアント証明書は有効期限が1年となっているため、 定期的に証明書の更新を行わなければなりません。

詳細は Certificate Management with kubeadm を参照してください。

12.1.1. 証明書の自動更新

Kubernetes のアップグレードを行った際に、kubeadm が自動的に証明書を更新するようになっています。 Kubernetes は数ヶ月に1度マイナーバージョンアップされるため、 これに合わせて定期的にアップグレードを行えば証明書期限が切れることはありません。 (これがセキュリティを維持するためのベストプラクティスです)

12.1.2. 証明書有効期限の確認

各マスターノードで以下手順を実行することで有効期限を確認できます。

$ sudo kubeadm alpha certs check-expiration

12.1.3. 証明書の手動更新

以下手順で証明書を手動更新することができます。

12.1.3.1. Ansible インストーラを使用している場合

renew-server-certs playbook を使用して、全マスターノードの証明書を手動更新できます。 全証明書が有効期限1年で再生成されます。

$ ansible-playbook -i inventory/hosts renew-server-certs.yml
12.1.3.2. スクリプトインストーラを使用している場合

全マスターノード上で、それぞれ以下手順を実行してください。

$ sudo kubeadm alpha certs renew all
$ sudo /bin/rm /var/lib/kubelet/kubelet.crt
$ sudo /bin/rm /var/lib/kubelet/kubelet.key
$ sudo systemctl restart kubelet