はじめに
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つのセクションがあります:
- net-conf.json kube-flannel.ymlのセクション 、再確認:
- クラスタサブネット(例:「10.244.0.0/16」)は必要に応じて設定されます。
- VNI4096がバックエンドに設定されています
- ポート4789はバックエンドに設定されています
- 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ノードに参加しています
選択したネットワークソリューションに応じて、次のことができます。
- Windows Serverノードをフランネル(vxlanまたはhost-gw)クラスターに参加させます(このソリューションを使用しています)
- 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-proxy
、flanneld
、ノードに参加します。
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のホストエージェントプロセスを参照してください
