UbuntuにKubernetesをインストールする方法
複数のサーバーへのDockerコンテナの手動デプロイは、非常に時間がかかり、その作業を担当するシステム管理者のスケジュールを圧迫してしまうことがあります。現代のIT業界では、クラウド、マイクロサービス、コンテナの人気が高まり続けており、こうした背景から、Kubernetesのようなソリューションが開発されました。
Kubernetesは、オープンソースのコンテナ管理およびオーケストレーションソリューションであり、分散環境でのコンテナデプロイを容易にし、コンテナ化されたアプリケーションに高可用性を提供するためのクラスターを構築することができます。このブログ記事では、Dockerコンテナでアプリケーションを実行するために、UbuntuにKubernetesをインストールする方法について解説します。
Ubuntu に Kubernetes をインストールするための要件とシステム構成
Kubernetesクラスタは、マスターノードとワーカーノードで構成されています。ハードウェア構成は、ユーザーのニーズや、Dockerコンテナで実行する予定のアプリケーションによって異なります。UbuntuにKubernetesをインストールするための最小ハードウェア要件は以下の通りです:
- 少なくとも2コアのx86/x64 CPU(中央処理装置)
- 2 GB以上のRAM(ランダムアクセスメモリ)
- インターネット接続
UbuntuにKubernetesをインストールするために開く必要があるポート:
| プロトコルとポート範囲 | 出典 | 目的 | 方向 |
| TCP 443 | ワーカーノード、エンドユーザー、APIリクエスト | Kubernetes API サーバー | マスターノードへの着信 |
| TCP 10250 | マスターノード | ワーカーノードのKubeletヘルスチェックポート | ワーカーノードへの着信 |
| TCP 30000~32767 | 外部アプリケーションクライアント | 外部サービスを提供するためのデフォルトのポート範囲 | |
| UDP 8285 | ワーカーノード | FlannelオーバーレイネットワークのUDPバックエンド | |
| UDP 8472 | ワーカーノード | FlannelオーバーレイネットワークのVXLANバックエンド | |
| TCP 179 | ワーカーノード | Calico BGP ネットワークを使用する場合にのみ必要 | |
| TCP 2379~2380 | マスターノード | etcd サーバーのクライアント API | etcd ノードへの着信 |
| TCP 2379~2380 | ワーカーノード | CalicoのFlannelを使用する場合に必要なetcdサーバーのクライアントAPI |
Ubuntu にはデフォルトで iptables ファイアウォールがインストールされていますが、”初期状態”ではブロックルールは設定されていません。したがって、Kubernetes を試すために Ubuntu をインストールする場合、ファイアウォールルールを編集する必要はありません。 Kube-proxy はまず自身の iptables チェーンを配置し、その後 2 つの iptables ルールを挿入します。これらのルールは KUBE-EXTERNAL-SERVICES および KUBE-FIREWALL であり、INPUT チェーンの先頭に挿入されます。
Ubuntu への Kubernetes のインストールは、物理マシンと仮想マシンの両方で実行可能です。一般的な推奨事項として、最新バージョンの 64 ビット Ubuntu Linux を使用することが挙げられます。 本日のブログ記事では、VMware VM上で動作するUbuntu 18.04 LTSへのKubernetesのインストール方法について解説します。最初に説明するKubernetesのデプロイメントタイプは、マスターノード1台とワーカーノード2台を使用したKubernetesクラスターです。この例で使用されるマシンのノード数、ノードの役割、ホスト名、IPアドレスの条件については、以下の表をご覧ください。
| № | ノードの役割 | IPアドレス | ホスト名 |
| 1 | マスター | 192.168.101.21 | docker-nakivo21 |
| 2 | 労働者 | 192.168.101.31 | docker-nakivo31 |
| 3 | 労働者 | 192.168.101.32 | docker-nakivo32 |
VMware vSphere を使用する場合は、ESXi ホスト上で動作する仮想マシンを利用できます。また、Linux または Windows がインストールされた個人用コンピュータ上の VMware Workstation で仮想マシンを実行することも可能です。本日の例では、VMware Workstation 上で動作する仮想マシンを使用しています。仮想マシンでは NAT が使用されます ネットワーク インターネット接続が可能で、ご希望であれば VirtualBox VMware であれば、これを利用できます。
ホストマシンの IP アドレス: 10.10.10.53
NAT ネットワーク(VMNet8)の仮想ゲートウェイの IP アドレス: 192.168.101.2
すべてのUbuntuマシンに、同じLinuxユーザーが存在します: kubernetes-user
VMの設定: 2CPU、4GB RAM、20GBの仮想ディスク
以下の場所に移動することで、VMnet8のIPアドレスを変更できます。 Edit > Virtual Network Editor VMware Workstation にて。
理解を深めていただくため、本日の例では、Ansible などの自動化ツールを使用せず、すべてのコンポーネントを Linux 上に手動でインストールします。
Ubuntu VMの展開
“is”という名前の新しいVMを作成します docker-nakivo21.
最初のマシンにUbuntu 64ビットをインストールし、ホスト名とユーザー名を設定します。
VM名: docker-nakivo21
ユーザー名: kubernetes-user

インストールしたオペレーティングシステムに初めてログインした後、VMware Tools をインストールしてください。物理マシンを使用している場合は、VMware Tools を使用する必要がないため、この手順をスキップできます。
注記: その $ 先頭の文字は、そのコマンドが一般ユーザーとして実行されることを意味します(kubernetes-user (この場合は)。文字列が # 文字の場合、コマンドは次のように実行する必要があります。 ルート. その sudo (“substitute user do”または”superuser do”) コマンドを使用すると、root を含む別のユーザーとしてコマンドを実行できます。次のように入力できます。 sudo -i コンソールでroot権限を取得します。rootモードを終了するには、Ctrl+Dを押してください。
VMware Toolsは、VMwareハイパーバイザーに付属のISOイメージから、またはLinuxのリポジトリからインストールできます(詳細は後述)。
$ sudo apt-get install open-vm-tools
クリップボードの共有やファイルのドラッグ&ドロップなど、高度なデスクトップ機能が必要な場合は、次のコマンドを実行してください:
$ sudo apt-get install open-vm-tools-desktop
VMを再起動してください。
$ init 6
Kubernetes をインストールする前に Ubuntu マシンを設定する
UbuntuマシンにKubernetesをインストールする前に、いくつかの準備を行う必要があります。まず、通常のサーバーと同様に、静的IPアドレスとホスト名を設定する必要があります。
静的IPアドレスを設定する
他の種類のクラスタについても、ノードで静的IPアドレスを使用することを強く推奨します。
IPアドレスを設定する前に、Linuxのネットワークツールをインストールしてください。
$ sudo apt-get install net-tools
種類 ifconfig Ubuntu VMの現在のIPアドレスを確認するには。

IPアドレスがDHCPを介して自動的に割り当てられていることがわかります。ネットワークインターフェースの名前を覚えておいてください。この例では、その名前は ens33. 最初のイーサネットネットワークインターフェースの名前は通常、 eth0 物理マシン用。
設定ファイルを編集するにはテキストエディタが必要です。インストールしてください。 vim テキストエディタとして。
$ sudo apt-get install vim
最新のUbuntuバージョンでは、ネットワーク設定はYAMLファイルで指定されます。vimでネットワーク設定のYAMLファイルを開きます。
$ sudo vim /etc/netplan/01-network-manager-all.yaml
設定ファイルのデフォルトの表示は次のとおりです:

以下の例のように、このネットワーク設定ファイルを編集してください:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses: [192.168.101.21/24]
gateway4: 192.168.101.2
nameservers:
addresses: [192.168.101.2,8.8.8.8]
変更を保存して終了します。
:wq

$ sudo netplan try
新しい設定を適用するには、Enter キーを押してください。
ネットワーク設定が変更されたかどうかを確認し、たとえば、ping を実行してみてください。 nakivo.com.
$ ifconfig
$ ping nakivo.com

ホスト名の設定
現在のホスト名を確認してください。
$ hostnamectl
ご記憶の通り、最初のVMのホスト名は docker-nakivo21 インストール時にすでに設定済みです。ホスト名を変更するには、以下の手順を実行してください(これは、クローン作成後に2台目および3台目のVMを設定する際に必要になります。これら2台のVMは、ワーカーノードとして設定されることを想定しています):
たとえば、ホスト名を docker-nakivo21 最初のVMで、次のコマンドを実行します:
$ sudo hostnamectl set-hostname docker-nakivo21
新しいホスト名が適用されていることを確認してください。
$ less /etc/hostname
を編集する ホスト ファイル。
$ sudo vim /etc/hosts
hosts ファイルの内容は、次のように記述してください。
127.0.0.1 localhost
127.0.1.1 docker-nakivo21
マシンを再起動してください。
$ init 6
スワップファイルを無効にする
Kubernetes ではスワップファイル(スワップパーティション)の使用はサポートされておらず、Ubuntu に Kubernetes を正常にインストールするには、スワップニスを無効にする必要があります。
kubelet の CPU 使用率が高くなるのを防ぐため、スワップファイルを無効にしてください。
$ sudo swapoff -a
編集 /etc/fstab そして、次の方法を使ってその文字列をコメントアウトします。 # 文字。
$ sudo vim /etc/fstab
#/swapfile none swap sw 0 0

以下でも同じことができます。 sed たった1つのコマンドで:
$ sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
スワップを無効にする sysctl.conf
$ sudo echo "vm.swappiness=0" | sudo tee --append /etc/sysctl.conf
ここで、0はスワップ使用率(パーセント)を表します。この設定の場合、RAMが不足しているときのみスワップが使用されます(デフォルトでは、RAMの60%以上が使用されている場合にスワップが使用されます)。
再起動せずに設定変更を適用します。
$ sudo sysctl -p
注記: スワップパーティションが無効化されていない場合、 kswapd0 Kubernetes を実行している Ubuntu Linux のプロセスは、マシン上の CPU リソースを大量に消費し、アプリケーションが応答しなくなったり、システムがフリーズしたりする原因となることがあります。これは、オペレーティングシステムのメモリが不足し、Linux カーネルのシステムプロセスによって古いメモリページがスワップ領域に移動されたときに発生します。奇妙なことに、時折問題が発生し、すべての CPU リソースを消費し続ける無限ループに陥ることがあります。以下のスクリーンショットでは、 kswapd0 UbuntuにKubernetesをインストールした際の処理。負荷平均値が異常に高くなっています。

もし kswapd0 それでもCPUに過大な負荷がかかる場合は、以下のコマンドを実行してすべてのメモリキャッシュを無効化し、停止させてください kswapd0 (root 権限で実行)。
# echo 1 > /proc/sys/vm/drop_caches
VMをシャットダウンします。
$ init 0
この部分的に構成済みの仮想マシン(docker-nakivo21) をマスターノードとして使用します。ワーカーノードとして使用するマシンを2台作成します。物理マシンを使用する場合は、前述の手順を手動で繰り返してください(または、Ansible などの自動化ツールを使用して、SSH 経由で複数の Linux マシンを同時に設定することもできます)。今回の例では仮想マシン(VM)を使用しているため、Ubuntu マシンに Kubernetes をインストールするための環境準備にかかる時間を短縮するために、VM をクローンすることができます。
VMをクローンする
最初のVMをクローンします。VMware ESXiを使用している場合は、組み込みのクローン機能を利用できます。この件に関する詳細は、当社のブログ記事” VMテンプレートを使用したVMのクローン作成. VMware Workstation を使用している場合は、2つの方法(組み込みのクローンツールと手動)でVMをクローンすることもできます。[クリック] VM > Manage > Clone リンククローンを作成します。最初のVMのフルクローンを作成し、VMファイルを手動でコピーしてみましょう。この場合、ファイルは docker-nakivo21 ディレクトリを docker-nakivo31. VMファイルをコピーする前に、ディレクトリを手動で作成する必要があります。

VM名と仮想ディスクファイルへのパスが変更されたため、VMXファイルを編集してください。
displayName = "docker-nakivo31"
scsi0:0.fileName = "C:VirtualKUBERNETESdocker-nakivo31docker-nakivo31.vmdk"
nvram = "docker-nakivo31.nvram"

最初のワーカーノードとして使用するVMが作成されました。Kubernetesクラスタの2番目のワーカーノードを準備するために、最初のVMをもう一度クローンしてください。
3番目のVM(2番目のワーカーノード)のVMXファイルを、先ほど行ったのと同じように編集してください。
displayName = "docker-nakivo32"
scsi0:0.fileName = "C:VirtualKUBERNETESdocker-nakivo31docker-nakivo32.vmdk"
nvram = "docker-nakivo32.nvram"
VMware Workstation で VM のクローンを開きます(File> Open (VMのVMXファイルを選択するか)、あるいはVMのVMXファイルをダブルクリックします。3台の仮想マシン(元のVM 1台とVMのクローン2台)の電源を入れます。[クリック] コピーしました, プロンプトが表示されたら。
注記: 仮想マシンを使用している場合は、VMのクローン作成が完了したら、各VMクローンのIPアドレスとホスト名を編集してください。物理マシンを使用している場合は、各マシンのIPアドレスとホスト名に合わせて、前述の手順をすべて実行してください。
仮想マシン(VM)でのIPアドレスとホスト名の設定
のIPアドレスとホスト名を変更する docker-nakivo31 そして docker-nakivo32 VM(上記参照)。
上記のセクションで説明した手順を繰り返して、静的IPアドレスとホスト名を設定してください。
IPアドレスは次の通りである必要があります: 192.168.101.31 そして 192.168.101.32; ホスト名は docker-nakivo31 そして docker-nakivo32 それに応じて、ワーカーノードでも同様の設定を行います。
すべてのマシンは、ノードのホスト名をIPアドレスに解決できるよう設定する必要があります。DNSサーバーを設定するか、手動で ホスト 各マシン上のファイルです。編集してみましょう ホスト.
以下の文字列を ホスト 各マシン上のファイル(docker-nakivo21, docker-nakivo31, docker-nakivo32).
$ sudo vim /etc/hosts
これらの行を ホスト ファイル:
192.168.101.21 docker-nakivo21
192.168.101.31 docker-nakivo31
192.168.101.32 docker-nakivo32

各ホストから他のホストに対してpingを実行し、ホスト名が正しく解決されることを確認します:
$ ping docker-nakivo21
$ ping docker-nakivo31
$ ping docker-nakivo32
すべてのホスト(VM)でSSHアクセスを設定する
すべてのホストでSSHアクセスを設定します。各マシンで以下のコマンドを実行して、OpenSSHサーバーをインストールしてください。
$ sudo apt-get install openssh-server
のホームディレクトリに移動します kubernetes-user そして、SSH鍵ペア(秘密鍵と公開鍵からなる暗号鍵のセット)を生成します。SSH鍵ペアを使用すると、パスワードを使用せずにSSH経由でリモートのLinuxコンソールにアクセスできます。公開鍵は、リモート接続を行う側のマシンにコピーできますが、秘密鍵は極秘情報であるため、接続先のマシンに保存しておく必要があります。
$ ssh-keygen
鍵の生成にはパスワードを入力する必要はありません(パスワードは任意です)。
他のUbuntuマシンに鍵をコピーします:
$ ssh-copy-id kubernetes-user@192.168.101.31
$ ssh-copy-id kubernetes-user@192.168.101.32
キーのコピーを確認するために、ユーザーパスワードを入力してください。
2台目のマシンへの接続を試みてください(docker-nakivo31) として kubernetes-user (つまり、一般ユーザーです)。
$ ssh 'kubernetes-user@192.168.101.31'
次に、3台目のマシンへの接続をテストします(docker-nakivo32).
$ ssh 'kubernetes-user@192.168.101.32'
接続に成功すると、コンソールのコマンドプロンプトにリモートマシンの名前が表示されます。

Ctrl+D キーを押して、リモートコンソールを終了してください。
root ユーザーとして SSH 経由で接続するための鍵をコピーするにはどうすればよいですか?
Kubernetes では root 権限が必要となるため、root ユーザーによる SSH アクセスを設定するための鍵を作成しましょう。root ユーザーとして SSH 経由でアクセスする必要があるすべてのマシン(docker-nakivo21、docker-nakivo31、docker-nakivo32)で、以下のコマンドを実行してください。
$ sudo -i
SSHサーバーの設定ファイルを編集します。
# vim /etc/ssh/sshd_config
このファイルに、以下の文字列を追加または編集してください。
PermitRootLogin yes

SSH サーバーデーモンを再起動します。
# /etc/init.d/ssh stop
# /etc/init.d/ssh start
root パスワード(root ユーザーのパスワード)を設定します。
# passwd
$ cd /home/kubernetes-user/
$ sudo ssh-keygen -t rsa
SSH 経由で root としてリモートログインできるように、公開鍵をコピーしてください(前のコマンドは一般ユーザーのホームディレクトリから実行されたため、鍵はそのディレクトリに保存されています)。
$ sudo ssh-copy-id -i /home/kubernetes-user/.ssh/id_rsa.pub 127.0.0.1
鍵がrootユーザーのホームディレクトリに保存されている場合は、次のコマンドで鍵をコピーしてください:
# ssh-copy-id -i /root/.ssh/id_rsa.pub 127.0.0.1
この操作を確認し、パスワードを入力してください。
各マシンからキーをコピーして他のマシンに貼り付けるという操作を繰り返してください。たとえば、 docker-nakivo21 マシン実行:
# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.101.31
# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.101.32
公開鍵を承認します。
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
ローカルマシンでSSH経由でrootとしてログインできるかどうかを確認してください。
$ sudo ssh root@127.0.0.1
パスワードを入力せずに、リモートマシンとの接続を試みてください。
$ sudo ssh root@192.168.101.21
$ sudo ssh root@192.168.101.31
$ sudo ssh root@192.168.101.32
注記: root ユーザーとして接続するのは安全ではない可能性があります。必要がない場合は root ユーザーとして接続しないでください。一般ユーザーとして SSH 経由で接続し、 sudo コマンド。
Dockerのインストール
Docker は、Kubernetes でサポートされているエンタープライズ向けアプリケーション用コンテナプラットフォームの中で最も普及しているものです。すべてのマシンに Docker をインストールしてください。以下のコマンドを docker-nakivo21, docker-nakivo31, docker-nakivo32.
とはいえ、急ぐ必要はありません。まずは、以下の一般的なコマンドを使って Docker をインストールしてみてください:
$ sudo apt-get install -y docker.io
とはいえ、このケースでは、使用されている Docker のバージョンが最新ではない可能性があります。そこで、Docker の最新バージョンをインストールして、この問題を解決しましょう。
まず、必要なパッケージをインストールします。
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
Curl は、サポートされているプロトコル(HTTP、HTTPS、FTP、FTPS、SFTP、LDAP、LDAPS、IMAP、IMAPS、POP3、POP3S、SCP、SMB、SMTP、TELNET など)のいずれかを使用して、ユーザーの操作を必要とせずにホストとの間でデータを転送するために設計された、汎用的なコンパクトなツールです。
Ubuntu システムに、公式 Docker リポジトリの GPG 鍵を追加します:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
コンソールの出力は次の通りでなければなりません。 OK.
apt パッケージマネージャーに Docker の公式リポジトリを追加します:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
前のコマンドで手動での変更を行った後、パッケージマネージャーのデータベースを更新してください。
$ sudo apt-get update
公式リポジトリで利用可能な Docker パッケージのバージョンを確認してください。
$ apt-cache policy docker-ce
Docker をインストールします。
$ sudo apt-get install docker-ce
インストール後、Dockerのバージョンを確認できます。
$ docker --version
この場合、出力は次のようになります: Docker バージョン 18.09.6、ビルド 481bc77.
Docker を起動し、システムの起動時に Docker デーモンが自動的に読み込まれるように設定します。
$ sudo systemctl start docker
$ sudo systemctl enable docker
すべてのマシンにDockerをインストールしたら、すぐにUbuntuへのKubernetesのインストール手順に進むことができます。
UbuntuへのKubernetesのインストールとクラスタの初期化
これで、Kubernetes のコアコンポーネントをインストールする準備が整いました。
Kubernetes クラスタに含めるすべてのマシンで、root 権限で以下のコマンドを実行してください。
$ sudo -i
Ubuntu システムに、Docker の公式リポジトリの GPG キーを追加します:
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
apt パッケージマネージャーで使用可能なパッケージリポジトリのデータベースに、Kubernetes の公式リポジトリを追加します。
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
あるいは、次のコマンドでリポジトリを追加することもできます:
# echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
どこで Tシャツ 標準入力を読み取り、その入力データを標準出力および指定されたファイルに書き出すツールです。
Ubuntu システム上で利用可能なリポジトリのパッケージ一覧を更新します。
# apt-get update

インストール kubectl, kubeadm そして kubectl UbuntuにKubernetesをインストールするには、これが不可欠です。
# apt-get install -y kubelet kubeadm kubectl
keepalived をインストールします。
# apt-get install keepalived
# systemctl enable keepalived && systemctl start keepalived
その値が 1 UbuntuにインストールされたKubernetesが正常に動作するために。
# sysctl net.bridge.bridge-nf-call-iptables
この値を 1 次のコマンドを実行してください:
sysctl net.bridge.bridge-nf-call-iptables=1
kubeadm の設定ファイルを編集します。
# vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
既存の”Environment”文字列の後に、次の文字列を追加してください:
Environment=”cgroup-driver=systemd/cgroup-driver=cgroupfs”

Cgroupsとは、プロセッサ、メモリ、ディスクの入出力、ネットワークなどのリソース使用量を隔離するための制御グループのことです。
マスターノードでは(docker-nakivo21) Ubuntu上でKubernetesクラスタを初期化するコマンドを実行します。
# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.101.21
どこで
–pod-network-cidr Flannel ドライバーではこれが必須です。CIDR(Classless Inter-Domain Routing)は、後で設定するオーバーレイネットワーク(Flannel など)のアドレスを定義します。ネットワークマスクは、ノードごとに実行できるポッドの数も定義します。CIDR ネットワークアドレスと Flannel で使用されるネットワークアドレスは、同一でなければなりません。
–apiserver-advertise-address=192.168.101.21 Kubernetes が API サーバーとしてアドバタイズする IP アドレスを定義します。

テキストの最後に表示される出力と保存コマンドを確認してください。これは重要なポイントです。生成されたトークンは、Kubernetes クラスタにワーカーノードを追加するために必要です。
以下のコマンドを、実行権限を持つユーザーとして実行してください。 kubeadm init. この場合、コマンドはroot権限で実行されます。
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
これらのコマンドを実行しないと、Kubernetes から次のエラーが返されます:”サーバー localhost:8080 への接続が拒否されました – 正しいホストまたはポートを指定しましたか?”
Kubernetes はこの内容をコピーしません 設定 ユーザーディレクトリに自動的に保存されます。この操作は手動で行う必要があります。

クラスタに追加されたノードを確認する
# kubectl get nodes

次の内容を持つマスターノードが1つ確認できます。 NotReady Ubuntuにインストール中のKubernetesクラスタにおけるステータスです。これは、オーバーレイネットワークが設定されていないことが原因です。この問題を解決するには、Flannelを設定してください。 NotReady Kubernetes マスターノードの状態。Docker および Kubernetes の YAML ファイルを保存するディレクトリを作成します。例えば、 /home/kubernetes-user/kubernetes/
YAML(Yet Another Markup Language)を使用すると、Kubernetes でのポッドやデプロイメントの作成がより便利になります。Linux コンソールで各コマンドを手動で実行する代わりに、デプロイする必要のあるコンテナのすべてのパラメータを YAML 設定ファイルで定義することができます。YAML ファイルは、Kubernetes の文脈ではマニフェストファイルとも呼ばれます。
以下の内容を含む YAML 設定ファイルを作成してください:
コマンド”
“を実行してください # kubectl apply -f ./kube-flannel.yml
あるいは、GitHub上で、Kubernetes用のYAMLデプロイメント設定の既成の無料サンプルを見つけることもできます。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
Ubuntu上でデプロイしているKubernetesクラスタに追加されたノードを確認してください:
# kubectl get nodes
マスターノードのステータスは現在”Ready”となっています。

Flannelが正しく設定されていることを確認してください:
# kubectl get pods --all-namespaces

Flannel ポッドが実行されていることが確認できます。このポッドは、Flannel デーモンと、CNI 設定を Kubernetes が読み取れる場所にデプロイするために使用される initContainer の 2 つのコンテナで構成されています。
Ubuntu に Kubernetes をインストールする際、次のようなエラーが発生することがあります:
サーバーに接続できません:net/http: TLS ハンドシェイクのタイムアウト。
この問題を解決するにはどうすればよいでしょうか?数秒待ってから再試行してください。多くの場合、これで解決します。
ネームスペースは、Kubernetes クラスタ内の論理的なエンティティであり、クラスタリソースを表し、仮想クラスタと見なすことができます。1つの物理クラスタを論理的に複数の仮想クラスタに分割することができます。Kubernetes のデフォルトのネームスペースは デフォルト, Kube-public、および Kube-system. 名前空間の一覧は、
から取得できます。 # kubectl get namespaces
ご存じのとおり、Kubernetesにおける基本的なデプロイメント単位は”Pod”であり、これはネットワークおよびマウントネームスペースを共有するコンテナの集合体です。Podに含まれるすべてのコンテナは、同じKubernetesノード上にスケジューリングされます。利用可能なPodを確認するには、次のように実行します:
# kubectl -n kube-system get pods

クラスタをリセットまたは停止したい場合は、次のコマンドを実行してください:
# kubeadm reset
マスターノードではすべて正常です。つまり、UbuntuへのKubernetesのインストールを続行し、クラスタへのワーカーノードの追加に移ることができます。
ワーカーノード上で(docker-nakivo31, docker-nakivo32) 次のコマンドを実行してください:
# kubeadm join 192.168.101.21:6443 --token d8mbzb.uulxu01jbty8yh4z
--discovery-token-ca-cert-hash sha256:65ace7a4ff6fff795abf086f18d5f0d97da71d4639a0d0a6b93f42bea4948a79
クラスタの初期化後、トークンとハッシュが記録されました。 kubeadm init コマンドです。ご記憶の方もおられるかもしれませんが。
マスターノードで、クラスタの状態を再度確認してください。
# kubectl get nodes

これで、Ubuntuマシン上で実行されているKubernetesクラスタに、マスターノード1台とワーカーノード2台があることが確認できます。
Kubernetesの設定を確認するには、以下を実行してください:
# kubectl cluster-info

Kubernetes での Pod のデプロイ
これで、Kubernetes クラスターにコンテナを含むポッドをデプロイできるようになりました。ご存じのとおり、Kubernetes ではコンテナはポッドに含まれます。YAML ファイルを使用する場合は、管理しやすくするために、そのファイルを保存するディレクトリを作成してください。そのディレクトリに移動し、次のようなコマンドを実行します。 kubectl apply -f test.yaml
Flannel の設定時に、このようなディレクトリはすでに作成されています – /home/kubernetes-user/kubernetes/
新しいポッドをデプロイする時が来ました。まず、デプロイメントを作成する必要があります。デプロイメントとは、ポッドやレプリカセットに対して宣言型の更新を行うために使用されるコントローラーの概念です。デプロイメントは、1つのコマンドを実行するか、YAMLファイルを使用して作成できます。
例 1 – MySQL の導入
この例では、YAMLファイルを作成してみましょう。ファイル名は mysql-deployment.yaml
設定内容については、添付ファイルをご覧ください。
# vim mysql-deployment.yaml
リソースを管理するには、主に以下の2つの一般的なアプローチがあります。 kubectl. 以下の2つの違いは何ですか? kubectl create そして kubectl apply? を使用する際は kubectl create, Kubernetes に作成、置換、削除したい対象を指定します。このコマンドを実行すると、すべての変更内容が上書きされます。あるいは、 kubectl apply 段階的な変更を行い、このコマンドを使用すると、ライブオブジェクトに適用された変更を保存できます。
デプロイを作成します:
# kubectl apply -f ./mysql-deployment.yaml

Kubernetes では、デプロイメントに関する情報を表示できます。
# kubectl describe deployment mysql
ポッドを確認:
# kubectl get po
または
# kubectl get pods
または
# kubectl get pods -l app=mysql
ポッドのステータスが”保留中”となっている場合は、コンピューティングリソースが不足している可能性があります。Kubernetes でポッドの”保留中”ステータスを解消するには、CPU およびメモリ容量を追加してみてください。

必要に応じて、このサービスを削除することができます:
# kubectl delete service <service_name>
ポッドを削除することもできます:
# kubectl delete pod mysql-7b9b7999d8-nz5tm
例 2 – nginx のデプロイ
YAML ファイルを使わない別の方法で nginx をデプロイしてみましょう。
デプロイを作成します。
# kubectl create deployment nginx --image=nginx
デプロイが作成されたことを確認してください。
# kubectl get deployments
サービスを作成します。
# kubectl create service nodeport nginx --tcp=80:80
サービスは、ClusterIP、NodePort、LoadBalance、ExternalName の各サービスタイプを使用して作成できます。NodePort タイプを使用する場合、提供されるサービスへのアクセス用に 30000~32767 の範囲からランダムなポートが割り当てられます。このポートに送信されたトラフィックは、必要なサービスに転送されます。
サービスが作成され、定義されたポートでリスニングしていることを確認してください。
# kubectl get svc

ポート番号(この場合は 31453)を覚えておいてください。
サービスがデプロイされ、利用可能かどうかを確認します(この例では、マスターノードでコマンドを実行します)。前の手順で控えておいたノードのホスト名とポート番号を使用してください。
# curl docker-nakivo31:31453
また、どのノードのブラウザからでもサービスにアクセスできるかを確認することもできます。Webブラウザのアドレスバーで、以下のページにアクセスしてみてください:
http:// 10.101.235.90
または
http://docker-nakivo31:31453
http://docker-nakivo32:31453
問題がなければ、nginxのウェルカムページが表示されます。

また、Kubernetes ノードが接続されているネットワークにアクセスできる任意のマシンから、nginx のテストページにアクセスすることも可能です—(192.168.101.0/24) この場合。たとえば、ブラウザを使って以下のWebページにアクセスできます:
http://192.168.101.21:31453/
http://192.168.101.31:31453/
http://192.168.101.32:31453/
Kubernetes を監視するための Web インターフェースの設定
UbuntuへのKubernetesのインストールはほぼ完了しましたが、さらに使いやすくするためにKubernetesダッシュボードをインストールすることもできます。Kubernetesダッシュボードは、Kubernetesの管理や監視を行うためのWebインターフェースです。ダッシュボードをインストールするには、 kubernetes-dashboard.yaml ファイルは、以前コマンドを実行する前にやったのと同じように処理してください。
# kubectl create -f ./kubernetes-dashboard.yaml
# kubectl apply -f ./kubernetes-dashboard.yaml
ポッドを確認してください。
# kubectl get pods -o wide --all-namespaces
Kubernetes API サーバーへのプロキシを起動します。
# kubectl proxy

コンソールで次のコマンドを入力するには、別のコンソールウィンドウを開いてください。そうしないと、プロセスが終了してしまいます。
マスターノードのWebブラウザで、次のページにアクセスしてください:
http://localhost:8001
テストページが表示されます。

Webブラウザのアドレスバーに完全なアドレスを入力してください。
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

新しいコンソールウィンドウで以下のコマンドを実行し、サービスアカウントを使用してダッシュボードを作成します。
# kubectl create serviceaccount dashboard -n default
# kubectl create clusterrolebinding dashboard-admin -n default
--clusterrole=cluster-admin
--serviceaccount=default:dashboard
# kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 –decode
これで、生成されたトークンを確認できます:

生成されたトークンをコピーし、Webインターフェースのトークン欄に貼り付けて、ダッシュボードにログインしてください。

以下のスクリーンショットは、KubernetesダッシュボードのWebインターフェースです。ノード、デプロイメント、ポッドの状態を確認できるほか、ロール、ストレージクラス、その他のコンポーネントも確認できます。

監視ツール”Heapster”の設定
Heapster をインストールして、CPU やメモリ、その他の監視パラメータを追加し、Kubernetes ダッシュボードの監視機能を拡張します。次の名前を持つマニフェストファイルを作成します。 heapster.yaml.
# vim heapster.yaml
次の手順として、Heapster をデプロイします。
# kubectl create -f heapster.yaml
HeapsterのRBAC(ロールベースのアクセス制御)ロールを編集し、ノードの統計情報にアクセスするための権限を追加します。
# kubectl edit clusterrole system:heapster

コンソールで CPU およびメモリのメトリクスが測定できることを確認してください。
# kubectl top node

これで、KubernetesダッシュボードのWebインターフェースを開くと、CPU使用率やメモリ使用率のグラフなど、いくつかのセクションが追加されていることが確認できます。

これで、Kubernetes クラスターの設定が完了し、使用可能な状態になりました。
Ubuntu上で、複数のマスターを持つ高可用性Kubernetesクラスタを展開する
マスターノードが1つ、ワーカーノードが数台あるKubernetesクラスターは有効な選択肢ですが、ハードウェアの問題や停電などの理由で、唯一のマスターノードが障害を起こす場合があります。UbuntuノードにデプロイされたKubernetesクラスターの耐障害性を高めるには、複数のマスターノードを備えた高可用性(HA)Kubernetesクラスターのデプロイを検討することをお勧めします。このKubernetesクラスターのデプロイモデルを採用することで、単一障害点を回避できます。 マスターノードの数は奇数にすることを推奨します。また、耐障害性を確保できる最小のマスターノード数は3つです。3つ以上のマスターノードを使用する場合、その数が偶数であっても、クラスタ全体の耐障害性は向上しません。 Kubernetesクラスタのマスターノード数に応じた耐障害性の比較については、以下の表を参照してください。たとえば、マスターノードが5つあるクラスタの場合、3つのマスターノードが稼働し続けるため、2つのマスターノードが障害を起こしてもクラスタは存続できます(5つのうち3つは50%を超え、過半数を占めるため)。ここでいうクラスタサイズとは、クラスタ内のマスターノード数を指します。
| クラスタサイズ | 過半数 | フォールトトレランス |
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 3 | 2 | 1 |
| 4 | 3 | 1 |
| 5 | 3 | 2 |
| 6 | 4 | 2 |
| 7 | 4 | 3 |
| 8 | 5 | 3 |
| 9 | 5 | 4 |
本日のブログ記事のこのセクションでは、Kubernetesの高可用性(HA)クラスタ、HAプロキシ、およびいくつかのワーカーノードを展開する枠組みの中で、UbuntuノードにKubernetesをインストールする方法について解説します。以下の表には、この例で説明するテストラボにおいて、Ubuntuノード上にHA Kubernetesクラスタをインストールするために使用されるホストのIPアドレス、ホスト名、および役割が記載されています。
| № | ノードの役割 | IPアドレス | ホスト名 |
| 1 | マスター | 192.168.101.21 | docker-nakivo21 |
| 2 | マスター | 192.168.101.22 | docker-nakivo22 |
| 3 | マスター | 192.168.101.23 | docker-nakivo23 |
| 4 | HA Proxy | 192.168.101.19 | ha-proxy19 |
| 5 | 労働者 | 192.168.101.31 | docker-nakivo31 |
| 6 | 労働者 | 192.168.101.32 | docker-nakivo32 |
一部のコマンドは、1つのマスターノードモデルを使用してUbuntuにKubernetesをインストールする場合と同じです。このため、一部のコマンドに関する説明は繰り返しません。このページを上にスクロールして、コマンドの説明を確認してください。
以下の手順に従って、すべてのマシン(HAプロキシ、マスターノード、およびワーカーノード)をKubernetesのインストールに備えて準備します。
- 静的IPアドレスを設定します。
- ホスト名を設定します。すべてのホスト名は、IP アドレスに解決されている必要があります。
- SSH アクセスは、証明書を使用して有効化し、設定する必要があります。
- スワップは無効にしておく必要があります。
これらの手順は、各マシンで Docker のインストールを開始する前に実行する必要があります。これは、上記のセクションで、1 台のマスターノードを使用して Ubuntu に Kubernetes をインストールする方法について説明された内容と非常によく似ています。すべてのマシンの準備が完了したら、(192.168.101.19).
HA Proxy ロードバランサーの設定
HA Proxy ロードバランサーは、Kubernetes ノード間でインバウンドトラフィックを分散するために使用されます。このロードバランサーは、マスターノードの前にデプロイされます。のコンソールを開きます。 ha-proxy19 マシンを起動し、以下の手順に従ってください。
cfssl をインストールする
Cfssl(Cloud Flare SSL)は、TLS/SSL証明書チェーンを含むさまざまな証明書を生成するために使用されるツールキットです。
公式リポジトリからバイナリをダウンロードしてください。
# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
ダウンロードしたバイナリファイルに実行権限を設定します。
# chmod +x cfssl*
これらのバイナリファイルを次の場所に移動してください /usr/local/bin/
# mv cfssl_linux-amd64 /usr/local/bin/cfssl
# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
インストールされた cfssl のバージョンを確認して、インストールが正常に行われたかを確認してください。
# cfssl version
リポジトリツリーを更新します。
# apt-get update
HA Proxy をインストールします。
# apt-get install haproxy
の作成と編集 haproxy.cfg ファイル。
# vim /etc/haproxy/haproxy.cfg
この設定ファイルの最後に、以下の行を追加してください。
frontend kubernetes
bind 192.168.101.19:6443
option tcplog
mode tcp
default_backend kubernetes-master-nodes
backend kubernetes-master-nodes
mode tcp
balance roundrobin
option tcp-check
server docker-nakivo21 192.168.101.21:6443 check fall 3 rise 2
server docker-nakivo22 192.168.101.22:6443 check fall 3 rise 2
server docker-nakivo23 192.168.101.23:6443 check fall 3 rise 2

サービスを再起動してください。
# systemctl restart haproxy
TSL証明書を生成する
HAプロキシマシンのコンソールは引き続き使用できます。証明書発行機関(CA)の設定ファイルを作成してください。そのファイル名は ca-config.json.
# vim ca-config.json
この設定ファイルに、以下の内容を追加してください:
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
認証局署名要求の設定ファイルを作成します。
# vim ca-csr.json
以下のとおり、このファイルに内容を追加してください:
{
“CN”: “Kubernetes”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “GB”,
“L”: “London”,
“O”: “Kubernetes”,
“OU”: “CA”,
“ST”: “Nakivo”
}
]
}
ここで:
C – 国名(例:GB(イギリス))。
L – 都市や町などの所在地。
O – 組織。
OU – 組織単位(例:キーの所有者として定義されている部門など)。
ST – 州または県。
次に、公開鍵と秘密鍵を生成します。
# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
以下の点を確認してください。 ca-key.pem そして、その ca.pem 鍵が生成されました。
# ls -al
Etcdクラスタ用の証明書の作成
Etcd は、クライアント証明書による認証を利用して、サーバー間およびクラスタ内の通信をサポートしています。クラスタのメンバー 1 台につき、CA 証明書と署名済みの鍵ペアを用意する必要があります。
証明書署名要求の設定ファイルを作成します。
# vim kubernetes-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "GB",
"L": "London",
"O": "Kubernetes",
"OU": "Kubernetes",
"ST": "Nakivo"
}
]
}
その後、証明書と秘密鍵を生成します。
# cfssl gencert
-ca=ca.pem
-ca-key=ca-key.pem
-config=ca-config.json
-hostname=192.168.101.21,192.168.101.22,192.168.101.23,192.168.101.19,127.0.0.1,kubernetes.default
-profile=kubernetes kubernetes-csr.json |
cfssljson -bare kubernetes

ディレクトリ内のファイル一覧を表示して、 kubernetes-key.pem そして、その kubernetes.pem ファイルが生成されました。
# ls -al
作成した証明書を各ノードにコピーします。
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.21:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.22:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.23:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.31:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.32:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.33:~
どこで ~ は、のホームディレクトリです kubernetes-user Ubuntu ホスト上で。

Kubernetesのインストールに向けたUbuntuノードの準備
このセクションに記載されているコマンドを、すべてのマスターノードおよびワーカーノードで実行してください。Docker をインストールした後、Kubernetes クラスタに含まれる Ubuntu マシンに Kubernetes をインストールします。まずは、以下の準備から始めましょう。 192.168.101.21 マスターノード。
Docker をインストールします。
# apt-get install apt-transport-https ca-certificates curl software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
# apt-get update
# apt-get install docker-ce
Dockerのインストールが完了しました。kubeadm、kublet、kubectlは、UbuntuにKubernetesをインストールするために必要なKubernetesコンポーネントです。
Kubernetesコンポーネント(kubeadm、kublet、kubectl)をインストールします。
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# apt-get update
# apt-get install -y kubelet kubeadm kubectl
すべてのノードの準備が完了し、Docker、kubelet、kubeadm、kubectl のインストールが終わったら、マスターノードに etcd をインストールして設定する必要があります。
Ubuntu マスターノードへの etcd のインストールと設定
etcd は、一貫性と高可用性を備えたストアであり、キーの保存やクラスタデータのバックアップを目的としています。複数のマスターノードを持つ HA Kubernetes クラスタを構成する前に、etcd クラスタを設定しておく必要があります。まずは、 192.168.101.21 マスターノード。
Installing and configuring etcd on the 192.168.101.21 machine.
etcd用の設定ディレクトリを作成します。
# mkdir /etc/etcd /var/lib/etcd
証明書がコピーされたディレクトリに移動します。これはkubernetesユーザーのホームディレクトリであり、この場合は – /home/kubernetes-user/
証明書をetcdの設定ディレクトリにコピーします。
# cp ca.pem kubernetes.pem kubernetes-key.pem /etc/etcd
ファイルがコピーされたことを確認してください。
# ls -al /etc/etcd
前のディレクトリに戻る
# cd -
リポジトリから etcd のバイナリをダウンロードしてください。
# wget https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz
etcd アーカイブを解凍します。
# tar xvzf etcd-v3.3.9-linux-amd64.tar.gz
それでは、etcd のバイナリファイルを /usr/local/bin/
# mv etcd-v3.3.9-linux-amd64/etcd* /usr/local/bin/
etcd の systemd ユニットファイルを作成します。
# vim /etc/systemd/system/etcd.service
このファイルに、以下に示す文字列を追加してください。
[Unit]
Description=etcd
Documentation=https://github.com/coreos
[Service]
ExecStart=/usr/local/bin/etcd
--name 192.168.101.21
--cert-file=/etc/etcd/kubernetes.pem
--key-file=/etc/etcd/kubernetes-key.pem
--peer-cert-file=/etc/etcd/kubernetes.pem
--peer-key-file=/etc/etcd/kubernetes-key.pem
--trusted-ca-file=/etc/etcd/ca.pem
--peer-trusted-ca-file=/etc/etcd/ca.pem
--peer-client-cert-auth
--client-cert-auth
--initial-advertise-peer-urls https://192.168.101.21:2380
--listen-peer-urls https://192.168.101.21:2380
--listen-client-urls https://192.168.101.21:2379,http://127.0.0.1:2379
--advertise-client-urls https://192.168.101.21:2379
--initial-cluster-token etcd-cluster-0
--initial-cluster 192.168.101.21=https://192.168.101.21:2380,192.168.101.22=https://192.168.101.22:2380,192.168.101.23=https://192.168.101.23:2380
--initial-cluster-state new
--data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
ファイルシステムから変更された設定を読み込み、依存関係ツリーを再生成するために、systemdマネージャーの設定を再読み込みします。
# systemctl daemon-reload
起動時にetcdを起動するように設定します。
# systemctl enable etcd
etcd を起動します。
# systemctl start etcd
2番目のマスターノードでも同じ操作を行ってください(docker-nakivo22 – 192.168.101.21 そして docker-nakivo23 – 192.168.101.22). これらのマスターノードに必要な操作で唯一異なる点は、 etcd.service 設定ファイル。他の各マスターノードに対して正しいIPアドレスを指定してください。たとえば、 etcd.service 2番目のマスターノードの設定ファイルは、以下のようになければなりません(192.168.101.22) 現在のKubernetesテストラボの。
[Unit]
Description=etcd
Documentation=https://github.com/coreos
[Service]
ExecStart=/usr/local/bin/etcd
--name 192.168.101.22
--cert-file=/etc/etcd/kubernetes.pem
--key-file=/etc/etcd/kubernetes-key.pem
--peer-cert-file=/etc/etcd/kubernetes.pem
--peer-key-file=/etc/etcd/kubernetes-key.pem
--trusted-ca-file=/etc/etcd/ca.pem
--peer-trusted-ca-file=/etc/etcd/ca.pem
--peer-client-cert-auth
--client-cert-auth
--initial-advertise-peer-urls https://192.168.101.22:2380
--listen-peer-urls https://192.168.101.22:2380
--listen-client-urls https://192.168.101.22:2379,http://127.0.0.1:2379
--advertise-client-urls https://192.168.101.22:2379
--initial-cluster-token etcd-cluster-0
--initial-cluster 192.168.101.21=https://192.168.101.21:2380,192.168.101.22=https://192.168.101.22:2380,192.168.101.23=https://192.168.101.23:2380
--initial-cluster-state new
--data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Kubernetes HA クラスタにおけるマスターノードの初期化
これで、UbuntuマシンにインストールされたKubernetes HAクラスタのマスターノードを初期化できるようになりました。
192.168.101.21 のマスターノードを初期化しています
最初のマスターノードで、以下に説明する一連の操作を実行してください。
kubeadm用のYAML設定ファイルを作成します。
# vim config.yaml
このファイルに設定パラメータを追加してください:
apiVersion: kubeadm.k8s.io/v1alpha3
kind: ClusterConfiguration
kubernetesVersion: stable
apiServerCertSANs:
- 192.168.101.19
controlPlaneEndpoint: "192.168.101.19:6443"
etcd:
external:
endpoints:
- https://192.168.101.21:2379
- https://192.168.101.22:2379
- https://192.168.101.23:2379
caFile: /etc/etcd/ca.pem
certFile: /etc/etcd/kubernetes.pem
keyFile: /etc/etcd/kubernetes-key.pem
networking:
podSubnet: 10.244.0.0/16
apiServerExtraArgs:
apiserver-count: "3"
podSubnet(10.244.0.0/16)として定義されたネットワークは、 kube-flannel.yml ファイル。
Ubuntuマシンをマスターノードとして初期化します。
# kubeadm init --config=config.yaml
設定ファイルの古いバージョンに関する警告が表示されることがあります:
設定ファイルでは、非推奨となったAPI仕様が使用されています: “kubeadm.k8s.io/v1alpha3″。’kubeadm config migrate –old-config old.yaml –new-config new.yaml’ を実行してください。これにより、新しいAPIバージョンを使用した、同様の仕様の新しい設定ファイルが作成されます。
以下のコマンドで設定ファイルのバージョンを更新してください:
# kubeadm config migrate --old-config config.yaml --new-config config1.yaml

etcd が実行されていない状態で、マルチマスター Kubernetes クラスタのノードを初期化しようとすると、別のエラーが発生する可能性があります:
[ERROR ExternalEtcdVersion]: https://192.168.101.21:2379/version を取得: tcp 192.168.101.21:2379 に接続: 接続が拒否されました

お使いの etcd が実行中です。次のコマンドを実行できます。 etcd 手動で:
# systemctl start etcd
Ubuntu上で動作するKubernetesクラスタのマスターノードの初期化が正常に完了すると、スクリーンショットに示されているような以下のメッセージが表示されます。

このコマンドが正常に実行されると、クラスタの使用を開始する方法に関するヒントに加え、ノードをクラスタに参加させるために必要なトークンと証明書のハッシュを含むコマンドが表示されます。これらの重要な文字列は、すぐに必要となるため、必ず保存しておいてください。スクリーンショットでは黄色で強調表示されており、以下にも転載しています。
証明書発行機関をコピーすることで、任意の数のコントロールプレーンノードを結合できるようになりました
各ノードでサービスアカウントのキーを設定した後、root 権限で以下のコマンドを実行します:
kubeadm join 192.168.101.19:6443 --token sxm34y.p4rn4328vne0iihf
--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca
--experimental-control-plane
その後、各ワーカーノードでroot権限で以下のコマンドを実行することで、任意の数のワーカーノードを参加させることができます:
kubeadm join 192.168.101.19:6443 --token sxm34y.p4rn4328vne0iihf
--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca
以下のコマンドを実行して、クラスタ内で初期化済みのノードの使用を開始してください。
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
クラスタに追加されたノードを確認します。
# kubectl get nodes

証明書を他の2つのマスターノードにコピーします
# scp -r /etc/kubernetes/pki kubernetes-user@192.168.101.22:~
# scp -r /etc/kubernetes/pki kubernetes-user@192.168.101.23:~
192.168.101.22 のマスターノードを初期化中
2番目のマスターノード(192.168.101.22)で以下のコマンドを実行してください。
以下の apiserver.crt そして apiserver.key ホームディレクトリにあるもの(~) の kubernetes-user.
$ rm ~/pki/apiserver.*
ホームディレクトリに保存されている証明書を、 /etc/kubernetes/ ディレクトリ。
$ sudo mv ~/pki /etc/kubernetes/
kubeadm用の設定YAMLファイルを作成します。
# vim config.yaml
このYAMLファイルの内容は、最初のマスターノードの場合と同じです(192.168.101.21). 上記の最初のマスターノードの初期化設定を参照してください。UbuntuマシンにインストールされたKubernetes HAクラスタの最初のマスターノードで使用されている、すでに作成済みのファイルをコピーすることができます。
2番目のマスターノードを初期化します。
# kubeadm config migrate --old-config config.yaml --new-config config1.yaml
# kubeadm init --config=config1.yaml
出力は、Kubernetes HA クラスタで最初のマスターノードの初期化後に表示された出力と同じです:

同様に、クラスタ内で初期化済みのノードの使用を開始するためのコマンドを実行します。
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
クラスタに追加されたノードを確認します。
# kubectl get nodes

3つのマスターノードのうち2つがクラスターに追加されました。あと1つのマスターノードを追加する必要があります。
3番目のマスターノード(192.168.101.23)の初期化
クラスタ内の 2 番目のノード(192.168.101.22)を初期化したときと同じ手順を繰り返します。
マスターノードの初期化後に表示される、クラスタへのノード追加用のトークンとハッシュを含むコマンドを必ずメモしておいてください。
3 つのマスターノードすべてがクラスタに正常に追加されたことを確認してください。
# kubectl get nodes
Kubernetesのマスターノードの”NotReady”ステータスを修正するためのFlannelのインストール
それでは、Flannel をインストールしましょう。Ubuntu に Kubernetes をインストールして単一のマスタークラスタを作成する方法を学んだ最初の例とは異なり、この例では YAML ファイルを使用して Flannel をインストールします。
このコマンドを実行して Flannel をインストールし、 NotReady オーバーレイネットワークがまだ設定されていないため、ノードの状態が表示されません。以下の kube-flannel.yaml たとえば、最初のマスターノード上で、テキストエディタ”vim”を使ってファイルを開きます。
# kubectl apply -f kube-flannel.yml
で定義されている podSubnet のアドレスを覚えておいてください。 config.yaml ファイル。ネットワークアドレスは、 kube-flannel.yaml ファイル。
ノードとそのステータスを確認してください。
# kubectl get nodes

これで、すべてのマスターノードが正常に動作するようになりました。
クラスタへのワーカーノードの追加
すべてのマスターノードの初期化が完了したら、Kubernetesクラスタにワーカーノードを追加できます。最初のワーカーノードを追加してみましょう(192.168.101.31) を、Ubuntu マシン上にデプロイされた HA Kubernetes クラスターに追加します。マスターノードの初期化後に表示されたコマンド(トークンとハッシュが含まれるコマンド)を使用して、ワーカーノードをクラスターに参加させます。このコマンドを 192.168.101.31 machine.
# kubeadm join 192.168.101.19:6443 --token kxl1gf.6ddalutd60n0ez45
--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca
Kubernetes HA クラスタのノードを確認し、ワーカーノードが追加されていることを確認してください。また、ノードの一覧に HA プロキシマシンが表示されるようになっています。
# kubectl get nodes

同様に、UbuntuマシンにインストールされたKubernetes高可用性クラスターに、他のワーカーノードを追加します。必要に応じて、いつでもワーカーノードを追加することができます。これで、本日のチュートリアルは終了です。
結論
UbuntuへのKubernetesのインストールは、一見したほど難しくありません。Kubernetesクラスタのデプロイには多少の手間がかかりますが、その結果、一元化された管理の容易さ、高いスケーラビリティ、負荷分散など、多くのメリットが得られます。 最もシンプルな Kubernetes のデプロイ方法は、シングルマスター構成です。マスターノードとワーカーノードを含む Ubuntu ノードに Kubernetes をインストールする必要があります。
コンテナ化されたアプリケーションを実行するために、より信頼性の高いインフラストラクチャが必要な場合は、Kubernetes 高可用性クラスタとして知られるマルチマスター Kubernetes のデプロイを検討してください。このタイプの Kubernetes デプロイでは、単一障害点が排除され、一部のマスターノードが障害を起こしてもクラスタは稼働し続けることができます。
どちらのデプロイタイプにおいても、SSHアクセスの設定、静的IPアドレスとホスト名の設定、Dockerのインストール、スワップパーティションの使用無効化を行い、最後にkubeadm、kubectl、kubeletなどのKubernetesコンポーネントをインストールし、オーバーレイネットワーク用にFlannelを設定する必要があります。HA Kubernetesクラスタをデプロイする場合は、さらにスタンドアロンマシン上でHAプロキシを設定し、証明書を生成し、etcdクラスタを設定する必要があります。 Kubernetes の設定、デプロイの作成、およびポッドの実行といった段階の大部分は、コマンドラインインターフェースで提供されるコマンドを手動で実行する方法と、YAML 設定ファイルを使用する方法の 2 つの方法で実行できます。YAML ファイルを使用すると、より複雑な構造を作成でき、管理プロセスがより便利になります。
Kubernetesは、物理マシンおよび仮想マシンのいずれ上で動作するUbuntuにインストールできます。vSphere上で動作する仮想マシンにKubernetesがインストールされている場合は、以下を使用することで追加の保護を行うことができます。 VMware 高可用性クラスタ フォールトトレランス機能を活用して。このブログ記事で解説したKubernetesデプロイメントの仕組みは、他のLinuxディストリビューションにKubernetesをインストールする際にも活用できます。