このタスクでは、クラスター内の特定のノードにポッドを直接割り当てることで、Kubernetes スケジューラーをバイパスする方法を検討します。これは、通常のスケジューリング プロセスを経ずにポッドを特定のノードで実行する必要がある特定のシナリオでは便利なアプローチとなります。
以前の投稿で説明したものと同様の KIND (Kubernetes in Docker) 構成で作成された Kubernetes クラスターが実行されていると仮定します。ここでは、kind-cka-cluster:
という名前のクラスターを作成しました。
kind create cluster --name kind-cka-cluster --config config.yml
KIND を使用したクラスターの作成については以前の投稿ですでに説明したため、それらの詳細については再度説明しません。
この新しいクラスターで使用可能なノードを確認するには、次のコマンドを実行します。
kubectl get nodes
次のような出力が表示されるはずです:
NAME STATUS ROLES AGE VERSION kind-cka-cluster-control-plane Ready control-plane 7m v1.31.0
このタスクでは、kind-cka-cluster-control-plane でポッドをスケジュールします。
次に、YAML 形式でポッド マニフェストを作成しましょう。ポッド構成の nodeName フィールドを使用すると、Kubernetes スケジューラーを完全にバイパスして、ポッドの正確なノードを指定できます。
node.yml:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kind-cka-cluster-control-plane
このマニフェストでは:
このアプローチはノード選択の直接的な方法であり、nodeSelector やアフィニティ ルールなどの他のメソッドをオーバーライドします。
Kubernetes ドキュメントによると:
「nodeName は、アフィニティや nodeSelector よりも直接的なノード選択形式です。nodeName は、Pod 仕様のフィールドです。nodeName フィールドが空でない場合、スケジューラは Pod を無視し、指定されたノード上の kubelet が配置を試みます。そのノード上のポッドでは、nodeName の使用は、nodeSelector またはアフィニティおよび反アフィニティ ルールの使用を無効にします。"
詳細については、ノード割り当てに関する Kubernetes ドキュメントを参照してください。
マニフェストの準備ができたら、それをクラスターに適用します。
kubectl apply -f node.yml
このコマンドは、nginx ポッドを作成し、それを kind-cka-cluster-control-plane ノードに直接割り当てます。
最後に、指定したノードでポッドが実行されていることを確認します。
kubectl get pods -o wide
出力により、nginx ポッドが kind-cka-cluster-control-plane:
で実際に実行されていることを確認できます。
kind create cluster --name kind-cka-cluster --config config.yml
これは、nodeName フィールドを設定することによって、Kubernetes スケジューラを正常にバイパスし、コントロール プレーン ノード上でポッドを直接スケジュールしたことを確認します。
新しく作成したクラスターのコントロール プレーン ノードにアクセスするには、次のコマンドを使用します。
kubectl get nodes
静的ポッドマニフェストを含むディレクトリに移動します:
NAME STATUS ROLES AGE VERSION kind-cka-cluster-control-plane Ready control-plane 7m v1.31.0
現在のマニフェストを確認します:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kind-cka-cluster-control-plane
kube-controller-manager を再起動するには、そのマニフェスト ファイルを一時的に移動します。
kubectl apply -f node.yml
再起動を確認したら、マニフェスト ファイルを元の場所に戻します:
kubectl get pods -o wide
これらの手順により、コントロール プレーンにアクセスし、静的ポッド マニフェストを操作してコントロール プレーン コンポーネントのライフサイクルを管理する方法を実証できました。
kube-controller-manager.yaml マニフェスト ファイルを一時的に /tmp に移動した後、kube-controller-manager が再起動したことを確認できます。以前の投稿で述べたように、私は k9s を使用しています。これにより再起動が明確に表示されますが、k9s を使用していない読者の場合は、次のコマンドを試してください
イベントの検査:
さらに情報を収集するには、次を使用します:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 28s 10.244.0.5 kind-cka-cluster-control-plane <none> <none>
出力の最後にあるイベントを探します。再起動が成功すると、次のようなイベントが表示されます:
docker exec -it kind-cka-cluster-control-plane bash
「Killing」、「Created」、および「Started」イベントの存在は、kube-controller-manager が停止され、その後正常に再起動されたことを示します。
タスクを完了し、ポッドの動作を確認したら、不要になったリソースをクリーンアップすることが重要です。これにより、整然とした環境が維持され、クラスター内のリソースが解放されます。
ポッドをリストする:
まず、クラスター内で実行されている現在のポッドを確認できます:
cd /etc/kubernetes/manifests
次のような出力が表示される場合があります:
ls
ポッドの説明:
特定のポッドに関する詳細情報を取得するには、describe コマンドを使用します。
mv kube-controller-manager.yaml /tmp
これにより、名前、名前空間、ノード、その他の構成など、ポッドに関する詳細が表示されます。
mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/
ポッドを削除します:
ポッドが不要になった場合は、次のコマンドを使用して安全に削除できます:
kubectl describe pod kube-controller-manager-kind-cka-cluster-control-plane -n kube-system
削除の確認:
削除コマンドを実行した後、ポッドを再度リストすることで、ポッドが削除されたことを確認できます。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Killing 4m12s (x2 over 8m32s) kubelet Stopping container kube-controller-manager Normal Pulled 3m6s (x2 over 7m36s) kubelet Container image "registry.k8s.io/kube-controller-manager:v1.31.0" already present on machine Normal Created 3m6s (x2 over 7m36s) kubelet Created container kube-controller-manager Normal Started 3m6s (x2 over 7m36s) kubelet Started container kube-controller-manager
nginx ポッドがリストに表示されなくなったことを確認します。
これらのクリーンアップ手順を実行すると、Kubernetes クラスターが整理され効率的に維持されるようになります。
このセクションでは、nginx イメージに基づいて 3 つのポッドを作成します。それぞれに一意の名前と、異なる環境を示す特定のラベル (env:test、env:dev、および env:prod) が付けられます。
ステップ 1: スクリプトを作成する
まず、ポッドを生成するコマンドを含むスクリプトを作成します。次のコマンドを使用してスクリプト ファイルを作成します:
kind create cluster --name kind-cka-cluster --config config.yml
次に、次のコードをファイルに貼り付けます:
kubectl get nodes
ステップ 2: スクリプトを実行可能にする
ファイルを保存した後、次のコマンドを使用してスクリプトを実行可能にします:
NAME STATUS ROLES AGE VERSION kind-cka-cluster-control-plane Ready control-plane 7m v1.31.0
ステップ 3: スクリプトを実行する
スクリプトを実行してポッドを作成します:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kind-cka-cluster-control-plane
ポッドの作成を示す出力が表示されます:
kubectl apply -f node.yml
ステップ 4: 作成されたポッドを確認する
スクリプトは、作成されたポッドのステータスを表示します。
kubectl get pods -o wide
この時点で、ラベルに基づいてポッドをフィルタリングできます。たとえば、env=dev ラベルを持つポッドを検索するには、次のコマンドを使用します。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 28s 10.244.0.5 kind-cka-cluster-control-plane <none> <none>
ポッドが実行されていることを確認する出力が表示されるはずです。
docker exec -it kind-cka-cluster-control-plane bash
以上がCKA フルコース 1 日の静的ポッド、手動スケジューリング、ラベル、Kubernetes のセレクターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。