GNU/Linux >> Linux の 問題 >  >> Linux

kubeadmを使用して単一のコントロールプレーンKubernetesクラスターを作成する

はじめに

Kubernetesはクラスターです およびオーケストレーション Dockerコンテナ用のエンジン。つまり、Kubernetesは、クラスター環境でDockerコンテナーをオーケストレーションおよび管理するために使用されるオープンソースのソフトウェアまたはツールです。 Kubernetesはk8sとも呼ばれ、Googleによって開発され、「CloudNativeComputingFoundation」に寄付されました

目的

このkubernetesクラスターのセットアップには、CentOS7を備えた1つのマスターノードがあります。 および2つのワーカーノード ミニオンとも呼ばれます Windows2k19サーバーを持っている オペレーティングシステム。

Dockerコンテナを管理するためにデータセンターVMにkubernetesクラスタをインストールして設定します。このクラスターには、1つのマスター(Linux)と2つのワーカーノード(Windows)が含まれ、マスターはワーカーノードでのスケジュールとポッドの展開を制御します。

Kubernetesアーキテクチャ図

いくつかの重要なKubernetes用語 構成を開始する前に知っておく必要があります

ETCD(クラスターノード) :Kubernetesは「etcd」を使用します Key-Valueデータベースストアとして。 Kubernetesクラスタの設定を「etcd」に保存します 。

kube-controller-manager: Kubernetesコントローラーマネージャーは、Kubernetesに同梱されているコア制御ループを組み込むデーモンです。 Kubernetesでは、コントローラーは「apiserver」を介してクラスターの共有状態を監視する制御ループです。 現在の状態を目的の状態に移動しようとして変更を加えます。現在Kubernetesに同梱されているコントローラーの例としては、レプリケーションコントローラー、エンドポイントコントローラー、名前空間コントローラー、サービスアカウントコントローラーがあります

kube-apiserver :Kubernetes APIサーバーは、ポッド、サービス、レプリケーションコントローラーなどを含むAPIオブジェクトのデータを検証および構成します。 APIサーバーはREST操作を処理し、他のすべてのコンポーネントが相互作用するクラスターの共有状態へのフロントエンドを提供します。

kube-scheduler: Kubernetesスケジューラは、ポリシーが豊富でトポロジに対応したワークロード固有の機能であり、可用性、パフォーマンス、容量に大きな影響を与えます。スケジューラーは、個々のリソース要件と集合的なリソース要件、サービス品質要件、ハードウェア/ソフトウェア/ポリシーの制約、アフィニティと非アフィニティの仕様、データの局所性、ワークロード間の干渉、期限などを考慮する必要があります。

kubelet :「クベレット」 プライマリ「ノードエージェント」です 」は各ノードで実行されます。次のいずれかを使用して、ノードをapiserverに登録できます。ホスト名を上書きするフラグ。またはクラウドプロバイダーの特定のロジック。

kube-proxy :Kubernetesネットワークプロキシは各ノードで実行されます。これは、各ノードのKubernetes APIで定義されているサービスを反映しており、一連のバックエンド間で単純なTCP、UDP、およびSCTPストリーム転送またはラウンドロビンTCP、UDP、およびSCTP転送を実行できます。

Kubernetesクラスターのセットアップの説明

Kubernetesのセットアップでは、1つのマスター(CentOS 7)ノードと2つのワーカー(Win 2k19)ノードがあります。マスターノードから、「 kubeadm」を使用してクラスターとそのノードを管理できます ‘および‘ kubectl 「コマンド。

Kubernetesは、次の方法を使用してインストールおよびデプロイできます。

  • Minikube(単一ノードのkubernetesクラスターです)
  • Kops(AWSへのマルチノードkubernetesセットアップ)
  • Kubeadm(私たちの敷地内のマルチノードクラスター)

この記事では、kubeadmユーティリティを使用してCentOS 7 /RHEL7に最新バージョンのKubernetes1.16をインストールします。このセットアップでは、最小限のインストールで1台のCentOS7サーバーと2台のWindows2k19サーバーを使用しています。 1台のサーバーがマスターノードとして機能し、残りの2台のサーバーはミニオンノードまたはワーカーノードになります

マスターノードに次のコンポーネントがインストールされます

  • APIサーバー –http経由でJason/Yamlを使用してkubernetesAPIを提供し、APIオブジェクトの状態はetcdに保存されます
  • スケジューラー –これは、リソースの可用性に基づいてワーカーノードでコンテナーを起動するなどのスケジューリングタスクを実行するマスターノード上のプログラムです。
  • コントローラーマネージャー –コントローラーマネージャーの主な仕事は、レプリケーションコントローラーを監視し、目的の状態を維持するためのポッドを作成することです。
  • etcd –これはキーと値のペアのデータベースです。クラスターとクラスター状態の構成データを保存します。
  • Kubectlユーティリティ –ポート6443でAPIサーバーに接続するコマンドラインユーティリティです。管理者がポッドやサービスなどを作成するために使用します。

ワーカーノードには、次のコンポーネントがインストールされます

  • Kubelet –これは、すべてのワーカーノードで実行されるエージェントであり、Dockerに接続し、コンテナーの作成、開始、削除を処理します。
  • Kube-Proxy –着信要求のIPアドレスとポート番号に基づいて、トラフィックを適切なコンテナーにルーティングします。つまり、ポート変換に使用されていると言えます。
  • ポッド –ポッドは、単一のワーカーノードまたはDockerホストにデプロイされる多層またはコンテナーのグループとして定義できます。

CentOS7でのKubernetes1.16のインストール手順

ステップ1: ホスト名を設定し、SELinuxを無効にしてファイアウォールを設定します。この場合、ファイアウォールとSELinuxは無効状態であり、ホスト名はkube-masterとして設定されます。そして、すべてのノードが

であることを確認してください

ステップ2 :Kubernetesリポジトリを設定する

KubernetesパッケージはデフォルトのCentOS7およびRHEL7リポジトリでは利用できません。以下のURLを使用してパッケージリポジトリを設定してください。

ステップ3: 以下のコマンドを使用してKubeadmとDockerをインストールします

# yum install kubeadm docker -y

次に、 kubectlを起動して有効にします およびdocker 以下のコマンドを使用したサービス。

# systemctl restart docker && systemctl enable docker
# systemctl restart kubelet && systemctl enable kubelet

ステップ4 「kubeadminit」を使用してKubernetesマスターを初期化します

上記のコマンドの出力は次のようになります

出力からわかるように、kubernetesマスターは正常に初期化されています。以下のコマンドを実行して、クラスターをrootユーザーとして使用します。

ステップ5 :ポッドネットワークをクラスターにデプロイする

以下のコマンドを実行して、クラスターとポッドのステータスを取得してみてください。

kubectl get nodes
kubectl get pods –all-namespaces

クラスタステータスを準備完了にしてkube-dnsステータスを実行するには、ポッドネットワークをデプロイして、異なるホストのコンテナが相互に通信するようにします。 PODネットワークは、ワーカーノード間のオーバーレイネットワークです。

以下のコマンドを実行して、ネットワークを展開します。

次に、次のコマンドを実行してステータスを確認します。マスターノードが準備完了状態になっていることがわかるので、このkubernetesクラスターにワーカーノードを追加します。

Kubernetesクラスターネットワークソリューションの選択と構成

Kubernetesマスターノードをセットアップしたら、ネットワークソリューションを選択する準備が整います。仮想クラスターサブネットをノード間でルーティング可能にする方法は複数あります。今日のWindows上のKubernetesの次のオプションのいずれかを選択してください。

  • FlannelなどのCNIプラグインを使用して、オーバーレイネットワークをセットアップします。
  • FlannelなどのCNIプラグインを使用して、ルートをプログラムします(l2bridgeネットワークモードを使用します)。
  • サブネットをルーティングするようにスマートトップオブラック(ToR)スイッチを構成します。

vxlanモードのフランネル

vxlanモードのフランネルを使用して、VXLANトンネリングを使用してノード間でパケットをルーティングする構成可能な仮想オーバーレイネットワークをセットアップできます。

フランネル用にKubernetesマスターを準備する

クラスタ内のKubernetesマスターでいくつかのマイナーな準備を行うことをお勧めします。 Flannelを使用する場合は、iptablesチェーンへのブリッジIPv4トラフィックを有効にすることをお勧めします。これは、次のコマンドを使用して実行できます。

# sudo sysctl net.bridge.bridge-nf-call-iptables=1

フランネルをダウンロードして構成する

以下のコマンドを使用して、最新のフランネルマニフェストをダウンロードします。

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

vxlanネットワークバックエンドを有効にするために変更する必要がある2つのセクションがあります:

  1. net-conf.json kube-flannel.ymlのセクション 、再確認:
    • クラスタサブネット(例:「10.244.0.0/16」)は必要に応じて設定されます。
    • VNI4096がバックエンドに設定されています
    • ポート4789はバックエンドに設定されています
  2. cni-conf.json kube-flannel.ymlのセクション 、ネットワーク名を “ vxlan0”に変更します

上記の手順を適用した後、 net-conf.json 次のようになります:

cni-conf.json 次のようになります:

フランネルを起動して検証

コマンドを使用してフランネルを起動します

# kubectl apply -f kube-flannel.yml

次に、FlannelポッドはLinuxベースであるため、LinuxNodeSelectorパッチをkube-flannel-dsに適用します。 以下のコマンドを使用してNodeSelectorをダウンロードおよび設定することでLinuxのみをターゲットにするDaemonSet

# wget https://github.com/microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/manifests/node-selector-patch.yml
# kubectl patch ds/kube-flannel-ds-amd64 --patch "$(cat node-selector-patch.yml)" -n=kube-system

数分後、Flannelポッドネットワークが展開されている場合は、すべてのポッドが実行されていることを確認できます。

Windowsワーカーノードをkubernetesクラスターに参加させる

Kubernetesマスターノードをセットアップし、目的のネットワークソリューションを選択すると、WindowsServerノードに参加してクラスターを形成する準備が整います。これには、参加する前にWindowsノードでいくつかの準備が必要です。

Windowsノードの準備

Dockerをインストールします(再起動が必要です)

KubernetesはコンテナエンジンとしてDockerを使用しているため、インストールする必要があります。公式のドキュメントの手順、Dockerの手順に従うか、以下の手順を試すことができます:

Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name Docker -ProviderName DockerMsftProvider
Restart-Computer –Force

プロキシの背後にいる場合は、次のPowerShell環境変数を定義する必要があります。

[Environment] ::SetEnvironmentVariable( "HTTP_PROXY"、 "http://proxy.example.com:80/"、[EnvironmentVariableTarget] ::Machine)

[Environment] ::SetEnvironmentVariable( "HTTPS_PROXY"、 "http://proxy.example.com:443/"、[EnvironmentVariableTarget] ::Machine)

再起動後に次のエラーが表示される場合:

次に、Dockerサービスを手動で開始します:

Start-Service docker

KubernetesをWindowsディレクトリに準備する

「KubernetesforWindows」ディレクトリを作成して、Kubernetesバイナリ、およびデプロイスクリプトと設定ファイルを保存します。

mkdir c:\k

Kubernetes証明書をコピー

Kubernetes証明書ファイル($HOME/.kube/config)をコピーします )マスターからこの新しいC:\k ディレクトリ。

Kubernetesバイナリをダウンロード

Kubernetesを実行できるようにするには、最初にkubectl kubelet およびkube-proxy バイナリ。これらは、CHANGELOG.md 最新リリースのファイル。

  • たとえば、v1.14ノードバイナリは次のとおりです。
  • Expand-Archiveなどのツールを使用してアーカイブを抽出し、バイナリをC:\k\に配置します 。

(オプション)Windowsでkubectlをセットアップする

Windowsからクラスターを制御する場合は、kubectlを使用して制御できます。 指図。まず、kubectlを作成します C:\k\の外部で利用可能 ディレクトリ、PATHを変更します 環境変数:

$env:Path += ";C:\k"

この変更を永続的にしたい場合は、マシンターゲットの変数を変更してください:

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\k", [EnvironmentVariableTarget]::Machine)

次に、クラスター証明書が有効であることを確認します。 kubectlの場所を設定するため 構成ファイルを探し、--kubeconfigを渡すことができます パラメータを設定するか、KUBECONFIGを変更します 環境変数。たとえば、構成がC:\k\configにある場合 :

$env:KUBECONFIG="C:\k\config"

この設定を現在のユーザーのスコープに対して永続的にするには:

[Environment]::SetEnvironmentVariable("KUBECONFIG", "C:\k\config", [EnvironmentVariableTarget]::User)

最後に、構成が正しく検出されたかどうかを確認するには、次を使用できます。

kubectl config view

接続エラーが発生した場合

Unable to connect to the server: dial tcp [::1]:8080: connectex: No connection could be made because the target machine actively refused it.

kubeconfigの場所を再確認するか、もう一度コピーしてみてください。

エラーが表示されない場合、ノードはクラスターに参加する準備ができています。

Windowsノードに参加しています

選択したネットワークソリューションに応じて、次のことができます。

  1. Windows Serverノードをフランネル(vxlanまたはhost-gw)クラスターに参加させます(このソリューションを使用しています)
  2. ToRスイッチを使用してWindowsServerノードをクラスターに参加させます

フランネルクラスターに参加する

このMicrosoftリポジトリには、このノードをクラスタに参加させるのに役立つFlannel展開スクリプトのコレクションがあります。

Flannel start.ps1スクリプトをダウンロードします。このスクリプトの内容は、C:\kに抽出する必要があります。 :

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
wget https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/flannel/start.ps1 -o c:\k\start.ps1

Windowsノードとc:\kを準備したと仮定します ディレクトリは次のようになります。ノードに参加する準備ができています。

Windowsノードに参加

Windowsノードに参加するプロセスを簡素化するには、単一のWindowsスクリプトを実行するだけでkubeletを起動できます。 、kube-proxyflanneld 、ノードに参加します。

cd c:\k

.\start.ps1 -ManagementIP <Windows Node IP> -NetworkMode <network mode>  -ClusterCIDR <Cluster CIDR> -ServiceCIDR <Service CIDR> -KubeDnsServiceIP <Kube-dns Service IP> -LogDir <Log directory>

これを実行すると、次のことができるようになります。

  • kubectlgetノードを使用して結合されたWindowsノードを表示する
  • 3つのPowerShellウィンドウが開いていることを確認してください。1つはkubelet用、1つはflanneld用、もう1つはkube-proxy用です
  • ノードで実行されているflanneld、kubelet、およびkube-proxyのホストエージェントプロセスを参照してください


Linux
  1. kubeadmを使用してUbuntu20.04でKubernetesクラスターをセットアップする

  2. kubectl apply vs create:Kubernetesクラスター環境でリソースを作成するためにどちらを使用しますか?

  3. 正常なクラスターで seqno -1 を指定した grastate.dat。なんで?

  1. Rancherを使用してKubernetesクラスターをセットアップする方法

  2. ランチャーを使用してKubernetesクラスターをセットアップする

  3. Kubernetesでノードをドレインする方法

  1. Kubeadmを使用してHAでKubernetes(k8s)クラスターをセットアップする方法

  2. RHEL8でシングルノードOpenShiftクラスターをセットアップする方法

  3. Kubernetesクラスターのコアコンポーネント