K8Sの5つのコントローラーの紹介と使用

K8Sの5つのコントローラーの紹介と使用

k8sのコントローラータイプ

Kubernetes には、ステートマシンに相当する多くの組み込みコントローラーがあり、Pod の特定の状態と動作を制御するために使用されます。

デプロイメント: ステートレスなサービスデプロイメントに適しています

StatefullSet: ステートフルサービスの展開に適しています

DaemonSet: 一度デプロイすると、すべてのノードがデプロイされます。たとえば、いくつかの一般的なアプリケーション シナリオは次のようになります。

各ノードで glusterd や ceph などのクラスター ストレージ デーモンを実行します。

各ノードでfluentd、logstashなどのログ収集デーモンを実行します。

各ノードでPrometheus Node Exporterなどの監視デーモンを実行します。

ジョブ: 1回限りの実行タスク

Cronjob: タスクの定期的な実行

一般に、K8S には、ステートレス アプリケーション、ステートフル アプリケーション、ガード アプリケーション、バッチ アプリケーションの処理に対応する 5 つのコントローラーがあります。

ポッドとコントローラの関係

コントローラ: クラスタ上のコンテナを管理および実行するオブジェクトは、ラベルセレクタを通じて関連付けられます。

Pod はコントローラーを使用して、スケーリングやアップグレードなどのアプリケーションの操作とメンテナンスを実装します。

デプロイメント(ステートレスアプリケーション)

応用シナリオ: Webサービス

Deployment は中国語で配備とスケジュールを意味します。Deployment を通じて、RS (ReplicaSet) を操作することができます。yml ファイルによる宣言として簡単に理解できます。Deployment ファイルでは、Pod の数、更新方法、使用するイメージ、リソース制限などを定義できます。ステートレスアプリケーションはデプロイメントを使用して作成されます

Deployment オブジェクトを使用すると、次のことが簡単に実行できます。

  • レプリカセットとポッドを作成する
  • ローリングアップグレード(古いサービスを停止せずにアップグレードする)とロールバック(アプリケーションを以前のバージョンに戻す)
  • スムーズな拡大と縮小
  • デプロイメントの一時停止と再開
デプロイメントの作成 [root@master shuai]# vim nginx-delpoy.yaml

APIバージョン: アプリ/v1
種類: デプロイメント「定義はデプロイメントです」
メタデータ:
  名前: nginx-deployment
  ラベル:
    アプリ: nginx
仕様:
  レプリカ: 3 「レプリカの数は 3 です」
  セレクタ:
    一致ラベル:
      アプリ: nginx
  テンプレート:
    メタデータ:
      ラベル:
        アプリ: nginx
    仕様:
      コンテナ:
      - 名前: nginx
        イメージ: nginx:1.15.4
        ポート:
        - コンテナポート: 80


「リソースを作成する」
[root@master shuai]# kubectl apply -f nginx-delpoy.yaml 
デプロイメント.apps/nginx-deployment が作成されました

//レプリカセットはレプリカのバージョンと数を制御します。ロールバックはこれを通じて実現されます。'//すべてのリソースを表示'
[root@master shuai]# kubectl すべて取得
名前 準備完了 ステータス 再起動 年齢
pod/nginx-deployment-d55b94fd-cndf2 1/1 実行中 0 3分31秒
pod/nginx-deployment-d55b94fd-ghlwk 1/1 実行中 0 3分31秒
pod/nginx-deployment-d55b94fd-tm4sw 1/1 実行中 0 3分31秒
pod/pod-example 1/1 実行中 0 10h

名前 タイプ クラスター IP 外部 IP ポート 年齢
service/kubernetes ClusterIP 10.0.0.1 <なし> 443/TCP 3d6h

名前 希望 現在の状況 利用可能 年齢
デプロイメント.apps/nginx-デプロイメント 3 3 3 3 3分31秒

名前 希望 現在の年齢
レプリカセット.apps/nginx-deployment-d55b94fd 3 3 3 3分31秒

コントローラ情報を表示する kubectl deit Deployment/nginx-deployment
.....情報は省略.....
戦略:
    rollingUpdate: 「バージョン更新はローリング更新メカニズムです」
      maxSurge: 25% 「更新コピーの最大数は25%、最大拡張は125%です」 「コピー数を維持するために、同時に何パーセントの増加分を破壊する必要がありますか」
      maxUnavailable: 25% '削除されるコピーの最大数は 25%、最大削減率は 75% です'
    タイプ: ローリングアップデート
...情報は省略されています....


「kubectl describe deploy nginx-deployment」を実行しても表示できます。

....情報は省略....
RollingUpdateStrategy: 最大 25% 利用不可、最大 25% サージ

過去のバージョンを表示 [root@master shuai]# kubectl rollout history deploy/nginx-deployment
デプロイメント拡張機能/nginx-デプロイメント 
改訂変更理由
1 <なし> '//ここには 1 つだけあります。これは、ローリング アップデートがまだ行われていないことを証明しています'

国家と無国籍の特徴

ステートレス サービスの特徴:

1) デプロイメントでは、すべてのポッドが同じであると想定されます

2) 注文要件を考慮する必要がない

3) どのノードで実行するかを考える必要がない

4) 容量は自由に拡張または縮小可能

ステートフル サービスの特徴:

1) インスタンス間には違いがあります。各インスタンスには、etcd や zookeeper などの独自の一意性とメタデータがあります。

2) 外部ストレージに依存するインスタンスとアプリケーション間の非対称関係。

展開の更新

nginx ポッドで元の nginx イメージではなく nginx:1.9.1 イメージを使用するようにしたい場合は、次のコマンドを実行します。[root@master ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deploy.apps/nginx-deployment イメージが更新されました

または、editコマンドを使用してデプロイメントを編集し、イメージをnginxからnginx:1.9.1に書き換えることもできます。
kubectl でデプロイメント/nginx-deployment を編集します。

更新の進行状況を表示する[root@master ~]# kubectl rollout status deployment/nginx-deployment
デプロイメント「nginx-deployment」のロールアウトが完了するのを待機しています: 1 つの古いレプリカが終了を保留中です...
デプロイメント「nginx-deployment」のロールアウトが完了するのを待機しています: 1 つの古いレプリカが終了を保留中です...
デプロイメント「nginx-deployment」が正常にロールアウトされました

Deployment が更新されると、新しい ReplicaSet が作成され、新しい ReplicaSet 内の Pod が指定されたレプリカ数まで徐々に拡張され、古い ReplicaSet は徐々に 0 まで削減されます。そのため、アップデート時に古いサービスが停止しないように常に確認することが可能であり、ローリングアップデートとなります。

デプロイメントのロールバック

上記のように Deployment を更新した後、nginx:1.9.1 イメージがあまり安定していないことがわかったので、nginx:1.7.9 に戻すことにしました。このとき、Deployment ファイルを手動で変更する必要はなく、Deployment のロールバック機能を使用します。

ロールアウト履歴コマンドを使用して、デプロイメントのリビジョンを表示します。

[root@master ~]# kubectl ロールアウト履歴 デプロイメント/nginx-deployment
デプロイメント.apps/nginx-デプロイメント 
改訂変更理由
1 kubectl create --filename=deploy.yml --record=true
2 kubectl create --filename=deploy.yml --record=true

デプロイメントの作成時に --recorded パラメータを使用してコマンドを記録したので、各リビジョンの変更を簡単に確認できます。

単一のリビジョンに関する詳細情報を表示するには:

[root@master ~]# kubectl ロールアウト履歴のデプロイメント/nginx-deployment --revision=2
リビジョン #2 の deployment.apps/nginx-deployment
ポッドテンプレート:
  ラベル: app=nginx
        ポッドテンプレートハッシュ=658d7f4b4b
  注釈: kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true
  コンテナ:
   nginx:
    イメージ: nginx:1.9.1
    ポート: 80/TCP
    ホストポート: 0/TCP
    環境: <なし>
    マウント: <なし>
  ボリューム: <なし>

ロールアウト元に戻すコマンドを使用して、前のリビジョンにロールバックできます。
[root@master ~]# kubectl rollout undo デプロイメント/nginx-deployment
デプロイメント.apps/nginx-deployment がロールバックされました

[root@master ~]# kubectl デプロイメント/nginx-deployment を説明します
名前: nginx-deployment
名前空間: デフォルト
作成日時: 2021年12月24日(金) 22:24:10 +0800
ラベル: <なし>
注釈:deployment.kubernetes.io/revision: 3
                        kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true
セレクター: app=nginx
レプリカ: 希望 3 個 | 更新 3 個 | 合計 3 個 | 使用可能 3 個 | 使用不可 0 個
戦略タイプ: ローリングアップデート
最小準備秒数: 0
RollingUpdateStrategy: 最大 25% が利用不可、最大 25% が急増
ポッドテンプレート:
  ラベル: app=nginx
  コンテナ:
   nginx:
    画像: nginx
    ポート: 80/TCP
    ホストポート: 0/TCP
    環境: <なし>
    マウント: <なし>
  ボリューム: <なし>

–to-revision パラメータを使用して、履歴バージョンを指定することもできます。

[root@master ~]# kubectl rollout undo デプロイメント/nginx-deployment --to-revision=2
デプロイメント.apps/nginx-deployment がロールバックされました

[root@master ~]# kubectl デプロイメント/nginx-deployment を説明します
名前: nginx-deployment
名前空間: デフォルト
作成日時: 2021年12月24日(金) 22:24:10 +0800
ラベル: <なし>
注釈:deployment.kubernetes.io/revision: 4
                        kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true
セレクター: app=nginx
レプリカ: 希望 3 個 | 更新 3 個 | 合計 4 個 | 使用可能 3 個 | 使用不可 1 個
戦略タイプ: ローリングアップデート
最小準備秒数: 0
RollingUpdateStrategy: 最大 25% が利用不可、最大 25% が急増
ポッドテンプレート:
  ラベル: app=nginx
  コンテナ:
   nginx:
    イメージ: nginx:1.9.1
    ポート: 80/TCP
    ホストポート: 0/TCP
    環境: <なし>
    マウント: <なし>
  ボリューム: <なし>

.spec.revisonHistoryLimit オプションを設定すると、デプロイメントで保持するリビジョン履歴の数を指定できます。デフォルトでは、すべてのリビジョンが保持されます。このオプションが 0 に設定されている場合、デプロイメントはロールバックできません。

リビジョンは、デプロイメント ロールアウトがトリガーされたときにのみ作成されます。知らせ!ロールアウトは、テンプレート内のラベルやコンテナ イメージの更新など、デプロイメントの Pod テンプレートが変更され、デプロイメントの新しいリビジョンが作成された場合にのみトリガーされます。

ロールアウト コマンドのその他の使用法:

  • 履歴(過去のバージョンを表示)
  • 一時停止
  • 再開 (中断されたデプロイメントを再開する)
  • ステータス(リソースのステータスを確認)
  • 元に戻す(ロールバックバージョン)

ジョブ コントローラーは、ジョブ仕様に従ってポッドを作成し、正常に完了するまでポッドのステータスを継続的に監視する役割を担います。失敗した場合は、restartPolicy (OnFailure と Never のみがサポートされ、Always はサポートされていません) を使用して、新しい Pod を作成してタスクを再試行するかどうかが決定されます。

ジョブは、短期間の 1 回限りのタスク、つまり 1 回だけ実行されるタスクのバッチ処理を担当します。これにより、バッチ タスクの 1 つ以上のポッドが正常に完了することが保証されます。

Kubernetes は次のタイプのジョブをサポートしています。

  • 非並列ジョブ: 通常は正常に完了するまでポッドを作成します
  • 完了数が固定のジョブ: .spec.completions を設定し、.spec.completions 個の Pod が正常に完了するまで複数の Pod を作成します。
  • 作業キューを使用した並列ジョブ: .spec.Parallelism を設定しますが、.spec.completions は設定しません。すべてのポッドが完了し、少なくとも 1 つが成功すると、ジョブは成功したと見なされます。
  • .spec.completions と .spec.Parallelism の設定に応じて、ジョブは次のパターンに分類できます。
職種使用事例行動完了平行性
単発の仕事データベースの移行正常に完了するまでポッドを作成する1 1
終了時間が固定された仕事作業キューを処理するポッド順番にポッドを作成し、完了が正常に完了するまで実行します。 2歳以上1
完了数が固定された並列ジョブ複数のポッドが同時に作業キューを処理する複数のポッドを順番に作成し、完了が正常に完了するまで実行します。 2歳以上2歳以上
並列ジョブ複数のポッドが同時に作業キューを処理する1つ以上のポッドを作成し、1つが正常に完了するまで待ちます。 1 2歳以上
.job の使用法 [root@master ~]# vi job.yml 
---
APIバージョン: batch/v1
種類: 仕事
メタデータ:
  名前: myjob
仕様:
  テンプレート:
    仕様:
      コンテナ:
      - 名前: myjob
        画像: ビジーボックス
        コマンド: ["echo", "hello k8s job"]
      再起動ポリシー: なし


[root@master ~]# kubectl apply -f job.yml 
job.batch/myjob が作成されました
[root@master ~]# kubectl ポッドを取得する
名前 準備完了 ステータス 再起動 年齢
myjob-gq27p 0/1 完了 0 37秒

#このポッドのタスクを表示する [root@master ~]# kubectl get job
名前 完了 期間 年齢
私の仕事 1/1 19秒 5分11秒

#このポッドのログを表示する [root@master ~]# kubectl logs myjob-gq27p
こんにちはk8sジョブ

CronJob コントローラー

CronJob は、Linux/Unix システムの crontable (新しいウィンドウで開きます) と同様に、時間スケジュールに基づいてスケジュールされたタスクを実行するために使用できます。

CronJob は、データのバックアップ、電子メールの送信など、定期的に繰り返されるタスクを実行するのに非常に便利です。 CronJob は、システム負荷が比較的低いときにタスクを実行するようにスケジュールするなど、将来の時点を指定して単一のタスクを実行するためにも使用できます。

CronJob オブジェクトは、crontab (cron テーブル) ファイル内の行のようなものです。 これは Cron 形式で記述されており、指定されたスケジュール時間に定期的にジョブを実行します。

知らせ:

  • すべての CronJob スケジュール: 時間は kube-controller-manager のタイムゾーンに基づいています。
  • コントロール プレーンが Pod またはベア コンテナ内で kube-controller-manager を実行する場合、そのコンテナに設定されたタイム ゾーンによって、Cron ジョブのコントローラで使用されるタイム ゾーンが決まります。
  • CronJob リソースのマニフェストを作成するときは、指定された名前が有効な DNS サブドメイン名であることを確認してください。名前は 52 文字を超えることはできません。 これは、CronJob コントローラーが指定されたジョブ名に 11 文字を自動的に追加し、ジョブ名の最大長が 63 文字を超えてはならないという制限があるためです。
  • CronJob は、バックアップ、レポート生成などの定期的なアクションを実行するために使用されます。 これらの各タスクは、定期的に(例:毎日/毎週/毎月)繰り返されるように構成する必要があります。タスクの実行を開始する時間間隔を定義できます。

次の CronJob の例のリストは、現在の時刻と 1 分ごとに挨拶メッセージを出力します。

[root@master kubenetres]# vi cronjob.yml
---
APIバージョン: batch/v1beta1
種類: CronJob
メタデータ:
  名前: こんにちは
仕様:
  スケジュール: "*/1 * * * *"
  ジョブテンプレート:
    仕様:
      テンプレート:
        仕様:
          コンテナ:
          - 名前: こんにちは
            画像: ビジーボックス
            イメージプルポリシー: IfNotPresent
            指示:
            - /bin/sh
            - -c
            - 日付; エコー こんにちは、nihao
          再起動ポリシー: OnFailure

ポッドビューを作成 [root@master ~]# kubectl apply -f cronjob.yml 
警告: batch/v1beta1 CronJob は v1.21+ では非推奨で、v1.25+ では使用できません。batch/v1 CronJob を使用してください。
cronjob.batch/hello が作成されました

# 1分ほど待って確認します [root@master ~]# kubectl get pods
名前 準備完了 ステータス 再起動 年齢
hello-27339330-kkfxv 0/1 完了 0 2秒

#ログを表示 [root@master ~]# kubectl logs hello-27339330-kkfxv
2021年12月24日金曜日 15:30:00 UTC
こんにちは、ニハオ

要約する

K8S の 5 つのコントローラーとその使用方法についてはこれで終わりです。K8S コントローラーの使用に関する詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Androidデーモンインスタンス(基盤サービス)を作成する
  • DaemonSetサービスデーモンの使用シナリオ

<<:  CSS3 で作成したホバーズーム効果

>>:  ウェブサイトのデザイン体験のための7つの異なるカラースキーム

推薦する

JavaScriptの浅いコピーと深いコピーについての簡単な説明

目次1. 直接譲渡2. 浅いコピー3. ディープコピー1. JSONオブジェクトメソッド2. 再帰コ...

ウェブデザインの概要

<br />1998年に最初の個人ページが誕生してから2008年の今日まで、デザイン業界...

一般的なSQL削除ステートメントの原則の違いを理解するだけです

この記事では主に、SQL 削除ステートメント DROP、TRUNCATE、および DELETE の違...

VMware vSphere6.0 サーバー仮想化の展開とインストールの図 (詳細な手順)

1. VMware vSphere 導入の早期計画のポイント1. vSphereの利点(わずかに)...

Vue ユニットテストに関する予備調査

目次序文なぜユニットテストを導入するのですか?ユニットテストの概要テスト開発パターン1. テスト駆動...

MySQL 5.7.22 バイナリパッケージのインストールとインストール不要版 Windows 設定方法

次のコードは、MySQL 5.7.22 バイナリ パッケージのインストール方法を紹介しています。具体...

CSSフロートの特性についての簡単な説明

この記事では、CSS フロートの特徴を紹介します。皆さんと共有し、自分用のメモとして残したいと思いま...

誰もが知っておくべきウェブサイトのユーザビリティに関する 10 のヒント

これ以上時間を無駄にせず、早速本題に入りましょう。 1. ロゴに代替テキストを追加するこれには 2 ...

Unix/Linuxフォークの隠れたオーバーヘッド

目次1. フォークの起源2. 初期のUNIXオーバーレイ技術3. UNIXに導入される前のフォークの...

MySQLリモート接続を有効にする方法

セキュリティ上の理由から、MySql-Server はローカル マシン (localhost、127...

MySQL で珍しい文字を挿入できないときの対処方法 (文字列値が正しくない)

最近、ビジネス側から、一部のユーザー情報の挿入に失敗し、エラー メッセージが「不正な文字列値:&qu...

mysql8.0.23 Linux (centos7) のインストールの完全かつ詳細なチュートリアル

目次リレーショナルデータベースとは何ですか?非リレーショナルデータベースとは何ですか? MySQL ...

JSにおけるデータ型の正しい判定方法の例

目次序文typeof は型を正しく判別できますか? instanceof は型を正しく判別できますか...

Tomcat9 のダウンロード、インストール、設定 + Eclipse への統合に関する詳細なチュートリアル

トムキャット公式サイトtomcatはローカルサーバーと同等であり、Webページを開くことができます設...

Dockerを使用してOracle_11gをインストールする方法

DockerでOracle_11gをインストールする1. oracle_11gイメージを取得する d...