Kubernetes v1.25.0 クラスタ構築の実践事例(新バージョンには Docker コンテナ ランタイムが含まれています)

Kubernetes v1.25.0 クラスタ構築の実践事例(新バージョンには Docker コンテナ ランタイムが含まれています)

1. はじめに

k8s をデプロイする方法は、kubeadm、kind、minikube、Kubespray、kops など、数多くあります。この記事では、クラスターを構築するために公式に推奨されている kubeadm の方法を紹介します。

2. インストール手順

2 台の仮想マシン (IP は独自のネットワーク環境に応じて設定されます) (マスター/ノード)。

ip

ホスト名

192.168.1.100

マスター

192.168.1.101

ノード1

ファイアウォール(マスター/ノード)を無効にします。

 systemctl stop firewalld systemctl disable firewalld

selinux (マスター/ノード) を無効にします。

 setenforce 0 # 临时关闭sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久关闭

スワップを無効にします(マスター/ノード)。

 swapoff -a # 临时关闭;关闭swap主要是为了性能考虑free # 可以通过这个命令查看swap是否关闭了sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭

fstab を開き、次の行をコメント アウトします。

UUID=c83b0fb3-eb59-4b1e-bca0-a1731159c553 スワップ スワップ デフォルト 0 0

fstab 設定を永続的に有効にするには、システムを再起動する必要があります。すぐに再起動しないようにするには、まず swapoff -a を使用して一時的に無効にします。その後のシステムの再起動は永続的に有効になります。

無料 -m

ホスト名と IP (マスター/ノード) の関係を追加します。

 $ vim /etc/hosts #添加如下内容: 192.168.1.100 master 192.168.1.101 node1 #保存退出

ホスト名(マスター/ノード)を変更します。

 #k8s-master [root@localhost ~] hostname localhost.localdomain [root@localhost ~] hostname master ##临时生效[root@localhost ~] hostnamectl set-hostname master ##重启后永久生效#k8s-node1 [root@localhost ~] hostname localhost.localdomain [root@localhost ~] hostname node1 ##临时生效[root@localhost ~] hostnamectl set-hostname node1 ##重启后永久生效

ブリッジのセットアップ(マスター/ノード)。

 $ cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF $ sysctl --system
  • 後で多くのエラーを回避するには、上記の手順に従うのが最善です。

docker(マスター/ノード)をインストールします。
dokcer がすでにインストールされている場合は、再度インストールする必要はなく、この手順を無視できます。

 $ yum -y install docker-ce # 设置开机启动$ systemctl enable docker # 启动docker $ systemctl start docker

Kubernetes用の国内Alibaba Cloud YUMソフトウェアソース(マスター/ノード)を追加します。

 cat > /etc/yum.repos.d/kubernetes.repo << EOF [k8s] name=k8s enabled=1 gpgcheck=0 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ EOF

kubeadm、kubelet、kubectl (マスター/ノード) をインストールします。

 #版本可以选择自己要安装的版本号$ yum install -y kubelet-1.25.0 kubectl-1.25.0 kubeadm-1.25.0 # 此时,还不能启动kubelet,因为此时配置还不能,现在仅仅可以设置开机自启动$ systemctl enable kubelet

コンテナ ランタイム (マスター/ノード) をインストールします。

k8s バージョンが 1.24 未満の場合、この手順は無視できます。

バージョン 1.24 は Docker エンジンと直接互換性がないためです。

Docker Engine は、コンテナ ランタイムが Kubernetes で動作するために必要な CRI を実装していません。この目的のために、追加のサービス cri-dockerd をインストールする必要があります。 cri-dockerd は、kubelet バージョン 1.24 から削除された従来の組み込み Docker エンジン サポートに基づくプロジェクトです。

現在の最新の k8s バージョンは 1.28.x です。

ポッドを実行できるようにするには、クラスター内の各ノードにコンテナ ランタイムをインストールする必要があります。 Kubernetes の新しいバージョンでは、Container Runtime Interface (CRI) に準拠したランタイムを使用する必要があります。

以下は、Kubernetes における一般的なコンテナ ランタイムの使用法です。

  • コンテナ
  • クリオー
  • Docker エンジン
  • ミランティス コンテナ ランタイム

以下は、cri-dockerd アダプターを使用してDocker Engine を Kubernetes と統合する方法です。

cri-dockerd をインストールします。

 wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd-0.2.6.amd64.tgz tar -xf cri-dockerd-0.2.6.amd64.tgz cp cri-dockerd/cri-dockerd /usr/bin/ chmod +x /usr/bin/cri-dockerd

スタートアップ サービスを構成します。

 cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service [Unit] Description=CRI Interface for Docker Application Container Engine Documentation=https://docs.mirantis.com After=network-online.target firewalld.service docker.service Wants=network-online.target Requires=cri-docker.socket [Service] Type=notify ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target EOF

主に次のコマンド: ExecStart=/usr/bin/cri-dockerd --network-plugin=cni。
--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 です。

pspause のバージョンは、kubeadm config images list で確認できます。

ソケットファイルを生成します。

 cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket [Unit] Description=CRI Docker Socket for the API PartOf=cri-docker.service [Socket] ListenStream=%t/cri-dockerd.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target EOF

cri-docker サービスを起動し、起動時に開始するように設定します。

 systemctl daemon-reload systemctl enable cri-docker systemctl start cri-docker systemctl is-active cri-docker

Kubernetesをデプロイする  (マスター)  ノードは kubeadm init を実行する必要はありません。

次の内容を含む kubeadm.yaml ファイルを作成します。

 kubeadm init \ --apiserver-advertise-address=192.168.1.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.25.0 \ --service-cidr=10.10.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=all \ --cri-socket unix:///var/run/cri-dockerd.sock

--apiserver-advertise-address=マスターノードの IP。

--pod-network-cidr=10.244.0.0/16 は、次の kube-flannel.yml の IP と一致する必要があります。つまり、10.244.0.0/16 を使用し、変更しないでください。
成功すると、最後の出力情報は次のようになります。

 Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.9.2.94:6443 --token xhurmz.i2tnhhuw7c0ecuw6 \ --discovery-token-ca-cert-hash sha256:b3683deac5daa34a5778ede0ac0210bfbefce78a380c738aac7c2304c1cb1e4f

これは kubeadm init を通じてインストールされるため、実行後に対応する docker イメージがダウンロードされます。一般的に、コンソールが長時間動かなくなることがわかります。現在、画像をダウンロード中です。 docker images によって新しいイメージが追加されたかどうかを確認できます。

kubectl ツールを使用します。 kubeadm がインストールされると、コンソールで次のコマンドを実行するように求められます。コマンド(つまり、手順 11 の最後のコンソール出力)に従います(マスター/ノード)。

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

それから:

 vim /etc/profile #加入以下变量export KUBECONFIG=/etc/kubernetes/admin.conf source /etc/profile

kubectl コマンドをテストします。

 [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 23m v1.25.0

一般的に、ステータスは最初は NotReady になりますが、プログラムはまだ起動中である可能性があり、しばらくすると Ready になります。

Pod ネットワーク プラグイン フランネル (マスター/ノード) をインストールします。

 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

エラー: サーバーへの接続
http://raw.githubusercontent.com が拒否されました - 正しいホストまたはポートを指定しましたか?

理由: 外部リソースにアクセスできません。
解決策: アクセス可能な IP アドレスを使用してホストを構成します。

 vim /etc/hosts #在/etc/hosts增加以下这条199.232.28.133 raw.githubusercontent.com

上記のコマンドを再度実行すると、正常にインストールされます。

ノードがマスター (ノード) に参加します。ステップ 12 コンソールにコンテンツが出力されます。

 kubeadm join 10.9.2.94:6443 --token ebe5w8.hfd3b59u9ww1r966 \ --discovery-token-ca-cert-hash sha256:b3683deac5daa34a5778ede0ac0210bfbefce78a380c738aac7c2304c1cb1e4f \ --ignore-preflight-errors=all \ --cri-socket unix:///var/run/cri-dockerd.sock

--preflight-errors をすべて無視する \

--cri-socket unix:///var/run/cri-dockerd.sock

次の 2 行を追加する必要があります。追加しないと、さまざまなエラーが報告されます。

[プリフライト] プリフライトチェックの実行

エラー実行フェーズのプリフライト: [プリフライト] 致命的なエラーが発生しました:

[ERROR CRI]: コンテナ ランタイムが実行されていません: 出力: time="2023-08-31T16:42:23+08:00" level=fatal msg="サービス接続の検証: エンドポイント \"unix:///var/run/cri-dockerd.sock\\" に対して CRI v1 ランタイム API が実装されていません": rpc エラー: コード = 実装されていません desc = 不明なサービス runtime.v1.RuntimeService"

エラー: 終了ステータス 1

[プリフライト] 何をしているのかわかっている場合は、`--ignore-preflight-errors=...` を使用して致命的ではないチェックを行うことができます。

このエラーのスタックトレースを表示するには、--v=5以上で実行します。

ホスト上に複数の CRI エンドポイントが見つかりました。 kubeadm 構成ファイルの 'criSocket' フィールドを設定して、どちらを使用するか定義してください: unix:///var/run/containerd/containerd.sock、unix:///var/run/cri-dockerd.sock

このエラーのスタックトレースを表示するには、--v=5以上で実行します。

マスターノードで表示できます。

 kubectl get nodes

この時点で、k8s クラスター環境全体が基本的に構築されました。

知らせ

  • インストールするときは、インストールするプログラムのバージョンに注意してください。
  • k8s コンポーネントも docker コンテナの形式で存在するため、多くの docker イメージがダウンロードされます。
  • 通常、インストールは成功せず、多くの問題が発生します。ログを追跡するには、tailf /var/log/messages を使用します。
  • 複数のマシンのシステム時刻を同期させるのが最適です。ノード通信におけるトークンも時間に関係しています。

3. 関連ノート

  • kubeadm init 後、K8S は kubeadm join を記録しません。クエリを実行するには?
 #再生成一个token即可kubeadm token create --print-join-command #下在的命令可以查看历史的token kubeadm token list
  • kubeadm join が失敗し、ノードに再参加したい場合はどうすればよいですか?
 #先执行kubeadm -y reset #再执行kubeadm join xx.....
  • kubeletを再起動する
systemctl daemon-reload systemctl restart kubelet
  • クエリ
#查询节点kubectl get nodes #查询pods 一般要带上"-n"即命名空间。不带等同-n dafault kubectl get pods -n kube-system

IV.関連する問題

k8s は docker を「放棄」しますか?

当時は「k8s が docker を放棄した」という解釈が飛び交い、docker は死んだという記事も多かったと記憶しています。その後、Docker が完全に放棄されたわけではないが、コンテナ ランタイムとしての Docker のサポートは削除されたという意見も出ました。

  • k8s が削除したのは、実際には dockershim です。これは、kubelet と docker 間のアダプターであり、docker のインターフェースを k8s に必要な CRI (Container Runtime Interface) に変換するために使用されます。これは、k8s アーキテクチャを簡素化し、パフォーマンスとセキュリティを向上させ、より多くのコンテナ ランタイムをサポートするために行われます。
  • K8s は Docker を完全に放棄したわけではありませんが、コンテナ ランタイムとしての Docker のサポートを放棄しました。つまり、k8s はコンテナの作成と実行に docker を使用しなくなり、containerd や CRI-O123 などの他の CRI 準拠ランタイムを使用するようになります。その理由は、docker が CRI 標準に準拠しておらず、k8s API に適応するために dockershim と呼ばれる中間層を必要とするためです。
  • k8s から Docker を削除するということは、Docker が役に立たなくなるということ、あるいは Docker を開発ツールとして使用できない、または使用すべきではないということを意味するものではありません。 Docker はコンテナ イメージを構築するための非常に便利なツールであり、生成されるイメージは OCI (Open Container Initiative) 標準に準拠しています。つまり、Docker で構築されたイメージは、Kubernetes 内の他のコンテナ ランタイムでも問題なく動作します。したがって、Docker イメージが無効になったり互換性がなくなったりすることを心配する必要はありません。

<<:  Douyin のクラウドネイティブ ベクトル データベースが「非主流」から「ニューノーマル」へと進化

>>:  クラウド市場の7つのトレンドとITへの影響

推薦する

2019年世界電子商取引市場トップ10成長トレンドレポート

電子商取引業界の状況は急速に変化しており、まさに一長一短です。毎年もたらされる新たな変化の一部は、販...

国内のウェブサイトは深刻なユーザーセキュリティ問題を抱えており、出会い系サイトの保護は最も弱い

中国ソフトウェアテストセンターが29日に発表した「ウェブサイト利用者のパスワード処理の安全性に関する...

クラウド コンピューティング市場での今後 10 年間の競争に勝つにはどうすればよいでしょうか?

[51CTO.com からのオリジナル記事] コスト削減と効率性向上の利点により、クラウド コンピュ...

Argo ロールアウトによるプログレッシブ リリース

Argo Rollouts は、Kubernetes Operator 実装であり、ブルーグリーン、...

Baidu Shareは次のBaidu Knowsになるかもしれない

Baidu を注意深く観察すると、最近、Google+1 や Facebook の「いいね!」に似た...

リンクを含むブログ記事を取得するためのいくつかの重要なポイント

グループ内で「私のブログは一度も掲載されません。リンクがなくてもすぐに掲載されるのに、リンクが張られ...

エッジコンピューティング: なぜそれが重要なのか、そしてビジネスにどのような影響を与えるのか

要点:サプライチェーンの遅延とチップ不足により IoT 市場全体の成長は鈍化していますが、IoT デ...

仕事の悪夢からすぐに脱出するためのロードマップ

まず前提、つまり仮定があります...仕事があなたにとって悪夢であると仮定します...そうでない場合は...

ソフト商品のプロモーションはマーケティングの新たな人気となり、企業の発展を加速し、評判を獲得する

インターネットの急速な普及と発展に伴い、より多くの企業がオンライン チャネルを通じて自社の製品やブラ...

クラウドコンピューティングとエッジコンピューティング

クラウド コンピューティングとエッジ コンピューティングの違いについて議論する際には、データ処理の実...

分類情報ウェブサイトは7年目の痒みを経験している。トラフィックは減少し、企業は逃げ出している。

南都地図:陳庭最盛期には2,000近くの分類情報ウェブサイトが存在したが、現在残っているのはほんの数...

地域ポータルサイトの過去、現在、そして未来

ローカルポータルのトラフィックはどのくらいの割合を占めているのでしょうか? インターネット業界の分析...

インスタント食品安全プラットフォームについてどう思いますか?

年末が近づくにつれ、食品の安全性が再びホットな話題の一つになっています。人々は健康に有害なあらゆる種...

2019年中国モバイルインターネット発展レポート!

モバイルインターネットインフラは改善を続け、モバイルインターネットトラフィック消費は増加し続け、モバ...