技術共有

k8s クラスターのオフライン展開

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

K8s オフライン展開

環境

ここに画像の説明を挿入します

目標

k8s オフライン展開

ステップ

ドッカーをデプロイする

詳細については、記事「Docker のオフライン インストールとバックエンド プロジェクトのオフライン パッケージ化」を参照してください。
https://blog.csdn.net/qq_45371023/article/details/140279746?spm=1001.2014.3001.5501
使用されるすべてのファイルは次の場所にあります。
リンク: https://pan.baidu.com/s/10cb-dXkgdShdjPEBCyvTrw?pwd=fpuy
抽出コード: fpuy

cri_dockerd をインストールする

1. cri_dockerdをインストールする

rpm -ivh cri-dockerd-0.3.9-3.el8.x86_64.rpm
ここに画像の説明を挿入します

2. システムデーモンをリロードします → cri-dockerd が自動的に起動するように設定します → cri-dockerd を起動します

システムデーモンをリロードする

sudo systemctl daemon-reload
  • 1

cri-dockerd が自動的に起動するように設定する

sudo systemctl enable cri-docker.socket cri-docker
  • 1

cri-dockerdを起動する

sudo systemctl start cri-docker.socket cri-docker

sudo systemctl status cri-docker.socket

sudo systemctl status cri-docker
  • 1
  • 2
  • 3
  • 4
  • 5

ここに画像の説明を挿入します

問題: cri-docker の起動に失敗しました

ここに画像の説明を挿入します

測定:

方法 1: systemctl restart docker # docker を再起動

方法 2: docker をアンインストールして再インストールし、上記の手順を再度実行します。

*Kubernetesをインストールする

kubectlをインストールする

1.kubectlをインストールする

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
  • 1

2. インストールが完了したかどうかを確認します

kubectl version --client
  • 1

ここに画像の説明を挿入します

kubeadmをインストールする

3. ポートを開くか、ファイアウォールを閉じます (インストール プロセスをスムーズに行うため)。

ポートを開く(クラウドサーバー)

ポート6443を開く

sudo firewall-cmd --zone=public --add-port=6443/tcp --permanent
  • 1

ファイアウォールをリロードする

sudo firewall-cmd --reload
  • 1

開いているポートをすべて表示する

sudo firewall-cmd --zone=public --list-ports
  • 1

または、ファイアウォール (仮想マシン) をオフにします。

ファイアウォールをオフにする

sudo systemctl stop firewalld
  • 1

ファイアウォールの自動起動をオフにする

sudo systemctl disable firewalld
  • 1

4. SELinux を無効にします (コンテナーがシステム リソースにアクセスできることを確認します)。

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  • 1
  • 2

5. kubeadm、kubelet、kubectl をインストールする

3_yum_package の下にある関連するオフライン インストール パッケージを rpm 形式でダウンロードします。このコマンドを使用して、すべての rpm インストール パッケージをディレクトリにインストールします。

cd 3_yum_package && rpm -ivh *.rpm
  • 1

ここに画像の説明を挿入します

6. kubelet が自動的に起動するように設定する

sudo systemctl enable --now kubelet
  • 1

ここに画像の説明を挿入します

*k8sクラスターのデプロイ

上記の手順を完了すると、次の環境が完成します。

·異なる IP アドレスを持つ 2 つのサーバーまたは仮想マシンは相互に通信し、LAN の状態を維持できます。IP アドレスは 192.168 に設定されます。.34と192.168。.35

·コンテナ ランタイム (Docker+cri_dockerd) が両方のサーバーにインストールされており、kubernetes コンポーネント kubectl、kubeadm、および kubelet がインストールされています。

環境整備

7. スワップパーティションを閉じます。一時的なシャットダウンと永続的なシャットダウンに分けられます。頻繁にオン/オフが行われるため、永続的なシャットダウンが推奨されます。一方、クラウド環境では、一時的なシャットダウンが推奨されます。

スワップパーティションを一時的に閉じる

swapoff -a
  • 1

スワップ パーティションを永続的に閉じるには、fstab 内のスワップを含む行をコメント アウトします。

vi /etc/fstab
  • 1

# /dev/mapper/centos-swap swap スワップ デフォルト 0 0

実際のデプロイメントでは、再起動によって cri-dockerd の状態が変化する可能性がありますが、その理由は、docker を再インストールすることで可能です。 cri-dockerd を実行し、cri-dockerd を起動して cri -dockerd ステータスを正常にします。

リブート

8. k8s オペレーティング環境として runc をインストールします。

runc をインストールする

sudo install -m 755 runc.amd64 /usr/local/bin/runc
  • 1

# インストールが成功したかどうかを確認する

runc -v
  • 1

ここに画像の説明を挿入します

9. Docker と cri-dockerd は国内イメージ アクセラレーションをセットアップします (このフォルダーで使用される次のソフトウェア パッケージの名前にはミラー アドレスがあるため、kubectl がインターネットにソフトウェア パッケージのプルを要求したり、後でローカル ミラーを無視したりしないように、ローカル エリア ネットワーク上でも対応するミラー アクセラレーションを構成することをお勧めします。インストールが完了しました。

sudo tee /etc/docker/daemon.json <<-'EOF'

{

 "registry-mirrors": ["https://tsvqojsz.mirror.aliyuncs.com"]

}

EOF

# 找到第10行

vi /usr/lib/systemd/system/cri-docker.service

# 修改为ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Docker コンポーネントを再起動します

systemctl daemon-reload && systemctl restart docker cri-docker.socket cri-docker
  • 1

# Docker コンポーネントのステータスを確認する

systemctl status docker cir-docker.socket cri-docker
  • 1

10. ホスト名とホストを確認する

マスターノード

ホスト名は k8s-master です

vi /etc/hostname
  • 1

ドメイン名のマッピングを追加する

echo "192.168.**.35 k8s-slave01">> /etc/hosts
  • 1

他のノード

ホスト名はk8s-slave01

vi /etc/hostname
  • 1

ドメイン名のマッピングを追加する

echo "192.168.**.34 k8s-master" >> /etc/hosts
  • 1

11. IPv4 を転送し、iptables にブリッジ フローを確認させます

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf

overlay

br_netfilter

EOF

 

sudo modprobe overlay

sudo modprobe br_netfilter
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

必要な sysctl パラメータを設定します。このパラメータは再起動後も保持されます。

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-iptables = 1

net.bridge.bridge-nf-call-ip6tables = 1

net.ipv4.ip_forward          = 1

EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

#再起動せずに sysctl パラメータを適用する

sudo sysctl --system

 

lsmod | grep br_netfilter

lsmod | grep overlay

 

sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

# init 中に iptables エラーがまだ表示される場合は、次を実行してください。

echo "1">/proc/sys/net/bridge/bridge-nf-call-iptables

echo "1">/proc/sys/net/ipv4/ip_forward
  • 1
  • 2
  • 3

コントロールプレーンノード/マスターの初期化

12. マスターノードの初期化

初期化の前に、kubeadm config イメージを通じて初期化に必要な docker イメージを取得する必要があります。

ここに画像の説明を挿入します

イメージ dockerload -i **.tar をインストールします。

関連するイメージ ファイルは 5_kubeadm-images に存在します。

初期化を実行します。

kubeadm init --node-name=k8s-master list--image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.**.34 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
  • 1

–image-repository=registry.aliyuncs.com/google_containers # ダウンロードしたコンテナ イメージ ソースを Alibaba Cloud に置き換えます。そうしないと、ネットワーク上の理由によりイメージをプルダウンできず、実行は確実に失敗します。

–cri-socket=unix:///var/run/cri-dockerd.sock # これは、指定されたコンテナー ランタイムです。これは、containerd も Docker のコンポーネントの 1 つであるため、Kubernetes の初期化の実行時に Docker をダウンロードすることになります。複数のコンテナー ランタイム環境が存在することが検出された場合は、手動で 1 つを選択する必要があります。ここでは、containerd が実際には Docker よりもはるかに軽量であることもわかります。

–apiserver-advertise-address=192.168.56.50 # API サーバーのブロードキャスト アドレスをここで選択します。API サーバーを他のノードに設定したくない場合は、別のアドレスに変更しないでください。

–pod-network-cidr=10.244.0.0/16 # ポッド ネットワークで使用できる IP アドレス範囲を指定します。まだ不明な場合は、無視してこの値を使用できます。

–service-cidr=10.96.0.0/12 # サービスの仮想 IP アドレスに追加の IP アドレス セグメントを指定します。まだ不明な場合は、この値をそのまま使用できます。

問題:cordns:v1.10.1 チェックが存在しません。実際、cordns:v1.10.1 はすでに存在しますが、cordns:1.10.1 です。

ここに画像の説明を挿入します

対策:コードのタグを修正。

docker tag registry.aliyuncs.com/google_containers/coredns:1.10.1 registry.aliyuncs.com/google_containers/coredns:v1.10.1
  • 1

初期化コマンドを再実行する

ここに画像の説明を挿入します

kubeadm join の下の情報を記録します。これは、ノード結合に必要です。上記の例に関連する情報は次のとおりです。

kubeadm join 192.168.51.34:6443 --token 1qtv3k.p8tfvdcds6x5ichf 

​    --discovery-token-ca-cert-hash sha256:90afb5751086aabf7ac90d9e77a946eb768d47ffaaead62243264641954a5e26
  • 1
  • 2
  • 3

忘れた場合は、kubeadm token list を使用してクエリを実行し、トークンは 24 時間存在します。kubeadm token create --print-join-command を再作成し、kubeadm token delete tokenid を使用して削除します。

非rootユーザーは実行してください

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 1
  • 2
  • 3
  • 4
  • 5

root ユーザーが直接実行する

一時的に有効になり、再起動すると無効になります。

export KUBECONFIG=/etc/kubernetes/admin.conf 
  • 1

永続的に有効になります。kubeadm restart および init を再度実行した後に、このコマンドを再度実行する必要はありません。

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile 
  • 1

永続的に有効なコマンドを実行した後、それを有効にするためにソースを設定する必要があります。

source ~/.bash_profile
  • 1

設定が有効かどうかを確認する

echo $KUBECONFIG 

/etc/kubernetes/admin.conf
  • 1
  • 2
  • 3

13. ネットワークプラグインのインストールと構成

ここでは、flannel を使用して、kube-flannel.yml ファイルをサーバーにダウンロードしてアップロードします。

関連するイメージをサーバーにアップロードしてインストールします。 kube-flannel.yml と画像ファイルは 6_kube-flannel に存在します。

ネットワークカードの問い合わせ

ifconfig

ここに画像の説明を挿入します

kube-flannel.yml はデフォルトで enp1s0 ネットワーク カードを検索します。この例では、34 ネットワーク カードは enp1s0 であり、35 ネットワーク カードは enp4s0 です。

// 35 の kube-flannel.yml を変更し、-iface=enp0s3 を追加して指定します (ここでの enp0s3 は、上のボックス内の部分など、IP に対応するネットワーク カードです)。パラメータの場所は次のとおりです。

container:

  ......

  command:

  - /opt/bin/flanneld

  arg:

  - --ip-masq

  - --kube-subnet-mgr

  - --iface=enp4s0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Kubernetes 用のフランネル ネットワーク プラグインの構成

kubectl apply -f /data/k8s/6_kube-flannel/kube-flannel.yml
  • 1

ここに画像の説明を挿入します

cat /run/flannel/subnet.env
  • 1

# そのようなファイルまたはフォルダーがない場合は、手動で作成する必要があります。内容は以下と同じです。

FLANNEL_NETWORK=10.244.0.0/16

FLANNEL_SUBNET=10.244.0.1/24

FLANNEL_MTU=1450

FLANNEL_IPMASQ=true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

ノードノードがマスターに参加

14. ノードノードがマスターに参加します

14.1. マスターノードマシンの /etc/kubernetes/admin.conf をスレーブノードマシンにコピーします。

scp /etc/kubernetes/admin.conf 192.168.56.51:/etc/kubernetes/
  • 1

# 永続的に有効にするには、ここで admin.conf を環境変数に追加することを忘れないでください。

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

source ~/.bash_profile
  • 1
  • 2
  • 3

コピー中に問題が発生した場合:

192.168.55.187 の ECDSA ホスト キーが変更されたため、厳密なチェックを要求しました。ホスト キーの検証に失敗しました。

修復するには次のステートメントを実行します

ssh-keygen -R 192.168.55.187
  • 1

14.2. join コマンドを実行します (マスターノードが正常に初期化された後、join コマンドが実行されます)

例えば:

kubeadm は 192.168.51.34:6443 に参加します --token by7t4x.da3f98dzrvjylykz --discovery-token-ca-cert-hash sha256:90afb5751086aabf7ac90d9e77a946eb768d47ffaaead62243264641954a5e26 --cri-socket unix:///var/run/cri-dockerd.sock

ここに画像の説明を挿入します

14.3. kubectl get ノードを実行する

ここに画像の説明を挿入します

k8s クラスターが正常にデプロイされました。 ! !

質問

質問 1

kubectl ノードを取得する

ここに画像の説明を挿入します

対策: スワップが閉じているかどうかを確認し、ファイアウォールがポート 6443 を開いているかどうかを確認します。

スワップを閉じる

ここに画像の説明を挿入します

ファイアウォールを一時的に無効にする

ここに画像の説明を挿入します

成功

ここに画像の説明を挿入します

質問2

kubectl ノードを取得する

k8s ノードをクラスターに追加した後、ノードのステータスが NotReady であることを確認します。

ここに画像の説明を挿入します

測定:

systemctl restart kubelet.service

systemctl restart docker.service
  • 1
  • 2
  • 3

kubeletとdockerを再起動します

ここに画像の説明を挿入します

質問 3

kubeadm は 192.168.51.34:6443 に参加します --token l2qlvh.and3fnjmzecueu9h --discovery-token-ca-cert-hash sha256:90afb5751086aabf7ac90d9e77a946eb768d47ffaaead62243264641954a5e26 --cri-socket unix:///var/run/cri-dockerd.sock

k8s クラスターに子ノードを追加すると、初期化タイムアウトが発生します。

ここに画像の説明を挿入します
測定:

kubeadm reset -f --cri-socket unix:///var/run/cri-dockerd.sock
  • 1

ここに画像の説明を挿入します

成功

ここに画像の説明を挿入します

ここに画像の説明を挿入します

質問4

マスターノードマシンの/etc/kubernetes/admin.confをスレーブノードマシンにコピーします。

scp /etc/kubernetes/admin.conf 192.168.55.187:/etc/kubernetes/

ファイルのコピーが失敗した場合、次のようなエラー メッセージが表示されます。

192.168.55.187 の ECDSA ホスト キーが変更されたため、厳密なチェックを要求しました。

ホストキーの検証に失敗しました。

修復するには次のステートメントを実行します

ssh-keygen -R 192.168.55.187
  • 1

クイック削除

kubectl delete node k8s-slave01
kubectl delete node k8s-slave02
kubectl delete node k8s-master
  • 1
  • 2
  • 3

スレーブノード

rm -rf /etc/kubernetes/*
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
  • 1
  • 2

マスターノード

rm -rf /etc/kubernetes/*
rm -rf ~/.kube/*
rm -rf /var/lib/etcd/*
kubeadm reset -f --cri-socket unix:///var/run/cri-dockerd.sock
  • 1
  • 2
  • 3
  • 4

必要に応じて、k8s クラスターを再初期化します。

kubeadm init --node-name=k8s-master --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.51.34 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
  • 1

マスターノード

kubectl apply -f /data/k8s/6_kube-flannel/kube-flannel.yml
kubectl get pod -A
  • 1
  • 2

マスターノード

scp /etc/kubernetes/admin.conf 192.168.51.35:/etc/kubernetes/
scp /etc/kubernetes/admin.conf 192.168.51.36:/etc/kubernetes/
  • 1
  • 2

スレーブノード

kubeadm join 192.168.51.34:6443 --token 1k9kdy.dvn2qbtd7rjar1ly 
       --discovery-token-ca-cert-hash sha256:ff90d8ed41ae1902a839194f179a1c3ba8374a5197ea3111e10e5ca1c09fa442 --cri-socket unix:///var/run/cri-dockerd.sock
  • 1
  • 2
kubectl get pod -A
kubectl get nodes
  • 1
  • 2