Kubernetesは、以前の記事「アマゾンウェブサービス(AWS)でのKubernetes入門」で紹介されました。 Kubernetesについては、別の記事「IBM BluemixでのKubernetes(K8s)の使用」でも説明されています。 Kubernetesは、開発目的でFedora、CentOS、Ubuntu、CoreOSを含むほぼすべてのOSのベアメタルにインストールできます。
問題
ベアメタルへのKubernetesのインストールには、マスターノード、ワーカーノード、ポッドネットワークなどを設定するためのいくつかのコマンドの実行が含まれます。
ソリューション
Kubernetes 1.4には、 kubeadmという新しいツールが導入されています Kubernetesクラスターをブートストラップするため。 kubeadm 2つのコマンドでKubernetesクラスターをブートストラップします。 Docker、kubectl、およびkubeletをインストールした後、マスターノードは kubeadm initで起動できます。 kubeadm joinで追加されたワーカーノード 。
この記事では、次の手順を使用してKubernetesクラスターをインストールしてブートストラップし、続いてクラスターをテストします。
- AmazonEC2で3つの新しいUbuntuインスタンスを開始します。
- すべてのUbuntuインスタンスに、Docker、kubeadm、kubectl、およびkubeletをインストールします。
- Ubuntuインスタンスの1つから、次のコマンドを使用してKubernetesクラスターマスターを初期化します:
kubeadm init
- CalicoPodネットワークポリシーを適用するkubeadm/ calico.yaml 。
- 他の2つのUbuntuインスタンス(ノード)をマスターと結合し、 kubeadm join --token =
- マスターでは、3つのノードが「kubectlgetnodes」でリストされます。
- マスターでアプリケーションを実行します:
kubectl -s http://localhost:8080 run nginx --image=nginx --replicas=3 --port=80
- ポッドを一覧表示します:
kubectl get pods -o wide
- Kubernetesクラスタをアンインストールします。
kubeadm reset
この記事には次のセクションがあります:
- 環境の設定
- 各ホストへのDocker、kubeadm、kubectl、およびkubeletのインストール
- マスターの初期化
- CalicoPodNetworkのインストール
- ノードをクラスターに参加させる
- サンプルアプリケーションのインストール
- クラスターのアンインストール
- 制限
- kubeadmのさらなる開発
- 結論
環境の設定
kubeadm ツールには、Ubuntu 16.04以降、HypriotOS v1.0.1以降、またはCentOS7のいずれかを実行している次のマシンが必要です。
- マスターノード用に1台のマシン
- ワーカーノード用の1つ以上のマシン
各マシンには少なくとも1GBのRAMが必要です。 Amazon EC2で実行されている3台のUbuntuマシンを使用して、単一のマスターノードと2つのワーカーノードを持つクラスターをブートストラップしました。 3台のUbuntuマシンを図1に示します。
図1: Ubuntuマシン
各ホストへのDocker、kubeadm、kubectl、およびkubeletのインストール
このセクションでは、3台のマシンのそれぞれにDocker、kubelet、kubectl、およびkubeadmをインストールします。インストールされているコンポーネントについては、表1で説明しています。
コンポーネント | 説明 |
ドッカー | コンテナランタイム。バージョン1.11.2が推奨され、v1.10.3およびv1.12.1でも問題ありません。クラスタ内のすべてのマシンで必要です。 |
kubelet | クラスター内のすべてのマシンで実行されるKubernetesのコアコンポーネント。コンテナとポッドを起動します。クラスタ内のすべてのマシンで必要です。 |
kubectl | クラスターを管理するためのコマンドラインツール。マスターノードでのみ必要ですが、すべてのノードにインストールすると便利です。 |
kubeadm | クラスターをブートストラップするためのツール。クラスタ内のすべてのマシンで必要です。 |
表1: インストールするコンポーネント
3台のマシンのそれぞれでパブリックIPアドレスを取得し、SSHで各マシンにログインします。
ssh -i "docker.pem" [email protected] ssh -i "docker.pem" [email protected] ssh -i "docker.pem" [email protected]
バイナリをインストールするコマンドは、 rootとして実行する必要があります;したがって、ユーザーをrootに設定します。
sudo su -
各マシンで次のコマンドを実行します。
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF > /etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF
最初のコマンドは、図2の出力に示すように、Kubernetesに必要なパッケージをダウンロードします。
図2: Kubernetesのパッケージをダウンロードする
2コマンドは、リポジトリからパッケージリストをダウンロードし、最新バージョンのパッケージで更新します。
apt-get update
出力を図3に示します。
図3: リポジトリパッケージの更新
次に、Dockerをインストールします:
# Install docker if you don't have it already. apt-get install -y docker.io
図4のコマンド出力に示すように、Dockerがインストールされます。
図4: Dockerのインストール
続いて、kubelet(Kubernetesのコアコンポーネント)、kubeadm(ブートストラップツール)、kubectl(クラスター管理ツール)、およびkubernetes-cni(ネットワークプラグイン)をインストールします。
apt-get install -y kubelet kubeadm kubectl kubernetes-cni
上記のコマンドの出力を図5に示します。
図5: kubelet、kubeadm、kubectln、kubernetes-cniのインストール
マスターの初期化
次に、etcdデータベースとAPIサーバーが実行されているマスターを初期化します。 kubeletは、これらのコンポーネントを実行するためにポッドを起動します。 IPアドレスを自動検出する次のコマンドを実行します。
kubeadm init
コマンド出力に示されているように、最初に、システム状態を検証するためにいくつかの飛行前チェックが実行されます。続いて、クラスターに参加するワーカーノードの相互認証キーとして使用されるマスター/トークントークンが生成されます。次に、自己署名認証局のキーと証明書が生成され、クライアントとの通信のためにクラスター内の各ノードにIDが提供されます。 APIサーバーのキーと証明書は、クライアントと通信するためのAPIサーバー用に作成されます。 util / kubeconfig kubeletがAPIサーバーと別のutil/ kubeconfigに接続するためのファイルが作成されます 管理用のファイルが作成されます。続いて、APIクライアント構成が作成されます。 kubeadm initからの出力 コマンドを図6に示します。
図6: kubeadminitの実行
すべてのコントロールプレーンコンポーネントの準備が整います。最初のノードの準備が整い、テスト展開が行われます。図7のコマンド出力に示すように、必須のアドオンコンポーネントであるkube-discovery、kube-proxy、およびkube-dnsも作成されます。Kubernetesマスターは正常に初期化されます。次の構文のコマンドが生成されます。クラスタに参加するマシン(ノード)で実行する必要があります。
kubeadm join -token=<token> <IP Address of the master node>
上記のコマンドは、後でワーカーノードで使用できるようにコピーして保持する必要があります。
図7: Kubernetesマスターが初期化されました
デフォルトでは、マスターノードはスケジュールできず、「専用」の汚染を使用してスケジュールできます。次のコマンドを使用して、マスターノードをスケジュール可能にすることができます。
kubectl taint nodes --all dedicated-
kubeadm コマンドは、使用する必要はなかったが、デフォルトのコマンドをオーバーライドするために使用できる他のいくつかのオプション(表2を参照)をサポートしています。
コマンドパラメータ | 説明 | デフォルト |
-skip-preflight-checks | 飛行前のチェックをスキップします | プリフライトチェックが実行されます |
-use-kubernetes-version | 使用するKubernetesバージョンを設定します | v1.5.1 |
-api-advertise-addresses | kubeadm initコマンドは、デフォルトのネットワークインターフェースのIPアドレスを自動検出して使用し、それを使用してAPIサーバーの証明書を生成します。この構成パラメーターを使用して、APIサーバーが検証される1つ以上のIPアドレスでデフォルトをオーバーライドできます。 | 自動検出 |
-api-external-dns-names | この構成パラメーターを使用して、APIサーバーが検証される1つ以上のホスト名でデフォルトのネットワークインターフェースをオーバーライドできます。 IPアドレスまたは外部DNS名のいずれか1つのみを使用する必要があります。 | |
-cloud-provider | クラウドプロバイダーを指定します。 クラウドマネージャーは、「aws」、「azure」、「cloudstack」、「gce」、「mesos」、「openstack」、「ovirt」、「rackspace」、「vsphere」をサポートしています。クラウドプロバイダーの設定は、/ etc / kubernetes/cloud-configファイルで提供できます。クラウドプロバイダーを使用すると、永続ボリュームと負荷分散を使用できるという利点もあります。 | クラウドプロバイダーの自動検出なし |
-pod-network-cidr | 各ノードにネットワーク範囲(CIDR)を割り当て、フランネルやクラウドプロバイダーなどの特定のネットワークソリューションに役立ちます。 | |
-service-cidr | KubernetesがIPアドレスをポッドに割り当てるために使用するサブネットをオーバーライドします。 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf また、変更する必要があります。 | 10.96.0.0/12 |
-service-dns-domain | DNS名でサービスを割り当てるためのDNS名サフィックスを上書きします。形式は | cluster.local |
-トークン | マスターとクラスターに参加しているノード間の相互認証に使用されるトークンを指定します。 | 自動生成 |
表2: Kubeadmコマンドオプション
CalicoPodNetworkのインストール
ポッドが相互に通信できるようにするには、ポッドネットワークアドオンをインストールする必要があります。 Calicoは、kubeadmがホストするインストール構成を ConfigMapの形式で提供します。 http://docs.projectcalico.org/master/getting-started/kubernetes/installation/hosted/kubeadm/calico.yamlで、ポッドネットワークをインストールするためにこのセクションで使用します。マスターノードで次のコマンドを実行して、ポッドネットワークをインストールします。
kubectl apply -f http://docs.projectcalico.org/master/getting-started/ kubernetes/installation/hosted/kubeadm/calico.yaml
または、 calico.yamlをダウンロードします マスターノードにコピーします:
scp -i "docker.pem" calico.yaml [email protected]:~
続いて、次のコマンドを実行します。
kubectl apply -f calico.yaml
図8に示すように、Calicoとシングルノードetcdクラスターがインストールされます。
図8: Calicoポリシーのインストール
続いて、すべてのKubernetesネームスペースのすべてのポッドを一覧表示します。
kubectl get pods --all-namespaces
kube-dns 図9に示すように、ポッドが実行されている必要があります。
図9: すべての名前空間のポッドを一覧表示する
ノードをクラスターに参加させる
このセクションでは、 kubeadm join を使用して、ワーカーノードをクラスターに参加させます。 次の構文を持つコマンド:
kubeadm join --token=<token> <master-ip>
オプションで、kubeadm参加 コマンドは、-skip-preflight-checksを使用して実行できます。 予備検証をスキップするオプション。
kubeadm参加 コマンドは、提供されたトークンを使用してAPIサーバーと通信し、ルートCA証明書を取得し、ローカルキーペアを作成します。続いて、署名のために証明書署名要求(CSR)がAPIサーバーに送信され、ローカルkubeletがAPIサーバーに接続するように構成されます。
kubeadm joinを実行します kubeadm initの出力からコピーされたコマンド クラスターに参加する各Ubuntuマシンでコマンドを実行します。
まず、SSHがUbuntuインスタンスにログインします:
ssh -i "docker.pem" [email protected]
および
ssh -i "docker.pem" [email protected]
続いて、 kubeadm joinを実行します 指図。最初に、いくつかの飛行前チェックが実行されます。提供されたトークンが検証されます。次に、ノード検出が使用されます。クラスター情報検出クライアントが作成され、APIサーバーから情報が要求されます。クラスタ情報オブジェクトが受信され、指定されたトークンを使用して署名が検証されます。クラスター情報の署名と内容が有効であることが判明し、ノードの検出が完了しました。続いて、ノードのブートストラップが実行され、APIエンドポイントhttps://10.0.0.129:6443を使用して接続が確立されます。続いて、APIクライアントを使用して証明書署名要求(csr)が作成され、ノードの一意の証明書が取得されます。署名された証明書がAPIサーバーから受信されると、kubelet構成ファイルが生成されます。図10にリストされている「ノードの参加が完了しました」というメッセージは、ノードがクラスターに参加したことを示しています。
図10: ノードをクラスターに参加させる
同様に、他のUbuntuマシンでも同じコマンドを実行します。図11の出力に示されているように、他のノードもクラスターに参加します。
図11: 2番目のノードをクラスターに参加させる
マスターノードで、次のコマンドを実行してノードを一覧表示します。
kubectl get nodes
図12に示すように、マスターノードと2つのワーカーノードが一覧表示されます。
図12: Kubernetesクラスタノードの一覧表示
サンプルアプリケーションのインストール
次に、クラスターをテストします。次のコマンドを実行して、 nginxを実行します 3つのレプリカで構成されるベースのポッドクラスター:
kubectl -s http://localhost:8080 run nginx --image=nginx --replicas=3 --port=80
展開を一覧表示します:
kubectl get deployments
クラスタ全体のポッドを一覧表示します:
kubectl get pods -o wide
タイプLoadBalancerのサービスとしてデプロイを公開します :
kubectl expose deployment nginx --port=80 --type=LoadBalancer
サービスを一覧表示します:
kubectl get services
上記のコマンドからの出力は、 nginxを示しています デプロイメントが作成され、3つのポッドがクラスター内の2つのワーカーノードにまたがって実行されます。図13に示すように、「nginx」と呼ばれるサービスも作成されます。
図13: nginxポッドクラスターの実行
サービスのクラスターIPをコピーします。 curlコマンドを実行して、サービスを呼び出します。
curl 10.0.0.99
図14に示すように、サービスからのHTMLマークアップが出力されます。
図14: nginxサービスの呼び出し
クラスターのアンインストール
kubeadmによってインストールされたクラスターをアンインストールするには、次のコマンドを実行します。
kubeadm reset
図15に示すように、クラスターはアンインストールされます。
図15: Kubernetesクラスターのアンインストール/リセット
制限
kubeadmにはいくつかの制限があり、開発での使用にのみお勧めします。 kubeadmの制限は次のとおりです。
- サポートされているOSは、Ubuntu 16.04以降、CentOS 7、HypriotOSv1.0.1以降のみです。
- 本番環境での使用には適していません。
- クラウドプロバイダーの統合は実験的なものです。
- 単一のetcdデータベースを持つ単一のマスターのみを持つクラスターが作成されます。高可用性はサポートされていません。これは、マスターが単一障害点(SPOF)であることを意味します。
- HostPortおよびHostIP機能はサポートされていません。
- kubeadmをRHEL/CentOS7およびVirtualBoxで使用する場合のその他の既知の問題。
kubeadmのさらなる開発
kubeadmはKubernetesv1.5ではアルファ版であり、Kubernetes1.6以降はベータ版です。 Kubernetesの新しいバージョンごとにkubeadmに対して行われたマイナーな修正と改善:
- Kubernetes 1.7では、kubeadmでインストールされたクラスタ内部リソースへの変更は、v1.6からv1.7にアップグレードするときに上書きされます。
- Kubernetes 1.8では、 kubeadm initで作成されたデフォルトのブートストラップトークン 無効になり、貴重なクレデンシャルの公開を制限するために作成されてから24時間後に削除されます。 kubeadm参加 コマンドは、プロセスを再実装する代わりに、TLSブートストラップをkubeletiteslfに委任します。ブートストラップKubeConfig ファイルは/etc / kubernetes / bootstrap-kubelet-confに書き込まれます kubeadm参加 。
結論
この記事では、Kubernetesv1.4以降で利用可能なkubeadmツール機能を使用してKubernetesクラスターをブートストラップしました。最初に、Docker、kubectl、kubelet、およびkubeadmに必要なバイナリがインストールされます。続いて、 kubeadm init コマンドは、クラスター内のマスターノードを初期化するために使用されます。最後に、kubeadm参加 コマンドは、ワーカーノードをクラスターに参加させるために使用されます。サンプルnginx アプリケーションを実行してクラスターをテストします。