CentOS8にKubernetesクラスターをインストールする方法


CentOS8にKubernetesClusterをインストールするプロセスは、CentOS 7のプロセス(ここで実行できます)とほぼ同じですが、ここでのプロセスにはいくつかの変更があります。これらの変更は、主にDockerのインストールを中心に展開されます。

CentOS 8(および拡張RHEL 8)以降、dockerはRedhatのツールであるpodmanとbuildahにネイティブに置き換えられました。実際のところ、dockerパッケージはデフォルトのパッケージリポジトリから削除されました。

この動きにより、Redhatチームは、特別な権限を必要とせずにコンテナーを作成および使用するプロセスを簡素化すると同時に、Dockerイメージとの互換性を維持し、デーモンを必要とせずにコンテナーを操作することを目指しています。 Podmanは、Kubernetes環境で実行するときに柔軟性を高めることを約束していますが、陪審員はそこにとどまります。

この記事では、Docker-CE(Community Edition)で実行されているCentOS8プラットフォームにKubernetesをインストールするプロセスを実行します。後の記事では、コンテナにpodmanを使用して、同様のインストールを実行します。

  1. Three servers running CentOS 8 – 1 Master Node and 2 Worker Nodes.
  2. It is recommended that your nodes should have at least 2 CPUs with 2GB RAM or more per machine. This is not a strict requirement but is largely driven by the needs of the application you intend to run.
  3. Internet connectivity on all your nodes. We will be fetching Kubernetes and docker packages from the repository. Equally, you will need to make sure that the DNF package manager is installed by default and can fetch packages remotely.
  4. All your nodes should also be able to connect to one another, either on a private or public network, whichever is available.
  5. You will also need access to an account with sudo or root privileges. In this tutorial, I will be using my root account.

ほとんどのノードには通常、一意のMACアドレスが付いていますが、場合によっては、一部の仮想マシンが同じMACアドレスを持っていることもあります。したがって、Product_UUIDとMACアドレスがどのノードでも同一でないことを確認することをお勧めします。

Kubernetesはこれらの値を使用して、クラスター内のノードを一意に識別します。これらの値が各ノードに固有でない場合、インストールプロセスが失敗する可能性があります。

ネットワークインターフェースのMACアドレスを確認して比較します。

# ip link

product_uuidを確認して比較するには、次のコマンドを実行します。

# cat /sys/class/dmi/id/product_uuid 

私たちのインストールは、マスターノードがワーカーノードを制御するように設計されています。このインストールの最後に、論理アーキテクチャは次のようになります。

マスターノード–このマシンは通常、コントロールプレーンとして機能し、クラスターデータベースとAPIサーバー(kubectl CLIが通信する)を実行します。

3ノードのKubernetesクラスターは次のようになります。

マスターノードへのKubernetesクラスターのインストール

Kubernetesを機能させるには、コンテナ化エンジンが必要です。前述のように、Docker-CEを使用します。

以下の機関は、CentOS8マスターノードで実行されます。

CentOS 8マスターノードで、システムのホスト名を設定し、/ etc/hostsファイルのDNSを更新します。

# hostnamectl set-hostname master-node
# cat <<EOF>> /etc/hosts
192.168.0.47 master-node
192.168.0.48 node-1 worker-node-1
192.168.0.49 node-2 worker-node-2
EOF

次に、worker-node-1とworker-node-2にpingを実行して、pingコマンドを使用して更新されたホストファイルが正しく機能しているかどうかを確認します。

# ping 192.168.0.48
# ping 192.168.0.49

次に、Selinuxを無効にします。これは、コンテナがホストファイルシステムにアクセスできるようにするために必要です。これは、ポッドネットワークやその他のサービスで必要です。

# setenforce 0

setenforceを 0 に設定すると、SELinuxが実質的にpermissiveに設定され、次の再起動までSELinuxが事実上無効になります。完全に無効にするには、以下のコマンドを使用して再起動します。

# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
# reboot

Kubernetesは、通信とアクセスにさまざまなポートを利用します。これらのポートは、ファイアウォールによって制限されずに、Kubernetesからアクセスできる必要があります。

ポートにファイアウォールルールを構成します。

# firewall-cmd --permanent --add-port=6443/tcp
# firewall-cmd --permanent --add-port=2379-2380/tcp
# firewall-cmd --permanent --add-port=10250/tcp
# firewall-cmd --permanent --add-port=10251/tcp
# firewall-cmd --permanent --add-port=10252/tcp
# firewall-cmd --permanent --add-port=10255/tcp
# firewall-cmd --reload
# modprobe br_netfilter
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

次のdnfconfig-managerコマンドを使用して、デフォルトのパッケージリストに含まれなくなったDockerリポジトリを最初に追加する必要があります。

# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

また、ホストシステムの完全なコンテナライフサイクルを管理するデーモンとして利用可能なcontainerd.ioパッケージをインストールします。これは、イメージの転送と保存からコンテナの実行と監視、低レベルのストレージ、ネットワーク接続などに至るまでです。

# dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

次に、最新バージョンのdocker-ceパッケージをインストールします。

# dnf install docker-ce

これで、Dockerサービスを有効にして開始できます。

# systemctl enable docker
# systemctl start docker

次に、KubernetesリポジトリはCentOS 8にデフォルトでインストールされていないため、手動で追加する必要があります。

# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Kubeadmは、ベストプラクティスに準拠する実行可能な最小限のKubernetesクラスターをブートストラップするのに役立ちます。 kubeadmを使用すると、クラスターはKubernetes適合性テストに合格する必要があります。

Kubeadmは、アップグレード、ダウングレード、ブートストラップトークンの管理など、他のクラスターライフサイクル機能もサポートしています。 Kubeadmは、AnsibleやTerraformなどの他のオーケストレーションツールとも統合できます。

パッケージリポジトリの準備ができたら、kubeadmパッケージをインストールできます。

# dnf install kubeadm -y 

インストールが正常に完了したら、サービスを有効にして開始します。

# systemctl enable kubelet
# systemctl start kubelet

クラスタのコントロールプレーンとして機能するKubernetesマスターは、クラスタに必要ないくつかの重要なサービスを実行します。そのため、初期化プロセスは一連の事前チェックを実行して、マシンがKubernetesを実行する準備ができていることを確認します。これらの事前チェックにより、警告が表示され、エラーが発生すると終了します。次に、kubeadm initは、クラスターコントロールプレーンコンポーネントをダウンロードしてインストールします。

次に、Kubernetesマスターを初期化しますが、その前に、「kubeadminit」コマンドを実行するためにスワップを無効にする必要があります。

# swapoff -a

Kubernetesマスターの初期化は、示されているように「kubeadminit」コマンドによって制御される完全に自動化されたプロセスです。

# kubeadm init

次に、後でワーカーノードでこのコマンドを実行する必要があるため、次のコマンドをコピーしてどこかに保存します。

kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5  \ --discovery-token-ca-cert-hash ha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf7

ヒント:上記のコマンドは、渡された引数についてエラーをスローする場合があるため、エラーを回避するには、 ‘\’ 文字を削除する必要があり、最終的なコマンドは次のようになります。

# kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5 –discovery token-ca-cert-hash sha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf7

Kubernetesが正常に初期化されたら、ユーザーがクラスターの使用を開始できるようにする必要があります。このシナリオでは、rootユーザーを使用します。図のように、sudoユーザーを使用してクラスターを開始することもできます。

rootを使用するには、次のコマンドを実行します。

# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config

sudo対応ユーザーを使用するには、次のコマンドを実行します。

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

ここで、kubectlコマンドがアクティブになっていることを確認します。

# kubectl get nodes

この時点で、マスターノードのステータスが「NotReady」であることがわかります。これは、ポッドネットワークをまだクラスターにデプロイしていないためです。

ポッドネットワークは、クラスターのオーバーレイネットワークであり、現在のノードネットワークの上に展開されます。ポッド全体の接続を可能にするように設計されています。

ネットワーククラスターの展開は、ニーズに応じて非常に柔軟なプロセスであり、利用可能な多くのオプションがあります。インストールをできるだけシンプルにしたいので、構成や追加のコードを必要とせず、ポッドごとに1つのIPアドレスを提供するWeavenetプラグインを使用します。これは私たちにとって素晴らしいことです。その他のオプションを確認したい場合は、こちらを確認してください。

これらのコマンドは、ポッドネットワークをセットアップするために重要になります。

# export kubever=$(kubectl version | base64 | tr -d '\n')
# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

マスターノードのステータスを確認すると、「準備完了」になっているはずです。

# kubectl get nodes

次に、ワーカーノードをクラスターに追加します。

Kubernetesクラスターへのワーカーノードの追加

以下の手順は、Kubernetesクラスターに参加するときに各ワーカーノードで実行されます。

最初にworker-node-1とworker-node-2にホスト名を設定してから、ホストエントリを/ etc/hostsファイルに追加します。

# hostnamectl set-hostname 'node-1'
# cat <<EOF>> /etc/hosts
192.168.0.47 master-node
192.168.0.48 node-1 worker-node-1
192.168.0.49 node-2 worker-node-2
EOF

次に、ワーカーノードからマスターノードにpingを実行し、pingコマンドを使用して更新されたホストファイルが正常に機能していることを確認します。

# 192.168.0.47

次に、SElinuxを無効にして、ファイアウォールルールを更新します。

# setenforce 0
# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
# firewall-cmd --permanent --add-port=6783/tcp
# firewall-cmd --permanent --add-port=10250/tcp
# firewall-cmd --permanent --add-port=10255/tcp
# firewall-cmd --permanent --add-port=30000-32767/tcp
# firewall-cmd --reload
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

最初にDNFconfig-managerを使用してDockerリポジトリを追加します。

# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

次に、containerd.ioパッケージを追加します。

# dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

これら2つのパッケージをインストールした状態で、最新バージョンのdocker-ceをインストールします。

# dnf install docker-ce

Dockerサービスを有効にして開始します。

# systemctl enable docker
# systemctl start docker

KubernetesリポジトリはCentOS8にプリインストールされていないため、手動で追加する必要があります。

# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

パッケージリポジトリの準備ができたら、kubeadmをインストールできます。

# dnf install kubeadm -y 

サービスを開始して有効にします。

# systemctl enable kubelet
# systemctl start kubelet

クラスターに参加するには、kubeadminitが生成したトークンが必要です。どこかにコピーした場合は、ノード1とノード2にコピーして貼り付けることができます。

# kubeadm join 192.168.0.47:6443 --token nu06lu.xrsux0ss0ixtnms5  --discovery-token-ca-cert-hash sha256:f996ea35r4353d342fdea2997a1cf8caeddafd6d4360d606dbc82314683478hjmf78

最後の行で提案されているように、マスターノードに戻り、次のコマンドを使用して、ワーカーノード1とワーカーノード2がクラスターに参加しているかどうかを確認します。

# kubectl get nodes

すべてのステップが正常に実行されると、マスターノードでノード1とノード2が準備完了ステータスになっているはずです。この時点で、CentOS8にKubernetesクラスターが正常にデプロイされました。

推奨読書:KubernetesクラスターにNginxをデプロイする方法

ここで作成したクラスターには単一のマスターノードがあるため、マスターノードに障害が発生すると、クラスターのデータが失われ、最初から再作成する必要がある場合があります。

このため、高可用性セットアップをお勧めします。