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つの異なるカラースキーム

推薦する

MySQL 最適化: キャッシュ最適化 (続き)

MySQL 内部には至るところにキャッシュがあります。MySQL のソースコードを読むと、キャッシ...

テーブルレイアウトの長所と短所、そして推奨されない理由

テーブルの欠点1. テーブルは他の HTML タグよりも多くのバイトを占有します。 (ダウンロード時...

ウェブページ読み込み時に左右にジャンプする原因の分析と解決

最近、ウェブサイトを設計するときにこの問題に遭遇しています。メンバーセンターを設計し、コンテンツを ...

JavaScript 関数呼び出しの典型的なサンプルコード

目次JavaScript 関数呼び出しの典型的な例JS関数の定義と呼び出し方法要約するJavaScr...

iframe ページで js 関数を呼び出すには js を使用します

最近、私は毎日論文提案に取り組んでいます。自分のスキルを発揮して、再びWebをデザインしたくてうずう...

sed コマンドを使用してファイルの特定の行を効率的に削除する方法

序文通常、ファイル内の特定の行を削除したい場合は、まずファイルを開き、削除する内容を見つけて、これら...

Mysql5.7 で JSON 操作関数を使用する手順

序文JSON は、言語に依存しないテキスト形式を使用する軽量のデータ交換形式で、XML に似ています...

Hyper-V の紹介とインストールと使用 (詳細な図解)

はじめに:IT 業界の巨人である Microsoft 独自の仮想化技術は、VMware や Citr...

MySQLは遅いSQLを開始し、原因を分析します

ステップ1. MySQLスロークエリを有効にする方法1: 設定ファイルを変更するWindows: W...

【HTML要素】タグテキストの詳細説明

1. 基本的なテキスト要素を使用してコンテンツをマークアップするまず表示効果を見てみましょう:対応す...

XHTML 入門チュートリアル: シンプルな Web ページの作成

1 分で最初の Web ページを作成します。簡単な Web ページを作ってみましょう。ぜひフォローし...

docker コマンド例外「権限が拒否されました」の解決方法

Linuxシステムでは、dockerを新しくインストールし、次のようなコマンドを入力します。dock...

VMware ESXi のインストールと使用記録(ダウンロード付き)

目次1. ESXiをインストールする2. ESXiをセットアップする3. ESXiを起動するESXi...

CentOS の起動時に RabbitMq ソフトウェアを自動的に起動する方法

1. /etc/init.dディレクトリに新しいrabbitmqを作成します。 [root@loca...

Vue 3 カスタムディレクティブ開発の概要

指令とは何ですか? Angular と Vue はどちらもディレクティブの概念を持っており、これは通...