ホームページ バックエンド開発 Golang Kubernetes Statefulsets の初心者ガイド

Kubernetes Statefulsets の初心者ガイド

Dec 06, 2024 pm 12:02 PM

StatefulSet は、ステートフル アプリケーションの管理に使用される Kubernetes の API オブジェクトです。 Kubernetes には、ステートフル アプリケーションとステートレス アプリケーションという 2 種類のアプリケーションがあります。これらのアプリケーションをデプロイするには 2 つの方法があります:

  • デプロイメント (ステートレス アプリケーションの場合)
  • StatefulSet (ステートフル アプリケーション用)

ステートフル アプリケーションとは何ですか?

何らかの形式の永続的な状態またはデータを維持するアプリケーションは、ステートフル アプリケーションと呼ばれます。これらのアプリケーションをステートレス アプリケーションと区別する主な特徴は、これらのアプリケーションがデータをローカルに保存することに依存しておらず、各リクエストを独立したものとして扱わないことです。インタラクション間のデータを管理します。場合によっては、ステートレス アプリケーションがステートフル アプリケーションに接続して、リクエストをデータベースに転送することがあります。

ステートレス アプリケーションとは何ですか?

いかなる形式の永続的な状態やデータもローカルに維持しないアプリケーションは、ステートレス アプリケーションと呼ばれます。ステートレス アプリケーションでは、各リクエストまたは対話は独立して処理されます。これらのアプリケーションは、ステートフル アプリケーションとは異なり、過去のインタラクションやリクエストを追跡する必要がないため、拡張性が高く、管理が容易で、フォールト トレラントであるように設計されています。

ステートレス アプリケーションは、デプロイメント コンポーネントを使用してデプロイされます。デプロイメントはポッドの抽象化であり、アプリケーションを複製できるようになります。つまり、同じステートレス アプリケーションの 1、5、10、または n 個の同一のポッドを実行できるようになります。

ステートフルセットとは何ですか?

最も簡単に言うと、StatefulSet はステートフル アプリケーション専用に使用される Kubernetes コンポーネントです。これらは、ステートフル アプリケーションを管理するために使用されるワークロード API オブジェクトです。 StatefulSet は、一連の Pod のデプロイメントとスケーリング (追加のレプリカの作成または削除) を管理し、StatefulSet はこれらの Pod の順序と一意性にも責任を負います。 StatefulSet は、Kubernetes 1.9 リリースでリリースされました。

StatefulSet は、異なる (一意の) 永続的な ID と柔軟なホスト名 (安定した) を持つポッドのセットを表します。これにより、スケーリングとデプロイメントの順序を確実に行うことができます。 StatefulSet を理解する前に、Kubernetes のデプロイメントを理解する必要があります。

これは、web という名前の StatefulSet の例です。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

StatefulSet を使用する場合

Kubernetes の StatefulSet は、安定した一意のネットワーク識別子、永続ストレージ、順序付けられた適切なデプロイメントとスケーリングを必要とするステートフル アプリケーションのデプロイメントに最適です。これらは、一貫した ID とストレージを必要とするデータベース、キー/値ストア、メッセージング キューなどのアプリケーションに適しています。

ステートフル アプリケーションとステートレス アプリケーションの例

MongoDB データベースに接続された Node.js アプリケーションを考えてみましょう。リクエストがnode.jsアプリケーションに届くと、アプリケーションはリクエストを独立して処理し、以前のデータに依存しません。リクエスト自体のペイロードに基づいてリクエストを処理します。このnode.jsアプリケーションはステートレスアプリケーションの例です。ここで、リクエストはデータベース内の一部のデータを更新するか、データベースの一部のデータをクエリします。 node.js がそのリクエストを MongoDB に転送すると、MongoDB はデータの以前の状態に基づいてデータを更新するか、ストレージからデータをクエリします。リクエストごとにデータを処理する必要があり、それは利用可能な最新のデータまたは状態に依存しますが、node.js はデータ更新またはクエリの単なるパススルーであり、コードを処理するだけです。したがって、node.js アプリケーションはステートレス アプリケーションである必要があり、MongoDB アプリケーションはステートフル アプリケーションである必要があります。

ステートレス アプリケーションがステートフル アプリケーションに接続して、リクエストをデータベースに転送することがあります。これは、ステートレス アプリケーションがステートフル アプリケーションにリクエストを転送する良い例です。

Kubernetes で StatefulSet を作成する方法

ここでは、StatefulSet の使用方法と、StatefulSet でのいくつかの基本操作に関するステップバイステップのチュートリアルを示します。

Nginx StatefulSet アプリケーションを作成する

ステップ 1. StatefulSet ファイルを作成します。これを行うには、次のコマンドを入力します:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ステップ 2. コードエディターでこのファイルを開き、次のコードを書き込みます。

touch example-statefulset.yaml
ログイン後にコピー
ログイン後にコピー

ステップ 3. 次に、サービス ファイルと Persistent VolumeClaim ファイルを作成する必要があります。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: gfg-example-statefulset
  annotations:
    description: "This is an example statefulset"
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "gfg-example-service"
  replicas: 3 # remember this, we will have 3 identical pods running
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: myclaim
ログイン後にコピー
ログイン後にコピー

StatefulSet アプリケーションのサービスを作成する

ステップ 4. サービス ファイルに次のコードを入力します。

touch example-service.yaml
touch example-persistentVolumeChain.yaml
ログイン後にコピー
ログイン後にコピー

アプリケーションの PersistentVolumeClaim を作成する

ステップ 5. 次のコードを PersistentVolumeClaim ファイルに入力します。

apiVersion: v1
kind: Service
metadata:
  name: gfg-example-service
  annotations:
    description: "this is an example service"
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
ログイン後にコピー
ログイン後にコピー

次に、これらの変更を適用しましょう。

ステップ 6. 端末に次のコマンドを入力して、gfg-example-statefulset を作成します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi # This means we are requesting for 8 GB of storage
ログイン後にコピー
ログイン後にコピー

これにより gfg-example-statefulset が作成され、同様の結果が得られます。

Beginners guide to Kubernetes Statefulsets

ここで、コマンドを使用してターミナルで StatefulSet を検索するとします

kubectl create -f example-statefulset.yaml
ログイン後にコピー
ログイン後にコピー

リスト内で gfg-example-statefulset が見つかります。

Beginners guide to Kubernetes Statefulsets

ステップ 7. 端末に次のコマンドを入力して、gfg-example-service を作成します。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これにより、「gfg-example-service」という名前のサービスが作成されます

ステップ 8. ポッドとサービスを確認しましょう。ポッドのリストを取得するには、ターミナルで次のコマンドを入力します。

touch example-statefulset.yaml
ログイン後にコピー
ログイン後にコピー

example-stateful-set.yaml ファイルで 3 つのレプリカを定義することで、作成した 3 つの gfg-pod のリストが取得されます。同様の出力が得られます:

Beginners guide to Kubernetes Statefulsets

サービスのリストを確認するには、ターミナルに次のコマンドを入力します:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: gfg-example-statefulset
  annotations:
    description: "This is an example statefulset"
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "gfg-example-service"
  replicas: 3 # remember this, we will have 3 identical pods running
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: myclaim
ログイン後にコピー
ログイン後にコピー

これにより、同様の出力が得られます:

Beginners guide to Kubernetes Statefulsets

StatefulSet の一部の操作

StatefulSet の追加: Kubernetes クラスターに StatefulSet を追加するには、コマンド kubectl create -f [StatefulSet ファイル名] を使用し、[StatefulSet ファイル名] を名前に置き換えます。 StatefulSet マニフェスト ファイルの。

touch example-service.yaml
touch example-persistentVolumeChain.yaml
ログイン後にコピー
ログイン後にコピー

StatefulSet の削除: Kubernetes で StatefulSet を削除するには、kubectl delete statefulset [name] コマンドを使用できます。ここで、[name] は必要な StatefulSet の名前です。削除します。

apiVersion: v1
kind: Service
metadata:
  name: gfg-example-service
  annotations:
    description: "this is an example service"
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
ログイン後にコピー
ログイン後にコピー

StatefulSet の編集: コマンド kubectl edit statefulset [name] を使用すると、エディタを開いてコマンド ラインから直接 StatefulSet の構成を変更できます。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi # This means we are requesting for 8 GB of storage
ログイン後にコピー
ログイン後にコピー

レプリカのスケーリング: kubectlscale コマンドは、[StatefulSet 名] という名前の StatefulSet 内のレプリカの数を、指定された [レプリカの数] までスケーリングします。

kubectl create -f example-statefulset.yaml
ログイン後にコピー
ログイン後にコピー

ステップ 9. それでは、ポッドをスケールアップして、機能するかどうかを確認してみましょう。ポッドを 6 つのポッドにスケールアップするには、次のコマンドを入力します。

kubectl get statefulsets
ログイン後にコピー

これにより、さらに 3 つのポッドが作成され、ポッドの数は 6 になりました。ポッドのリストを取得するには、次のコマンドを入力します。

kubectl apply -f example-service.yaml
ログイン後にコピー

同様の出力が得られます:

Beginners guide to Kubernetes Statefulsets

ステップ 10. 次に、ポッドを 3 にスケールダウンしましょう。そのためには、同じコマンドを入力し、レプリカの数を 3 に戻すだけです。

kubectl get pods
ログイン後にコピー

ここで、
によってポッドのリストを確認します。

kubectl get services
ログイン後にコピー

実行中のポッドは 3 つだけ表示されます:

Beginners guide to Kubernetes Statefulsets

このようにして、StatefulSet を作成し、スケールアップしたり、スケールダウンしたりすることができます。ターミナルを閉じる前に、必ず StatefulSet とサービスを削除してください。kubectl のコマンドの詳細については、Kubectl コマンド チートシートを参照してください。

ステートフル アプリケーションはどのように動作するのでしょうか?

MySQL のようなステートフル アプリケーションでは、データの不整合を避けるために、複数のポッドが同時にデータの読み取りと書き込みを行うことはできません。
1 つのポッドはマスター ポッドとして指定され、データの書き込みと変更を担当します。一方、他のポッドはスレーブ ポッドとして指定され、データの読み取りのみが許可されます。
各ポッドにはデータ ストレージの独自のレプリカがあり、データの分離と独立性が確保されます。
すべてのポッドが同じデータ状態になるように同期メカニズムが採用されており、マスター ポッドがデータを変更するとスレーブ ポッドがデータ ストレージを更新します。
ステートフル アプリケーション内のすべてのポッド間でデータの一貫性を維持するには、継続的な同期が必要です。

例:
MySQL のマスター ポッドが 1 つとスレーブ ポッドが 2 つあるとします。新しいポッド レプリカが既存のセットアップに参加するとどうなるでしょうか?新しいポッドも独自のストレージを作成して同期する必要があるため、最初に前のポッドからデータのクローンを作成し、次にマスター ポッドによる更新をリッスンするために継続的な同期を開始します。各ポッドには、同期されたデータとポッドの状態を含む独自の物理ストレージによってバックアップされる独自のデータ ストレージ (永続ボリューム) があるためです。各ポッドには、マスター ポッドであるかスレーブ ポッドであるか、およびその他の個別の特性に関する情報が含まれる独自の状態があります。これらはすべてポッド自体のストレージに保存されます。したがって、ポッドが停止すると、永続ポッドが置き換えられます。識別子により、ストレージ ボリュームが交換ポッドに確実に再接続されます。このようにして、クラスターがクラッシュした場合でも、データが失われることはありません。

結論

この記事では、Kubernetes StatefulSet の使用方法について説明しました。 StatefulSet は、ステートフル アプリケーションをデプロイするために使用される Kubenetes コンポーネントです。ステートフル アプリケーションは、何らかの形式の永続的な状態またはデータを維持するアプリケーションです。良い例としては、データベースを備えたアプリケーションが挙げられます。 StatefulSet を使用してステートフル アプリケーションをデプロイする方法について説明しました。その後、ステートフル アプリケーションがどのように機能するかについて話し合いました。最後に、StatefulSet とデプロイメントの違いについて説明しました。基本的に、デプロイメントはステートレス アプリケーションのデプロイに使用され、StatefulSet はステートフル アプリケーションのデプロイに使用されるという点を中心に進みます。いくつかの FAQ を取り上げてこの記事を終了します。

Kubernetes StatefulSet - よくある質問

Kubernetes でボリューム サイズを増やすにはどうすればよいですか?

Kubernetes でボリューム サイズを増やすには、ストレージ サイズを変更して Persistent VolumeClaim (PVC) 仕様を変更する必要があります。その後、基盤となるストレージ クラスが動的プロビジョニングをサポートしている場合、Kubernetes は新しいサイズ要件を満たすために追加のストレージを自動的にプロビジョニングします。

Kubernetes で hostPath を使用するのはどのような場合ですか?

Kubernetes の hostPath ボリューム タイプは、ポッド内でノードのファイル システム上のファイルまたはディレクトリに直接アクセスする必要があるシナリオに適しています。これは通常、ノード固有のリソースにアクセスするため、または同じノード上のコンテナ間でデータを共有するために使用されます。

PVC StatefulSet と展開の違いは何ですか?

StatefulSet の PersistentVolumeClaims (PVC) は、個々のポッドに安定した永続ストレージを提供するために使用され、ポッドの再起動後のデータの永続性と ID を確保します。対照的に、デプロイメントでは通常、一時的なボリュームが使用され、データの永続性が要件ではないステートレス アプリケーションに適しています。

StatefulSet を使用してステートレス アプリケーションをデプロイできますか?

技術的には可能ですが、StatefulSet を使用してステートレス アプリケーションをデプロイすることはお勧めできません。 StatefulSet は、安定した一意の識別子と永続的なストレージを必要とするステートフル アプリケーション向けに特別に設計されています。 StatefulSet を使用してステートレス アプリケーションをデプロイすると、不必要な複雑さとリソースのオーバーヘッドが生じる可能性があります。

ステートレスはステートフルより優れていますか?

それはアプリケーションの特定の要件によって異なります。ステートレス アプリケーションは管理と水平方向の拡張が簡単ですが、ステートフル アプリケーションはデータの整合性を維持し、データベースやメッセージング システムなどの特定のワークロードに適しています。

以上がKubernetes Statefulsets の初心者ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

ゴーを始めましょう:初心者のガイド ゴーを始めましょう:初心者のガイド Apr 26, 2025 am 12:21 AM

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

Golang vs. C:パフォーマンスと速度の比較 Golang vs. C:パフォーマンスと速度の比較 Apr 21, 2025 am 12:13 AM

Golangは迅速な発展と同時シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを実現し、埋め込みシステム開発に適しています。

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

Golang vs. Python:長所と短所 Golang vs. Python:長所と短所 Apr 21, 2025 am 12:17 AM

GolangisidealforBuildingsCalables Systemsduetoitsefficiency andConcurrency、Whilepythonexcelsinquickscriptinganddataanalysisduetoitssimplicityand vastecosystem.golang'ssignencouragesclean、readisinediteNeditinesinedinediseNabletinedinedinedisedisedioncourase

See all articles