StatefulSetsには、一意の永続的なIDと安定したホスト名を持つポッドのセットが含まれています。ポッドテンプレートは、ポッドの仕様を含むStatefulsetで使用され、ポッドはこの仕様を使用して作成されます。 Kubernetesのステートフルセットを使用して、ステートフルアプリケーションとクラスター化アプリケーションをデプロイできます。 StatefulSetは、コンテナイメージとボリュームを含むポッド仕様を変更することで更新できます。
StatefulSetsは、アプリケーションが次のプロパティのいずれかを必要とする場合に使用できます。
- 安定した一意のネットワーク識別子。
- 安定した永続的なストレージ。
- 順序付けられた適切な展開とスケーリング。
- 注文された自動ローリングアップデート。
N個のレプリカを持つStatefulSetの場合、ポッドがデプロイされると、それらは{0..N-1}の順に順番に作成されます。ポッドが削除されると、{N-1..0}から逆の順序で終了します。
Statefulsetの詳細については、ここをクリックしてください。
この記事では、Nginxポッドのレプリカを使用してStatefulsetを作成します。ポッドに対して操作を実行して、ポッドがどのように削除および作成されるかを確認します。
前提条件
- 少なくとも1つのワーカーノードを持つKubernetesクラスタ。
Kubernetesクラスタの作成方法を学びたい場合は、ここをクリックしてください。このガイドは、AWS Ubuntu18l04EC2インスタンスで1つのマスターと2つのノードを持つKubernetesクラスターを作成するのに役立ちます。
何をするか
- ステートフルセットを作成する
ステートフルセットを作成
ファイルを作成し、その中に次のStatefulset定義を追加します。
vim statefulset.yml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
この例では、
-
nginxという名前のヘッドレスサービス 、ネットワークを制御するために使用されます。 - webという名前のStatefulSetには、一意のポッドで起動されるnginxコンテナのレプリカが3つあります。
- バージョンslim:0.8のnginxイメージは、Nginxのデプロイに使用されます。
ステートフルセットを作成するには、次のコマンドを実行します。
kubectl get statefulset
kubectl create -f statefulset.yml
次の2つのコマンドを実行して、上記の手順で作成したステートフルセットとサービスを一覧表示します。
kubectl get statefulset
kubectl get service
次のコマンドを使用してポッドを取得し、ポッド名にサフィックスとして番号が付いていることを確認します。
kubectl get pods
ステートフルセットの完全な詳細を取得するには、次のコマンドを実行します。
kubectl get statefulset
kubectl describe statefulset web
では、ポッドを削除して、新しいポッドが作成された後も名前がどのように保持されるかを見てみましょう。
2つのポッドを削除して、作成時に新しいポッドに割り当てられる名前を確認します。
kubectl get pods
kubectl delete pods web-0 web-2
kubectl get pods
上のスクリーンショットでは、ポッドを削除した後でも、新しく作成されたポッドに同じ名前が付けられていることがわかります。
結論
この記事では、Statefulsetを作成し、その詳細を確認するための操作を実行しました。また、ポッドを削除して、ポッドの名前がどのように保持されるかを確認し、削除後に新しく作成されたポッドに同じ名前が割り当てられるようにしました。