はじめに
Kubernetesは、コンテナオーケストレーションにおいて極めて重要なオープンソースツールです。Kubernetesは、さまざまなクラウド環境やオンプレミスのサーバーにおいて、クラスターを大規模にオーケストレーションおよび管理することで動作します。クラスターとは、コンテナ化されたアプリケーションやサービスを実行するためのホストのセットです。クラスターが動作するには、最低2つのノードが必要です – 1つの マスター ノードと、1つの ワーカー ノードです。拡張性を考慮すると、必要に応じて必要な数だけワーカーノードを追加してクラスターを拡張するオプションがあります。
Kubernetesにおけるノードとは、サーバーを指します。マスターノードは、クラスターの状態を管理するサーバーです。ワーカーノードは、ワークロードを実行するサーバーであり、これらは通常、– コンテナ化されたアプリケーションやサービス.
この ガイドでは、Ubuntu 20.04上に2つのノードで構成されるKubernetesクラスターをインストールおよびデプロイする手順を順を追って説明します. 前述のように、Kubernetesを使用する場合、2つのノードを持つことが最も基本的な構成です。基本を理解すれば、ワーカーノードをさらに追加することもできます。さらに、マスターノードがワーカーノードを制御できるように、2つのサーバーをリンクする方法についても説明します。
構成をテストするために、Docker コンテナで Nginx webserver をクラスターにデプロイします。これはKubernetesの典型的な実用例です。以下のような、Kubernetesを定義するいくつかのコンポーネントについて詳しく学びます。 kubectl や kubeadm 進めながら。また、まずは次のチュートリアルに目を通しておくことをお勧めします:「Kubernetesツールキットの基本を知る」。これにより、Kubernetesプラットフォームの基本を理解することができます。
それでは、始めましょう!
前提条件
2台のサーバーをプロビジョニングする必要があります。OSは Ubuntu 20.04です。最適なパフォーマンスを得るためのKubernetesの最小システム要件は、2GB of RAMと2 CPUsです。このUbuntuサーバーのセットアップに役立つステップバイステップのチュートリアルのステップ1から4に従うことができます。 CloudSigma上で。一方のサーバーがマスターノード、もう一方がワーカーノードになります。これら2つのサーバーには、分かりやすく次のように名前を付けました: kubernetes-master と kubernetes-worker。これにより、チュートリアルを進めやすくなります。ただし、お好みの ホスト名を自由に選択できます。
-
必ず、 sudo権限を持つユーザーを両方のノードに追加してください。このユーザーは、上記のチュートリアルで説明されているコマンドを実行するために使用します。詳細については、こちらのLinuxのsudoersファイルの設定に関するチュートリアルを参照してください。.
-
ネットワーク接続 – クラスター内のサーバーが通信できる必要があります。VMをCloudSigmaからデプロイすると、デフォルトでパブリックIPによってインターネットに接続されます。ローカルネットワークから作業している場合は、各サーバーの/etc/hostsファイルを編集して、適切にリンクする必要がある場合があります。
-
以下をインストールして有効にする必要があります: Docker を各ノードで使用します。Kubernetesは、ポッド内でコンテナを実行するためにコンテナランタイムに依存しています。選択できるコンテナプラットフォームは他にもありますが、このチュートリアルではDockerを使用します。DockerはUbuntuに必要なランタイム環境を提供します。当社の「Dockerのインストールと操作に関するチュートリアル」のステップ1、2、3に従うことができます。.
ステップ1: Kubernetesのインストール
このステップでは、Kubernetesをインストールします。Dockerのときと同様に、前提条件において、Kubernetesをインストールするために両方のノードでコマンドを実行する必要があります。各ノードで ssh両方のノードにログインして続行します。まず、 apt-transport-https パッケージのインストールから開始します。これにより、 http や https をUbuntu’sのリポジトリで利用できるようにします。また、 curl も次のステップで必要になるためインストールしてください。次のコマンドを実行します:
|
1 |
sudo apt install apt-transport-https curl |
次に、 Kubernetes 署名キーを、次のコマンドを実行して両方のノードに追加します:
|
1 |
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add |
次に、 Kubernetes リポジトリ を、次のコマンドを使用して両方のノードにパッケージソースとして追加します:
|
1 2 |
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" >> ~/kubernetes.list sudo mv ~/kubernetes.list /etc/apt/sources.list.d |
その後、ノードを更新します:
|
1 |
sudo apt update |
- Kubernetesツールのインストール
アップデートが完了したら、Kubernetesをインストールします。これには、Kubernetesを構成するさまざまなツールのインストールが含まれます: kubeadm, kubelet, kubectl、および kubernetes-cni。これらのツールは両方のノードにインストールされます。以下で各ツールについて説明します:
-
kubelet – 各ノードで実行され、コンテナランタイムでワークロードを開始するためにマスターノードとの通信を処理するエージェントです。kubeletをインストールするには、次のコマンドを入力します:
|
1 |
sudo apt install kubelet |
-
kubeadm – Kubernetesプロジェクトの一部であり、Kubernetesクラスターの初期化を支援します。kubeadmをインストールするには、次のコマンドを入力します:
|
1 |
sudo apt install kubeadm |
-
kubectl – Kubernetesクラスター内でコマンドを実行できるようにするKubernetesコマンドラインツールです。次のコマンドを実行してkubectlをインストールします:
|
1 |
sudo apt install kubectl |
-
kubernetes-cni – コンテナ内のネットワークを有効にし、コンテナ同士が通信してデータを交換できるようにします。インストールするには、次のコマンドを実行します:
|
1 |
sudo apt-get install -y kubernetes-cni |
必要に応じて、これら4つすべてを1つのコマンドでインストールすることもできます:
|
1 |
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni |
ステップ 2: スワップメモリの無効化
Kubernetesは、 スワップメモリを使用しているシステムでは動作しません。したがって、マスターノードとすべてのワーカーノードで無効にする必要があります。スワップメモリを無効にするには、次のコマンドを実行します:
|
1 |
sudo swapoff -a |
このコマンドは、システムが再起動されるまでスワップメモリを無効にします。再起動後も無効な状態を維持する必要があります。これはマスターおよびすべてのワーカーノードで行う必要があります。これを行うには、 fstab ファイル を編集し、 /swapfileの行を でコメントアウトします。#. 次のコマンドを入力して、nanoテキストエディタでファイルを開きます:
|
1 |
sudo nano /etc/fstab |
ファイル内で、 swapfileの行を、以下のスクリーンショットに示すようにコメントアウトします:

swapfileの行が表示されない場合は、無視してください。編集が終わったら、ファイルを保存して閉じます。両方のノードで同じ手順を実行します。これで、サーバーが再起動した後でも、スワップメモリの設定はオフのままになります。
ステップ 3: 一意のホスト名の設定
識別を容易にするため、ノードには一意のホスト名を設定する必要があります。多数のノードを持つクラスターをデプロイする場合は、ワーカーノードを識別するための名前(node-1、node-2など)を設定できます。前述のように、ここではノードの名前を次のように設定しています。 kubernetes-マスター および kubernetes-ワーカー。これらはサーバーの作成時に設定されています。ただし、コマンドラインからまだ設定していない場合は、自身で調整または設定できます。マスターノードのホスト名を調整するには、次のコマンドを実行します。
|
1 |
sudo hostnamectl 設定-ホスト名 kubernetes-マスター |
ワーカーノードで、次のコマンドを実行します:
|
1 |
sudo hostnamectl set-hostname kubernetes-worker |
現在のターミナルセッションを閉じて、 ssh でサーバーに再度ログインして変更を確認できます。
ステップ 4: Iptables にブリッジトラフィックを認識させる
マスターノードとワーカーノードがブリッジトラフィックを正しく認識できるように、 net.bridge.bridge-nf-call-iptables が設定で 1 に設定されていることを確認してください。まず、 br_netfilter モジュールがロードされていることを確認します。これは、次のコマンドを実行して確認できます:
|
1 |
lsmod | grep br_netfilter |
必要に応じて、次のコマンドを使用して明示的にロードできます:
|
1 |
sudo modprobe br_netfilter |
これで、次のコマンドを実行して値を1に設定できます:
|
1 |
sudo sysctl net.bridge.bridge-nf-call-iptables=1 |
ステップ 5: DockerのCgroupドライバーの変更
デフォルトでは、Dockerは “cgroupfs” をcgroupドライバーとしてインストールします。Kubernetesは、Dockerが 動作することを推奨しています。ドライバーとして “systemd”を使用します。このステップをスキップして、次のステップでkubeadmを初期化しようとすると、ターミナルに次の警告が表示されます。
|
1 2 |
[プリフライト] 実行中 プリ-フライト チェック [警告 IsDockerSystemdCheck]: 検出されました "cgroupfs" として その Docker cgroup ドライバー. その 推奨される ドライバー は "systemd". どうか 従ってください その ガイド にある https://kubernetes.io/docs/setup/cri/ |
マスターノードとワーカーノードの両方で、 cgroupdriver を次のコマンドで更新してください:
|
1 2 3 4 5 6 7 8 9 |
sudo mkdir /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF |
その後、次のコマンドを実行して、システム起動時にDockerを 再起動し、 有効化します:
|
1 2 3 |
sudo systemctl enable docker sudo systemctl daemon-reload sudo systemctl restart docker |
設定が完了したら、いよいよお楽しみのKubernetesクラスターのデプロイに進むことができます!
ステップ 6: Kubernetesマスターノードの初期化
Kubernetesクラスターをデプロイする最初のステップは、マスターノードを起動することです。マスターノードのターミナルで、次のコマンドを実行して Kubernetes-マスターを初期化します:
|
1 |
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 |
上記のコマンドを実行した際に、システムが、前提条件セクションで説明されている最小RAMやCPUなどの期待される要件を満たしていない場合、警告が表示され、クラスターは起動しません:

下のスクリーンショットは、初期化が成功したことを示しています。また、IP 10.244.0.0 でポッドネットワークを指定するフラグも追加しました。これは kube-flannel が使用するデフォルトの IP です。ポッドネットワークについては、次のステップで詳しく説明します。

出力には、 kubeadm join コマンド(IP アドレスは非表示にしています)と、このクラスターに参加させたいワーカーノードおよび他のすべてのワーカーノードで実行する一意のトークンが表示されます。次に、後でワーカーノードで使用するため、このコマンドをコピーして貼り付けます。
出力には、クラスターの使用を開始する前に、マスターノード上で一般ユーザーとして実行する必要があるいくつかの追加コマンドも表示されます。これらのコマンドを実行しましょう。
|
1 2 3 |
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config |
これでマスターノードの初期化が完了しました。ただし、ワーカーノードを参加させる前に、マスターノード上でポッドネットワークをセットアップする必要もあります。
ステップ 7: ポッドネットワークのデプロイ
ポッドネットワークはサーバー間の通信を容易にし、Kubernetesクラスターが適切に機能するために必要です。詳細については、Kubernetesクラスターネットワークの公式ドキュメントを参照してください。このチュートリアルでは、Flannelポッドネットワークを使用します。Flannelは、Kubernetesの要件を満たすシンプルなオーバーレイネットワークです。
ポッドネットワークをデプロイする前に、ファイアウォールのステータスを確認する必要があります。もし、Ubuntuサーバーのセットアップに関するチュートリアルのステップ5に従った後にファイアウォールを有効にした場合は、まず ファイアウォールルールを追加して、ポート 6443 (Kubernetesのデフォルトポート)。マスターノードとワーカーノードの両方で、次の ufw コマンドを実行します:
|
1 2 |
sudo ufw allow 6443 sudo ufw allow 6443/tcp |
その後、次の2つのコマンドを実行して、マスターノードにポッドネットワークをデプロイできます:
|
1 2 |
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml |
環境によっては、flannelネットワークが起動するまでに数秒から1分程度かかる場合があります。すべてが正常に起動したことを確認するには、次のコマンドを実行します:
|
1 |
kubectl get pods --all-namespaces |
すべてが正常に完了した場合、コマンドの出力にはすべてのサービスの状態が「Running(実行中)」として表示されるはずです:

また、コンポーネントの ヘルス(状態)をget componentstatusコマンドを使用して確認することもできます:
|
1 |
kubectl get componentstatus |

このコマンドには短縮形 cs があります:
|
1 |
kubectl get cs |

unhealthy ステータスが表示された場合は、次のファイルを修正し、このフレーズを含む (spec->containers->command) の行を削除してください - --port=0 :
|
1 |
sudo nano /etc/kubernetes/manifests/kube-scheduler.yaml |
このファイルについても同様に行います:
|
1 |
sudo nano /etc/kubernetes/manifests/kube-controller-manager.yaml |
最後に、Kubernetes サービスを再起動します:
|
1 |
sudo systemctl restart kubelet.service |
ステップ 8: Kubernetes クラスターへのワーカーノードの参加
With the kubernetes-master ノードが起動し、ポッドネットワークの準備が整ったので、ワーカーノードをクラスターに参加させることができます。このチュートリアルでは、ワーカーノードは1つだけなので、それを使って作業を進めます。複数のワーカーノードがある場合でも、以下で説明するのと同じ手順に従ってクラスターに参加させることができます。
まず、別のターミナルセッションでワーカーノードにログインします。使用するのは、 kubeadm join コマンドです。これは、ステップ 6 でマスターノードを初期化した際にターミナルに表示されたものです。コマンドを実行します:
|
1 |
sudo kubeadm join 127.0.0.188:6443 --token u81y02.91gqwkxx6rnhnnly --discovery-token-ca-cert-hash sha256:4482ab1c66bf17992ea02c1ba580f4af9f3ad4cc37b24f189db34d6e3fe95c2d |
クラスターへの参加が完了すると、以下のスクリーンショットのような同様の出力が表示されるはずです:

参加プロセスが完了したら、マスターノードのターミナルに切り替え、次のコマンドを実行してワーカーノードがクラスターに参加したことを確認します:
|
1 |
kubectl get nodes |
上記のコマンドの出力のスクリーンショットから、ワーカーノードがクラスターに参加していることが確認できます。

ステップ 9: Kubernetesクラスターへのアプリケーションのデプロイ
現時点で、Kubernetesクラスターのセットアップは正常に完了しています。サービスをデプロイして、クラスターを使用可能な状態にしましょう。Nginxは、数千の接続があっても驚異的な速度を誇る人気のWebサーバーです。このセットアップを実際のアプリケーションで使用できることを証明するために、Nginx Webサーバーをクラスターにデプロイします。
マスターノードで次のコマンドを実行して、KubernetesデプロイメントをNginx用に作成します:
|
1 |
kubectl create deployment nginx --image=nginx |
作成された デプロイメント は、 describe deployment コマンドを使用して確認できます:
|
1 |
kubectl describe deployment nginx |

To make the nginx サービス をインターネット経由でアクセス可能にするには、次のコマンドを実行します:
|
1 |
kubectl create service nodeport nginx --tcp=80:80 |

上記のコマンドは、Nginxデプロイメント用のパブリックに公開されたサービスを作成します。これは nodeport デプロイメントであるため、Kubernetesはサービスに の範囲のポートを割り当てます。32000+.
次のコマンドを実行することで、現在のサービスを取得できます:
|
1 |
kubectl get svc |

割り当てられたポートが 32264であることが確認できます。次のステップで使用するために、ターミナルに表示されたポートをメモしておいてください。
To verify that the Nginx service deployment is successful, issue a curl コールをマスターからワーカーノードに対して実行します。お使いのワーカーノードのIPと、上記のコマンドから取得したポートに置き換えてください:
|
1 |
curl your-kubernetes-worker-ip:32264 |
デフォルトのNginxの index.htmlの出力が表示されるはずです。:

必要に応じて、ブラウザでワーカーノードのIPアドレスとポートの組み合わせにアクセスし、デフォルトのNginxインデックスページを表示できます:

デプロイメントの名前を指定することで、デプロイメントを 削除することができます。たとえば、次のコマンドはデプロイメントを削除します:
|
1 |
kubectl delete deployment nginx |
これでクラスターのテストに成功しました!
まとめ
このチュートリアルでは、Ubuntu 20.04にKubernetesクラスターをインストールする方法を学びました。マスターノードとワーカーノードで構成されるクラスターをセットアップしました。Kubernetesツールセットをインストールし、ポッドネットワークを作成し、ワーカーノードをマスターノードに参加させることができました。また、Nginxウェブサーバーの基本的なデプロイをクラスターに行うことで、コンセプトのテストも行いました。これは、Ubuntu上でKubernetesクラスターを操作するための基盤となるはずです。
今回は1つのワーカーノードのみを使用しましたが、クラスターには必要な数だけノードを追加できます。もし、次のような自動化ツールを使ってDevOpsをさらに深く学びたい場合は、Ansibleなどのツールについて、AnsibleとKubeadmを使用したKubernetesクラスターデプロイのプロビジョニングを深く掘り下げるチュートリアルを用意しています。ぜひチェックしてみてください。また、Kubernetesクラスター上にPHPアプリケーションをデプロイする方法については、このチュートリアルを参照してください。.
ハッピーコンピューティング!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。