kubernetsのstatefulset
4440 ワード
StatefulSetはコントローラの一種で、独自のアイデンティティのPODを作成することができます.秩序ある導入と伸縮を提供します. statefulset を使用使用制限 構成部 pod識別 導入と伸縮を保証 statefulsetの使用
statefulsetは以下のアプリケーションに価値があります.安定で一意のネットワークアクセスアドレス 安定で永続的なストレージ 秩序、エレガントな導入と伸縮 秩序.優雅な削除と終了 上記の説明において、安定性は、POD再スケジューリング後に持続可能であることと同等である.アプリケーションが安定した認証や秩序ある導入、削除、伸縮を必要としない場合は、DeloymentやReplicaSetなどのステータスレスコピーを使用してアプリケーションを導入することができ、ステータスレスアプリケーションに適しています.
使用制限 Statefulsetは現在bateバージョンであり、1.5まではどのリリースでも は使用できません.すべてのalpha/betaリソースに類似しています.apiserverパラメータ--runtime-configでStatefulset を無効にできます. PODで使用する永続化ストレージは、storage classベースの動的ボリュームであってもよいし、予め管理者が割り当てる であってもよい. Statefulsetを削除または縮小しても、割り当てられたvolumesは削除されません.これは、statefulsetに関連付けられたリソースを自動的に消去するよりも、データのセキュリティを確保するために重要である . Statefulsetは現在、ネットワークアクセスアドレス を提供するHeadless Serviceが必要です.現在手動で更新を完了する必要があるStatefulset コンポーネントの次の例では、Statefulsetのコンポーネントについて説明する. ネットワークアクセスを制御するためのnginxというHeadless Service Webという名前のStatefulsetは、3つのコピーPOD を起動します. volumeClaimTemplatesは、永続化ストレージ を提供します.
POD識別
StatefulSet PODには、シーケンス番号、安定したネットワークアイデンティティ、および安定したストレージによってユニークなアイデンティティ識別があります.アイデンティティバインドPODは、PODがどのノードにスケジューリングされているかにかかわらず.
1)シーケンス番号インデックス
StatefulsetにはN個のインスタンスがあり、各PODには[1,N]の範囲の一意の整数シーケンス番号が割り当てられる.
2)安定したネットワークID
StatefulSetの各PODの名前はStatefulSetの名前とPodシーケンス番号からなる.POD名の形式は$(statefulset name)-$(ordinal)です.上記の例で作成したPOD名は、web-0、web-1、web-2です.statefulsetはHeadless Serviceを使用してPODのドメイン名を制御します.サービスドメイン名のフォーマットは$(サービス名).$(namespace).svc.cluster.local,cluster.localはcluster domainです.各PODには、$(podname).$(service_domain)という形式の一致するドメイン名が作成されます.次の表は、cluster domain、service name、statefulset nameがどのように相互作用するかを示す例です.
Cluster Domain Service (ns/name) StatefulSet (ns/name) StatefulSet Domain Pod DNS Pod Hostname
cluster.local default/nginx default/web nginx.default.svc.cluster.local web-{0..N-1}.nginx.default.svc.cluster.local web-{0..N-1}
cluster.local foo/nginx foo/web nginx.foo.svc.cluster.local web-{0..N-1}.nginx.foo.svc.cluster.local web-{0..N-1}
kube.local foo/nginx foo/web nginx.foo.svc.kube.local web-{0..N-1}.nginx.foo.svc.kube.local web-{0..N-1}
3)安定したストレージ
kubernetesは、VolumeClaimTemplateごとにPVを作成します.上記のnginxの例では、PODごとに1 GサイズのPVが得られる.PODがノードにスケジューリングされると、volumeMountsは、それにバインドされたPVCを介してPVをマウントする.
説明:PVCにバインドされたPVはPODまたはstatefulset削除により削除されず、手動で削除する必要があります.
導入と拡張性の確保 statefulsetのN個のコピーについて、PODが配備されると、それらは秩序化され、[0..N-1] . PODが削除すると、N-1のPOD が先に終了する逆の順序で終了する.は、伸縮動作をPODに適用する前に、以前のすべてのPODの状態がrunningであり、readyであることを保証しなければならない. PODが終了する前に、現在のシーケンス番号以降のすべてのPODは、 を完全に閉じる必要がある.
StatefulSetはpod.Spec.TerminationGracePeriodSecondsを0と指定するべきではありません.このやり方は安全ではないので,強く止めた.さらに説明するには、StatefulSet PODの強制削除を参照してください.
上記のnginx例を作成すると、3つのPODがweb-0 web-1 web-2の順序で配置されます.web-1は、web-0 runningおよびreadyの前に配備されず、web-2は、web-1がrunningおよびready状態になるまで配備されません.web-1 runningおよびready以降ですが、web-2はまだ起動していません.この場合、web-0が正常に再起動され、runningおよびreadyの状態に達するまで、web-2は起動されません.
replicas=1などのデプロイされたstatefulsetをユーザーが変更した場合、web-2は先に終了します.Web-1は、Web-2が完全に閉じて削除されるまで終了しません.Web-2は終了し、完全に閉じられていますが、Web-1が終了する前に、Web-0が故障した場合、Web-0がrunningおよびreadyの状態になるまで、Web-1は終了しません.
statefulsetは以下のアプリケーションに価値があります.
使用制限
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: webspec:
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
p_w_picpath: gcr.io/google_containers/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.beta.kubernetes.io/storage-class: anything
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
POD識別
StatefulSet PODには、シーケンス番号、安定したネットワークアイデンティティ、および安定したストレージによってユニークなアイデンティティ識別があります.アイデンティティバインドPODは、PODがどのノードにスケジューリングされているかにかかわらず.
1)シーケンス番号インデックス
StatefulsetにはN個のインスタンスがあり、各PODには[1,N]の範囲の一意の整数シーケンス番号が割り当てられる.
2)安定したネットワークID
StatefulSetの各PODの名前はStatefulSetの名前とPodシーケンス番号からなる.POD名の形式は$(statefulset name)-$(ordinal)です.上記の例で作成したPOD名は、web-0、web-1、web-2です.statefulsetはHeadless Serviceを使用してPODのドメイン名を制御します.サービスドメイン名のフォーマットは$(サービス名).$(namespace).svc.cluster.local,cluster.localはcluster domainです.各PODには、$(podname).$(service_domain)という形式の一致するドメイン名が作成されます.次の表は、cluster domain、service name、statefulset nameがどのように相互作用するかを示す例です.
Cluster Domain Service (ns/name) StatefulSet (ns/name) StatefulSet Domain Pod DNS Pod Hostname
cluster.local default/nginx default/web nginx.default.svc.cluster.local web-{0..N-1}.nginx.default.svc.cluster.local web-{0..N-1}
cluster.local foo/nginx foo/web nginx.foo.svc.cluster.local web-{0..N-1}.nginx.foo.svc.cluster.local web-{0..N-1}
kube.local foo/nginx foo/web nginx.foo.svc.kube.local web-{0..N-1}.nginx.foo.svc.kube.local web-{0..N-1}
3)安定したストレージ
kubernetesは、VolumeClaimTemplateごとにPVを作成します.上記のnginxの例では、PODごとに1 GサイズのPVが得られる.PODがノードにスケジューリングされると、volumeMountsは、それにバインドされたPVCを介してPVをマウントする.
説明:PVCにバインドされたPVはPODまたはstatefulset削除により削除されず、手動で削除する必要があります.
導入と拡張性の確保
StatefulSetはpod.Spec.TerminationGracePeriodSecondsを0と指定するべきではありません.このやり方は安全ではないので,強く止めた.さらに説明するには、StatefulSet PODの強制削除を参照してください.
上記のnginx例を作成すると、3つのPODがweb-0 web-1 web-2の順序で配置されます.web-1は、web-0 runningおよびreadyの前に配備されず、web-2は、web-1がrunningおよびready状態になるまで配備されません.web-1 runningおよびready以降ですが、web-2はまだ起動していません.この場合、web-0が正常に再起動され、runningおよびreadyの状態に達するまで、web-2は起動されません.
replicas=1などのデプロイされたstatefulsetをユーザーが変更した場合、web-2は先に終了します.Web-1は、Web-2が完全に閉じて削除されるまで終了しません.Web-2は終了し、完全に閉じられていますが、Web-1が終了する前に、Web-0が故障した場合、Web-0がrunningおよびreadyの状態になるまで、Web-1は終了しません.