Kubernetesクラスタの完全インストールガイド

環境準備

ローカル環境のオペレーティングシステムはWindows 10 Pro(バージョン22H2、内部バージョン19045.3324)、メモリ64.0GB、プロセッサ12th Gen Intel® Core™ i9-12900K 3.19 GHzです。3台のマシンはすべてVMware Workstation Proを使用してCentOS7オペレーティングシステムをインストールしています。

Kubernetesクラスタ構成の計画

役割 IPアドレス kubernetesバージョン
k8s-master 192.168.122.130
k8s-node1 192.168.122.131
k8s-node2 192.168.122.132

ホスト間の信頼関係構築

ローカルのWindowsオペレーティングシステムで鍵ファイルを生成し、LinuxオペレーティングシステムCentOS7の3台のマシンにアップロードして、パスワードなしログインを設定し、後続の操作を容易にします。ssh-copy-id root@ターゲットIPアドレスコマンドを実行してパスワードなしログインを実現し、他の2台も同様の操作を行います。

Windowsシステムでssh-copy-id root@192.168.248.129コマンドを実行する場合、PuTTY、Git Bashなどのサードパーティソフトウェアを使用してSSHクライアント機能を実現する必要があります。

ssh-copy-idコマンドを使用したパスワードなしログインのインストールと設定

以下ではGit Bashを例に、WindowsシステムでLinuxのCentOS 7に対するパスワードなしログインを実現するためのインストールと設定プロセスを紹介します。

1. Git Bashソフトウェアのインストール

Git公式サイトからインストーラをダウンロードし、インストール時にデフォルトオプションを選択します。

2. 公開鍵の生成

Git Bashで以下のコマンドを実行して公開鍵ファイルを生成します:

ssh-keygen -t rsa

実行後、ファイル名やパスワードなどの情報を入力するよう促されますが、Enterキーを押してデフォルトオプションを選択できます。生成された公開鍵ファイルはデフォルトでユーザーディレクトリの.sshディレクトリに保存され、ファイル名はid_rsa.pubです。

これらのファイルをk8s-master、k8s-node1、k8s-node2にアップロードします。

3. SSHでLinuxサーバーにログイン

Git Bashを使用してLinuxサーバーにログインし、以下のコマンドを実行します:

ssh root@192.168.122.130

初回ログイン時、ホストを既知のホストリストに追加するかどうかを尋ねられます。yesと入力し、Linuxサーバーのパスワードを入力してログインに成功します。

4. 公開鍵をLinuxサーバーにコピー

以下のコマンドを使用して公開鍵をLinuxサーバーにコピーします:

ssh-copy-id root@192.168.122.130

実行後、Linuxサーバーのパスワードを入力するよう促されますので、入力してください。

5. SSHパスワードなしログインのテスト

以下のコマンドを使用して、SSHパスワードなしログインが正常に実現されているかテストします:

ssh root@192.168.122.130

パスワードを入力せずに直接ログインできれば、SSHパスワードなしログインが正常に実現されていることを示します。

"/root/.ssh/id_rsa"のパーミッション0777があまりにもオープンすぎるため、この秘密鍵は無視されます。パーミッションを変更してください。コードは以下の通りです:

chmod 600 /root/.ssh/id_rsa

実行中に「/root/.pub」ファイルを開けないというエラーが表示される場合、ファイルまたはディレクトリが存在しないためです。SSH公開鍵をリモートサーバーにコピーしようとすると、SSH公開鍵ファイルのパスを誤って指定した可能性があります。以下の手順で解決を試みてください:まず、SSH鍵ペアが存在することを確認します。以下のコマンドを実行して確認してください:ls -al ~/.ssh。結果にid_rsaとid_rsa.pubファイルが含まれていない場合、SSH鍵ペアがないことを示します。以下のコマンドを使用して生成できます:ssh-keygen -t rsa。プロンプトに従って操作してください。デフォルト設定を気にする必要はありません。

他の2台のマシンも同様に操作します。これにより、ローカル(Windowsオペレーティングシステム)、CentOS(3台のマシン)でパスワードなしログインを使用できるようになります。効果は以下の図のようになります:

このモードは、ローカルマシンと3台の仮想マシンをすべてパスワードなしログインに設定するものです。もう一つの方法は、3台の仮想マシン間で直接パスワードなしログインを設定する方法です。操作は以下の通りです: すべてのノードで以下のコマンドを実行して鍵ペアを生成します:

ssh-keygen -t rsa

すべてのノードで以下のコマンドを実行してファイルをマスターノードに送信します:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.130

マスターノードで以下のコマンドを実行してauthorized_keysファイルを確認します:

cd /root/.ssh/
cat /root/.ssh/authorized_keys

マスターノードの効果は以下の通りです:

[root@k8s-master .ssh]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCak3h2omdNvqH6R7YJfvM9TxvsfKqiWtmSjahb4q/jQm7GYL+/75vK78Wdhvre2gzCuubksczVlZ8rHnB/Li4N9HrjqPOaA+qctg76YZug8BBAVecSXHwCxRy7kKgEDkX8Qf8lZzE6LlBuI4xz2skXRgUA5VaJMOtAFk5ROMGW0dcF+2Eb3o5g9KtYs8Dw8JLVvLAg8FxgnfCCV6g4rckNcJDNa7kA8oplBeE5VW5DGVhIS3k2qhNhlJVtn7MX+L819plmqEpEeLoEpF/ikU6/X4l6w+RWsy9kE8SvZ7r2Nfc4tyYUKc5LxDA6zyA3LwLr+UdUXcZXZvPbal7Rd3Cv root@k8s-node2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXtQC07Ta52w53na8IVQLMKqDyPy2+pI173UUYBr/TQGfa/zO+dAr0ONRbiLsio/rmjLOerGs7SS9hoWCDqnJemie/KUNJKXiZuMPxGMG/Wip63tQj2vaf+bLSXOGcafN6VeC01rHTLDMSSde1Csp5TbHEL9b12Q31dJYIsSTTs35n9LILUuje2mjdg1VVdAO5PUp8O7DQoehcNWc40uiOHmRrfTsNCFgXicwMz0YiOnbAe83ETnUWhVEf0YTkLDDGIuY8Miy7Lh3mL8ospTL2FroOOiASsS/2FozVqCjn4EAMatfFU0iCgKgjlmmGUR3K12q2svYqBtLgNuQuD/xb root@k8s-node1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLQhSxAc/f6HPmeEeqv8djy344GgtKlkxej3kVZaQAhBhPibPaQI6FUdqpUz2S/7Qx/Idy2mHri3nh1HhMr8DGwyILJH/AjznXozdkEi9p+che0VAdyqZZZGvrW5r22X1Pn4jAwZKsq1aSUPGEcdPAT12cq7Fq3VVBccpZtLVJI2y6eJQI+4ohVPE6NgRquCfVhtqTKIDx+1tfmr1oLEphU+/mIyyJsL3B0ogbFWnTaAdlddwsL2JAz4t8zR0vn0XrMBC9z25jGrlBIwZSTyM6LBAZ03u5Tf9v4Y54wmAUNG4OXtSbUiLj00o9/1ohLOFsTb9903XjDqSApfGd0Qz3 root@k8s-master

マスターノードで以下のコマンドを実行して、authorized_keysをスレーブノード1にプッシュします:

scp authorized_keys root@192.168.122.131:/root/.ssh/

スレーブ1ノードの効果は以下の通りです:

[root@k8s-node1 .ssh]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCak3h2omdNvqH6R7YJfvM9TxvsfKqiWtmSjahb4q/jQm7GYL+/75vK78Wdhvre2gzCuubksczVlZ8rHnB/Li4N9HrjqPOaA+qctg76YZug8BBAVecSXHwCxRy7kKgEDkX8Qf8lZzE6LlBuI4xz2skXRgUA5VaJMOtAFk5ROMGW0dcF+2Eb3o5g9KtYs8Dw8JLVvLAg8FxgnfCCV6g4rckNcJDNa7kA8oplBeE5VW5DGVhIS3k2qhNhlJVtn7MX+L819plmqEpEeLoEpF/ikU6/X4l6w+RWsy9kE8SvZ7r2Nfc4tyYUKc5LxDA6zyA3LwLr+UdUXcZXZvPbal7Rd3Cv root@k8s-node2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXtQC07Ta52w53na8IVQLMKqDyPy2+pI173UUYBr/TQGfa/zO+dAr0ONRbiLsio/rmjLOerGs7SS9hoWCDqnJemie/KUNJKXiZuMPxGMG/Wip63tQj2vaf+bLSXOGcafN6VeC01rHTLDMSSde1Csp5TbHEL9b12Q31dJYIsSTTs35n9LILUuje2mjdg1VVdAO5PUp8O7DQoehcNWc40uiOHmRrfTsNCFgXicwMz0YiOnbAe83ETnUWhVEf0YTkLDDGIuY8Miy7Lh3mL8ospTL2FroOOiASsS/2FozVqCjn4EAMatfFU0iCgKgjlmmGUR3K12q2svYqBtLgNuQuD/xb root@k8s-node1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLQhSxAc/f6HPmeEeqv8djy344GgtKlkxej3kVZaQAhBhPibPaQI6FUdqpUz2S/7Qx/Idy2mHri3nh1HhMr8DGwyILJH/AjznXozdkEi9p+che0VAdyqZZZGvrW5r22X1Pn4jAwZKsq1aSUPGEcdPAT12cq7Fq3VVBccpZtLVJI2y6eJQI+4ohVPE6NgRquCfVhtqTKIDx+1tfmr1oLEphU+/mIyyJsL3B0ogbFWnTaAdlddwsL2JAz4t8zR0vn0XrMBC9z25jGrlBIwZSTyM6LBAZ03u5Tf9v4Y54wmAUNG4OXtSbUiLj00o9/1ohLOFsTb9903XjDqSApfGd0Qz3 root@k8s-master

マスターノードで以下のコマンドを実行して、authorized_keysをスレーブノード2にプッシュします:

scp authorized_keys root@192.168.122.132:/root/.ssh/

スレーブ2ノードの効果は以下の通りです:

[root@k8s-node2 .ssh]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCak3h2omdNvqH6R7YJfvM9TxvsfKqiWtmSjahb4q/jQm7GYL+/75vK78Wdhvre2gzCuubksczVlZ8rHnB/Li4N9HrjqPOaA+qctg76YZug8BBAVecSXHwCxRy7kKgEDkX8Qf8lZzE6LlBuI4xz2skXRgUA5VaJMOtAFk5ROMGW0dcF+2Eb3o5g9KtYs8Dw8JLVvLAg8FxgnfCCV6g4rckNcJDNa7kA8oplBeE5VW5DGVhIS3k2qhNhlJVtn7MX+L819plmqEpEeLoEpF/ikU6/X4l6w+RWsy9kE8SvZ7r2Nfc4tyYUKc5LxDA6zyA3LwLr+UdUXcZXZvPbal7Rd3Cv root@k8s-node2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXtQC07Ta52w53na8IVQLMKqDyPy2+pI173UUYBr/TQGfa/zO+dAr0ONRbiLsio/rmjLOerGs7SS9hoWCDqnJemie/KUNJKXiZuMPxGMG/Wip63tQj2vaf+bLSXOGcafN6VeC01rHTLDMSSde1Csp5TbHEL9b12Q31dJYIsSTTs35n9LILUuje2mjdg1VVdAO5PUp8O7DQoehcNWc40uiOHmRrfTsNCFgXicwMz0YiOnbAe83ETnUWhVEf0YTkLDDGIuY8Miy7Lh3mL8ospTL2FroOOiASsS/2FozVqCjn4EAMatfFU0iCgKgjlmmGUR3K12q2svYqBtLgNuQuD/xb root@k8s-node1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLQhSxAc/f6HPmeEeqv8djy344GgtKlkxej3kVZaQAhBhPibPaQI6FUdqpUz2S/7Qx/Idy2mHri3nh1HhMr8DGwyILJH/AjznXozdkEi9p+che0VAdyqZZZGvrW5r22X1Pn4jAwZKsq1aSUPGEcdPAT12cq7Fq3VVBccpZtLVJI2y6eJQI+4ohVPE6NgRquCfVhtqTKIDx+1tfmr1oLEphU+/mIyyJsL3B0ogbFWnTaAdlddwsL2JAz4t8zR0vn0XrMBC9z25jGrlBIwZSTyM6LBAZ03u5Tf9v4Y54wmAUNG4OXtSbUiLj00o9/1ohLOFsTb9903XjDqSApfGd0Qz3 root@k8s-master

すべてのノードで以下のコマンドを実行してパーミッションを変更します:

chmod 600 /root/.ssh/*

以下のコマンドを使用して、SSHパスワードなしログインが正常に実現されているかテストします:

ssh root@192.168.122.130

Ansibleツールのインストール

はい、Ansibleは自動化ツールであり、複数のサーバーの構成と管理に使用できます。SSH接続を使用してリモートサーバーを管理し、複数のサーバーで同時にコマンドを実行して効率を向上させることができます。Ansibleのインストールも非常に簡単で、公式のyumソースからインストールするだけです。CentOSでは、以下のコマンドを使用してAnsibleをインストールできます。マスターノードにのみインストールし、/etc/ansible/hostsファイルを構成して操作するホストをグループに追加します。インストールコマンドは以下の通りです:

yum install epel-release -y
yum -y install ansible

インストールが完了したら、Ansibleを使用してサーバーの自動化構成と管理を開始できます。 /etc/ansible/hostsを構成します。このファイルは操作するホストを保存する場所です。以下の通り:

vim /etc/ansible/hosts

上記の3台のマシンをk8sという名前のグループに追加します:

[k8s]
192.168.122.130
192.168.122.131
192.168.122.132

ansibleコマンドを実行して接続性をテストします。コマンドは以下の通りです:

ansible k8s -m ping

このコマンドはk8sという名前の主机组内のすべてのホストに対してpingモジュールを実行し、正常に接続できるかテストします。pongが出力されれば、テストは成功です。失敗情報が出力された場合は、ホストのネットワーク設定やファイアウォールなどの要因が正しいかどうかを確認する必要があります。 -m:使用するAnsibleモジュールを指定します。ping:Ansibleのモジュールで、ホストの接続性をテストするために使用されます。k8s:Ansibleで定義された主机组名、つまり実行するpingコマンドの対象ホストが属する主机组名です。 k8s:新しく定義したグループ名

カーネルバージョンのアップグレード

Linuxカーネルバージョン番号を確認するには、以下のコマンドを使用します:

uname -sr

これにより、現在実行されているLinuxカーネルバージョン番号が返されます。

Linux 3.10.0-1160.95.1.el7.x86_64

現在のカーネルバージョンは3.10です。KubernetesはNamespaces、Cgroups、OverlayFSなどのLinuxカーネルの機能を使用する必要があります。これらの機能は比較的新しいLinuxカーネルバージョンで完全にサポートされています。したがって、Kubernetesの正常な実行を保証するために、最新のLinuxカーネルバージョンにアップグレードすることをお勧めします。Kubernetes 1.22バージョンの場合、公式推奨の最低Linuxカーネルバージョンは4.4です。より古いLinuxカーネルバージョンを使用している場合、Kubernetesのインストール、デプロイ、使用中にいくつかの問題や制限に遭遇する可能性があります。したがって、より良いKubernetes使用体験を得るために、公式推奨のカーネルバージョンまたはそれ以上のバージョンにアップグレードすることをお勧めします。

elrepoソースを使用したカーネルのアップグレード

各マシンで同じコマンドを実行してelrepoソースをインストールし、構成します。以下のコマンドを実行します:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

最新のカーネルバージョンの確認

以下のコマンドを実行して最新のカーネルバージョンを確認します:

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

kernel-ml #メインラインバージョン、比較的新しい kernel-lt #ロングタームサポートバージョン、比較的古い

最新のカーネルバージョンのインストール

以下のコマンドを実行してメインラインバージョンをインストールします:

yum --enablerepo=elrepo-kernel install kernel-ml -y

システムのデフォルトカーネルを設定

システム上のすべてのカーネルバージョンを確認します:

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

デフォルトカーネルを先ほどアップグレードしたバージョンに設定

バックアップ

cp /etc/default/grub /etc/default/grub-bak

デフォルトカーネルバージョンを設定

grub2-set-default 0

/etc/default/grubを編集

vi /etc/default/grub

GRUB_DEFAULT=savedをGRUB_DEFAULT=0に変更します

カーネル構成を再作成

grub2-mkconfig -o /boot/grub2/grub.cfg

デフォルトカーネルを確認

grubby --default-kernel
grub2-editenv list

効果は以下の通りです:

ソフトウェアパッケージを更新して再起動

yum makecache
reboot

効果は以下の通りです:

初期化

K8Sをインストールする前に、システムに対していくつかの設定を行う必要があります。例えば、ファイアウォールを閉じ、selinux、swapを無効にし、ホスト名、IP解決、時間同期を設定します。

ファイアウォールの無効化

ansibleを使用して3台のマシンのファイアウォールを閉じ、起動時に自動起動しないように設定します。以下のコマンドを実行します:

ansible k8s -m shell -a "systemctl stop firewalld"
ansible k8s -m shell -a "systemctl disable firewalld"

selinuxの無効化

ansibleを使用して3台のマシンのselinuxを永続的に無効にします。以下のコマンドを実行します:

ansible k8s -m shell -a "sed -i 's/enforcing/disabled/' /etc/selinux/config"

swapの無効化

swapoff -aを実行して一時的に無効にし、/etc/fstabファイルを編集して永続的に無効にします。以下のコマンドを実行します:

ansible k8s -m shell -a "sed -ri 's/.*swap.*/#&/' /etc/fstab"

ホスト名の変更

3台のホストそれぞれに対してホスト名を変更します。グラフィカルインターフェースから直接変更する方が速いです。効果は以下の通りです:

以下のコマンドを実行して変更することもできます:

計画に基づいてホスト名を設定【k8s-masterノードで操作】

hostnamectl set-hostname k8s-master

計画に基づいてホスト名を設定【k8s-node1ノードで操作】

hostnamectl set-hostname k8s-node1

計画に基づいてホスト名を設定【k8s-node2ノードで操作】

hostnamectl set-hostname k8s-node2

hostsファイルの変更

マスターノードでhostsファイルを編集し、計画に基づいて変更します。以下のコマンドを実行します:

sudo nano /etc/hosts

次に以下の内容を追加します:

192.168.122.130 k8s-master1
192.168.122.131 k8s-node1
192.168.122.132 k8s-node2

nanoエディタを保存して終了します。コマンドはCtrl+X、Yを入力して保存を確認し、Enterキーを押します。その後、pingまたはsshコマンドを使用してhostnameが有効かどうかをテストできます。例えば:

ping k8s-master1
ssh k8s-node1

ブリッジされたIPv4トラフィックをiptablesのチェーンに転送する

/etc/sysctl.d/ディレクトリにk8s.confを新規作成し、以下の内容を追加します:

# ブリッジデバイスがIPv6に対してiptablesを呼び出すことを許可
net.bridge.bridge-nf-call-ip6tables = 1
# ブリッジデバイスがIPv4に対してiptablesを呼び出すことを許可
net.bridge.bridge-nf-call-iptables = 1
# IPv4フォワーディング機能を有効にする
net.ipv4.ip_forward = 1

このファイルを他の2台のマシンにコピーします:

ansible k8s -m copy -a "src=/etc/sysctl.d/k8s.conf dest=/etc/sysctl.d/k8s.conf"

sysctl --systemコマンドを実行して設定を有効にします:

ansible k8s -m shell -a "sysctl --system"

時間同期の設定

yumコマンドを使用してntpdateをインストールします:

ansible k8s -m shell -a "yum install ntpdate -y"

NTPネットワークタイムサーバーアドレスをntp.aliyun.comに設定し、以下のコマンドを実行します:

ansible k8s -m shell -a "ntpdate ntp.aliyun.com"

containerdのインストール

以下のコマンドを実行して最新のcontainerdをダウンロードします:

wget https://download.fastgit.org/containerd/containerd/releases/download/v1.6.6/cri-containerd-cni-1.6.6-linux-amd64.tar.gz --no-check-certificate

サイズが正常かどうか注意してください。正常でなければ後で解凍できません もしダウンロードできない場合は、ここにアドレスを提供します:https://download.csdn.net/download/java_wxid/88206551

containerdインストールパッケージを解凍します

tar -C / -zxf cri-containerd-cni-1.6.6-linux-amd64.tar.gz

環境変数を構成し、ユーザーディレクトリのbashrcファイルを編集して以下の内容を追加します:

export PATH=$PATH:/usr/local/bin:/usr/local/sbin

そして以下のコマンドを実行して環境変数を即時に有効にします:

source ~/.bashrc

以下のコマンドを実行してcontainerdを起動します

systemctl start containerd

以下のコマンドを実行してバージョン番号を確認します。以下の情報が表示されれば、インストールが成功したことを示します。

ctr version

デフォルトの構成ファイルを作成します

mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
vi /etc/containerd/config.toml

構成ファイルで、以下の行のコメントを解除します:[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]

containerdが正常に作成および起動できるかテスト

以下のコマンドを実行してイメージをプルし、コンテナを作成および起動します: イメージをプルします

ctr i pull docker.io/library/nginx:alpine

コンテナを作成します

ctr c create --net-host docker.io/library/nginx:alpine nginx
ctr task start -d nginx

Containerdサービスの起動情報を確認します:

systemctl status containerd -l

containerdコンポーネントのロード状況を確認し、overlayfsの異常が見つかります

ctr plugin ls

以下のコマンドを使用してcontainerdの実行ログを確認します:

sudo journalctl -fu containerd

コンテナ内のファイルシステムを確認し、xfsファイルシステムであることを確認します:

df -Th

公式資料を参照します: 以下の2つが比較的有用です: OverlayFSは推奨されるストレージドライバーです。以下の前提条件を満たす場合、サポートされます: 4.0バージョンまたはそれ以上のLinuxカーネル、またはRHELまたはCentOS(3.10.0-514バージョンまたはそれ以上のカーネルを使用)。(カーネルバージョンはすでにアップグレードされており、条件を満たしています) overlay2ドライバーはxfsバックアップファイルシステムでサポートされていますが、d_type=trueが有効になっている場合にのみサポートされます。(これが重要なポイントです) 前に設定したシステムカーネルバージョンはLinux 6.4.9-1.el7.elrepo.x86_64で、デフォルトのストレージドライバーはfuse-overlayfsであり、overlay2ではありません。したがって、dockerを使用する場合、デフォルトでfuse-overlayfsがストレージドライバーとして使用されます。overlay2をストレージドライバーとして使用するには、dockerを手動で構成し、/etc/docker/daemon.jsonに以下の内容を追加する必要があります:{ "storage-driver": "overlay2" }。その後、systemctl restart docker.serviceコマンドを使用して再起動します。次に、ファイルシステムがd_type=trueをサポートする必要があります。mount | grep overlayコマンドを使用してサポートされているか確認し、最後にdocker infoコマンドを使用してストレージドライバーがoverlay2に正常に変更されたか確認します。

コンテナの起動時に以下のエラーが表示される場合、runcが不足しており、libseccompがアップグレードされている必要があります。libseccompは2.4バージョン以上である必要があります。

ctr: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error 
(open /run/containerd/io.containerd.runtime.v2.task/default/nginx/log.json: no such file or directory): 
fork/exec /

containerdはv1.6.4バージョン以降、v1.1.2のruncとv1.1.1のcniを使用します。

ダウンロードリンク:https://github.com/opencontainers/runc/releases/download/v1.1.2/runc.amd64?spm=a2c6h.12873639.article-detail.8.31cb4c6a6D2Htj&file=runc.amd64 ダウンロード後、以下のコマンドを実行してインストールし、バージョン番号を確認します:

install -m 755 runc.amd64 /usr/local/sbin/runc
runc -v

以下のコマンドを実行してlibseccompをアップグレードします: 元のバージョンを確認します

rpm -qa | grep libseccomp

元のバージョンをアンインストールします

rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps

高バージョンをダウンロードします

wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm

インストールします

rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm

kubernetesのインストール

kubernetesソースの追加

マスターノードでk8sソフトウェアソースを追加し、他の2台のマシンに配布します。/etc/yum.repos.d/ディレクトリにkubernetes.repoを新規作成します。内容は以下の通りです:

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

kubernetes.repoファイルを他の2台のマシンに配布します。以下のコマンドを実行します:

ansible k8s -m copy -a "src=/etc/yum.repos.d/kubernetes.repo dest=/etc/yum.repos.d/kubernetes.repo"

インストール

マスターノードで以下のコマンドを実行して対応するソフトウェアをインストールします:

yum install -y kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3

デフォルトの構成を生成し、対応するパラメータを変更します。以下のコマンドを使用してデフォルトの構成ファイルを生成します:

kubeadm config print init-defaults > kubeadm-init.yaml

環境に基づいて対応するパラメータを変更します:

# APIバージョンはkubeadm.k8s.io/v1beta3
apiVersion: kubeadm.k8s.io/v1beta3
# ブートストラップトークン
bootstrapTokens:
  - groups:
      - system:bootstrappers:kubeadm:default-node-token
    token: abcdef.0123456789abcdef  # トークン
    ttl: 24h0m0s  # 有効期限は24時間
    usages:
      - signing  # 署名用
      - authentication  # 認証用
# 初期化構成
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.122.130  # マスターノードIP
  bindPort: 6443  # バインドポート
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock  # containerdのソケットファイルパス
  imagePullPolicy: IfNotPresent  # イメージプルポリシーはIfNotPresent
  name: k8s-master # ノード名
  taints: null  # 汚染は空
# クラスタ構成
apiServer:
  timeoutForControlPlane: 4m0s  # コントロールプレーンのタイムアウトは4分
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki  # 証明書ディレクトリ
clusterName: kubernetes  # クラスタ名
controllerManager: {}  # コントローラーマネージャー
dns: {}  # dns
etcd:
  local:
    dataDir: /var/lib/etcd  # etcdデータディレクトリ
imageRepository: registry.aliyuncs.com/google_containers  # アリババクラウドコンテナソースアドレス
kind: ClusterConfiguration
kubernetesVersion: 1.24.0  # kubernetesバージョン
networking:
  dnsDomain: cluster.local  # dnsドメイン
  podSubnet: 10.244.0.0/16  # podのIPネットワーク
  serviceSubnet: 10.96.0.0/12  # サービスサブネット
scheduler: {}  # スケジューラー

初期化

以下のコマンドを実行して初期化します:

kubeadm init --config=kubeadm-init.yaml --v=6

--config:どの構成ファイルに基づいて初期化するかを指定 --v:ログレベルを指定、値が高いほど詳細

初期化成功のヒントに基づいて、以下の操作を行います:

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

次にkubectlを実行するとnodeが表示されます

kubectl get node

k8s各コンポーネントの起動状況を確認するには、以下のコマンドを実行します:

kubectl get pod --all-namespaces -o wide

ノード構成

ノードでkubeadmをインストールします

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

関連コンポーネントをインストールします

yum install -y kubeadm-1.24.3 --disableexcludes=kubernetes

joinコマンドを追加します

kubeadm join 192.168.248.130:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:e9e29c804f92193928f37ca157b73a7ad77e7929314db98855b3ba6e2ce2273d

後でノードを追加する必要がある場合は、マスターノードで以下のコマンドを実行してトークン情報を取得できます

kubeadm token create --print-join-command

ノードの追加に異常が発生した場合は、kubeadm resetコマンドを実行してから再度joinに参加します

ネットワーク構成

corednsはまだ起動していません。ネットワークプラグインがインストールされていないためです。次にネットワークプラグインをインストールします。このドキュメントから独自のネットワークプラグインを選択できます。ここではflannelをインストールします

wget http://down.i4t.com/k8s1.24/kube-flannel.yml

要件に基づいてネットワークカード構成を変更します。ここではens33が主です:

containers:
- name: kube-flannel
 image: quay.io/coreos/flannel:v0.12.0-amd64
 command:
 - /opt/bin/flanneld
 args:
 - --ip-masq
 - --kube-subnet-mgr
 - --iface=ens33  # マルチネットワークカードの場合、内側ネットワークカードの名前を指定

kubeadm.yamlファイルでpodSubnetネットワークを設定し、同時にflannelでも同じネットワークを設定する必要があります。(ここではデフォルトで同じ構成になっています)

デプロイを実行します

kubectl apply -f kube-flannel.yml

CNIプラグインの問題

デフォルトではcontainerdにもcniプラグインがありますが、すでにFlannelをインストールしているため、Flannelのcniプラグインを使用する必要があります。containerd内のcni構成ファイルをコメントアウトする必要があります。そうしないと、2つの構成が競合します。このディレクトリに複数のcni構成ファイルがある場合、kubeletはファイル名の辞書順で最初のものを構成ファイルとして使用します。そのため、デフォルトではcontainerd-netというプラグインが使用されます。

mv /etc/cni/net.d/10-containerd-net.conflist /etc/cni/net.d/10-containerd-net.conflist.bak
systemctl restart containerd kubelet

検証

dnsが正常に解決できるか、pod間で通信できるかを検証します。ここでテスト用のyamlファイルを作成します。内容は以下の通りです:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30001
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: abcdocker9/centos:v1
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

以下のコマンドを実行してpodを作成します

kubectl apply -f test.yaml

nslookupを使用してアドレスが返されるか確認します

kubectl exec -it busybox -- nslookup kubernetes

nginx svcおよびPod内部ネットワーク通信が正常かどうかをテストします。3台のマシンでそれぞれ以下の操作を行います

ping 10.104.115.26 #nginx svc ip
ping 10.244.1.2 #podIP

pingが成功すれば、nodeとpodのネットワークが接続されていることを示します。そうでない場合は、kube-proxyのモードが正しいかどうかを確認します。

nodes/クラスタ内部からClusterIPにアクセスできない

デフォルトでは、デプロイしたkube-proxyを確認すると、以下の情報がログに表示されます:Flag proxy-mode="" unknown, assuming iptables proxy 原因分析: ipvsモードが正しく使用されていない 解決方法: マスターノードでkube-proxyの構成ファイルを編集し、modeをipvsに追加します。

kubectl edit cm kube-proxy -n kube-system

元のPODを削除し、kube-proxyのpodが自動的に再起動します

kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}

拡張

使用中にkubectlコマンドが補完できないことがわかりました。kubectlコマンドツールの使いやすさを向上させるために、kubectlコマンド補完ツールのインストールを紹介します。 1、bash-completionをインストールします:

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion

2、kubectlのcompletionをシステム環境に適用します:

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

簡易インストールガイドもあります(図文ビデオを組み合わせた):https://blog.csdn.net/java_wxid/article/details/128308271

インストール中に問題が発生した場合は、私にメッセージを送ってください。

タグ: Kubernetes containerd ansible CentOS Docker

7月4日 17:18 投稿