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への影響

推薦する

Yardvps 生涯 50% オフ プロモーション

yardvps ではこれまでこのようなお得な割引コードを発行したことがないようです。今回は 5% 割...

クラウドネイティブアプリケーションを構築するために知っておくべきこと

情報の普及と消費のスピードの速さにより、多くの企業が事業運営の見直しを迫られています。 IDC は、...

初心者がウェブサイトのランキングと全体的な影響をどのように扱うかについての簡単な分析

はじめに: ウェブサイトの SEO プロモーションと最適化を行う際、一部のウェブマスターは、ウェブサ...

ウェブマスターツールを照会する際の「リンク」に関連するいくつかの問題

今日、初心者向けの QQ グループでチャットしていたところ、ウェブマスター ツールの使用に関して多く...

グーグル創業者がFTCの公聴会に出席すると報道、トップ弁護士を雇用

Google の共同創業者ラリー・ペイジとセルゲイ・ブリン(写真提供: テンセント テクノロジー)北...

中小企業の独立系電子商取引の活路

今年8月1日より、月間売上高が2万元を超えない小零細企業のうち、小規模増値税納税者と営業税納税者は、...

AWS がクラウドを活用した航空宇宙分野のイノベーションを推進する新たな航空宇宙事業部門を設立

世界は航空のエキサイティングで大胆な新時代を迎えています。新しい企業が航空宇宙事業に参入し、より多く...

データセンターが繁栄し続ける5つの理由

[[343429]] [51CTO.com クイック翻訳] 実践により、データセンターは、複雑なデジ...

【ASO実践】磨く必要もお金をかける必要もない、AppStoreでリアルなレビューを増やす6つのコツ!

業界がいかにレビューはASO最適化には役に立たないと広めたとしても、実際には重み付けをする際に、Ap...

過去7日間に見逃したかもしれないニュースはこちら

休暇は終わりました。クラスメイトの皆さん、現実の世界に戻ってきてください!過去7日間の休暇中、中国は...

クラウド導入を加速するHuayun Dataは、製造業の変革とアップグレードを支援します。

2019年4月12日、無錫情報化協会が主催し、華雲データテクノロジーサービス株式会社が主催する「クラ...

ウェブサイトの再設計でコンバージョン率を上げる方法

EuroCheapo は、ユーザーが安価でお得なホテル、航空券、レンタカーを検索して予約できるヨーロ...

「3つの心、1つの意図」はSEOの道を進むのに役立ちます

外はまた雨が降り始めました。私は立ち上がって窓の外を見ました。突然、私は武漢の SEO で 1 年間...