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

Kubernetes Statefulsets の初心者ガイド

Susan Sarandon
Susan Sarandonオリジナル
2024-12-06 12:02:12946ブラウズ

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 までご連絡ください。