環境準備
ローカル環境のオペレーティングシステムは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
インストール中に問題が発生した場合は、私にメッセージを送ってください。