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..... 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 イメージが無効になったり互換性がなくなったりすることを心配する必要はありません。
|