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台を使用したクラスター構成です。この例で使用されるマシンのノード数、ノードの役割、ホスト名、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 ホスト上で動作する仮想マシン(VM)を利用できます。また、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の設定: CPU 2コア、RAM 4GB、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 (ユーザー名) コマンドまたは (superuser) コマンドを使用すると、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を正常にインストールするには、swappinessを無効にする必要があります。
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アドレスとホスト名に合わせて、前述の手順をすべて実行してください。
仮想マシンでの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 を起動し、システムの起動時にデーモンが自動的に読み込まれるように設定します。
$ 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 <
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つのマスターノードがあり、そこには 準備完了ではありません Ubuntuにインストール中のKubernetesクラスタにおけるステータスです。これは、オーバーレイネットワークが設定されていないことが原因です。この問題を解決するには、Flannelを設定してください。 準備完了ではありません Kubernetes マスターノードの状態。Docker および Kubernetes の YAML ファイルを保存するディレクトリを作成します。例: /home/kubernetes-user/kubernetes/
YAML(Yet Another Markup Language)を使用すると、KubernetesでのPodやDeploymentの作成がより便利になります。Linuxコンソールで各コマンドを手動で実行する代わりに、デプロイするコンテナのすべてのパラメータをYAML設定ファイルで定義できます。Kubernetesの文脈では、YAMLファイルはマニフェストファイルとも呼ばれます。
以下の内容で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 をインストールする際、次のようなエラーが発生することがあります:
Unable to connect to the server: net/http: TLS handshake timeout.
この問題を解決するにはどうすればよいですか?数秒待ってから再試行してください。これで解決することがよくあります。
ネームスペースは、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クラスタにコンテナを含むPodをデプロイできるようになりました。ご存じのとおり、KubernetesではコンテナはPodに含まれます。YAMLファイルを使用する場合は、管理しやすくするために、そのファイルを保存するディレクトリを作成してください。そのディレクトリに移動し、次のようなコマンドを実行します。 kubectl apply -f test.yaml
Flannel の設定時に、そのようなディレクトリはすでに作成されています – /home/kubernetes-user/kubernetes/
新しいPodをデプロイする時が来ました。まず、デプロイメントを作成する必要があります。デプロイメントとは、Podやレプリカセットに対して宣言的な更新を行うために使用されるコントローラーの概念です。デプロイメントは、単一のコマンドまたはYAMLファイルを使用して作成できます。
例 1 – MySQL の導入
この例では、YAMLファイルを作成してみましょう。ファイル名は mysql-deployment.yaml
設定内容については、添付ファイルをご覧ください。
# vim mysql-deployment.yaml
リソースを管理するには、主に2つの一般的なアプローチがあります。 kubectl. 以下の違いは何ですか 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
ポッドを削除することもできます:
# 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
テストページが表示されます。

ウェブブラウザのアドレスバーに完全なアドレスを入力してください。
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をインストールする場合と同じです。そのため、一部のコマンドに関する説明は繰り返しません。このページの先頭までスクロールして、コマンドの説明を確認してください。
以下の手順に従い、Kubernetesをインストールするためのすべてのマシン(HAプロキシ、マスターノード、ワーカーノード)の準備を行います。
- 静的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-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ノードの準備
このセクションに記載されているコマンドを、すべてのマスターノードとワーカーノードで実行してください。Kubernetes クラスタに含まれる Ubuntu マシンに、まず Docker をインストールし、次に 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コンポーネント(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をインストールし、 準備完了ではありません オーバーレイネットワークがまだ設定されていないため、ノードの状態が表示されません。 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 マシン。
# 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の構成、デプロイの作成、およびPodの実行といった段階の大部分は、コマンドラインインターフェースで提供されるコマンドを手動で実行する方法と、YAML構成ファイルを使用する方法の2つの方法で実行できます。YAMLファイルを使用することで、より複雑な構造を作成でき、管理プロセスがより便利になります。
Kubernetesは、物理マシンおよび仮想マシン上で動作するUbuntuにインストールできます。vSphere上で動作する仮想マシンにKubernetesをインストールしている場合、以下の方法を使用して追加の保護を行うことができます。 VMware 高可用性クラスタ フォールトトレランス機能を活用して。本記事で解説したKubernetesデプロイメントの仕組みは、他のLinuxディストリビューションにKubernetesをインストールする際にも活用できます。