StatefulSet(状態セット)
1. StatefulSetは何ですか?
StatefulSetは(以前の名前)PetSetと呼ばれ、それはなど、RC、展開を、RS、ポッドコントローラです。
(deoloymentおよびRSに対応し、RC、さらにreplicaSetはステートレスなサービスのために設計されている)ステートフルサービスの問題を解決するためにStatefulSet。
ステートレスサービスとは何ですか?
本番環境では、ポッドの名前は、各ポッドポッドが新たに生成されることができる代わりに、タイムスケーリング能力が不規則で、ランダムです。
2、StatefulSetアプリケーションシナリオは、次のとおりです。
- 永続的な貯蔵安定性:すなわち、再スケジューリングまたはポッド後に達成するためにPVCに基づいて、同じ永続データへのアクセスを得ることができます。
- 安定したネットワークのロゴ:ポッド後のポッドを達成するためのヘッドレスサービス(すなわちなしサービスクラスタIPの)に基づいて、その名前とホスト名変更せずに、再スケジュール。
- 整然とした配置と秩序拡張:次の実行は、両方のポッドを実行しなければならない前に、前のすべてのポッドに、(すなわち、0から定義された順序に基づいて、N-1次まで順次展開または拡張したとき、すなわち、ポッドは、ありますそしてレディ状態)は、ベースのinitコンテナは実現しています。
- 規則的収縮、即ち:()は0にN-1を除去命じ
上記に参照シーンから見つけることができる、statefulsetは、以下のコンポーネントで構成されています:
1)サービスのヘッドレス:ヘッドレスサービス。ポッドは、ネットワーク識別(DNS)を定義するために使用されます。
2)statefulSet:特定のアプリケーション定義
)volumeClaimTemplateを3:PVCこのテンプレートは、自動的に各ポッドのために作成されます。
コントラストステートレスサービス、要約StatefulSet特性:同じ名前のポッド、各コピーシーケンシャルの開始と停止、データの永続ストレージは、各ポッドに異なっている、PVCは定義されたテンプレートに応じて自動的に作成。
図3に示すように、実施例statefulsetを通じてリソースを使用しての実施に次
ストレージ・クラスとstatefulsetデータの永続状態のサービスと他の操作を介して達成展開nginxのサービス。
操作流程如下:
1)通过nfs服务部署storage class(创建pv)
2)创建statefulset资源对象(创建pvc)
3)测试数据持久化
4)replicas扩容与缩容
5)分区更新
1)ストレージ・クラスのnfsの展開を通じて
以下の直接の展開、およびパラメータの具体的な情報最後の章を参照してくださいボーエン説明StatefulSetのK8S
#オープンnfsの:
[root@master yaml]# yum -y install nfs-utils
[root@master yaml]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
[root@master yaml]# mkdir /nfsdata
[root@master yaml]# systemctl start rpcbind
[root@master yaml]# systemctl start nfs-server
[root@master yaml]# systemctl enable nfs-server
[root@master yaml]# showmount -e
Export list for master:
/nfsdata *
#RBAC権限を作成します。
[root@master yaml]# vim rbac-rolebind.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-provisioner-runner
namespace: default
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get","create","list", "watch","update"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-provisioner"]
verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
ファイル名を指定して実行YAMLファイル。
#NFSでの展開を作成します。
[root@master yaml]# vim nfs-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-client-provisioner
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: nfs-deploy #供给方的名称(自定义)
- name: NFS_SERVER
value: 172.16.1.30 #nfs服务器的ip地址
- name: NFS_PATH
value: /nfsdata #nfs共享的目录
volumes:
- name: nfs-client-root
nfs:
server: 172.16.1.30
path: /nfsdata
#ストレージ・クラスを作成します。
[root@master yaml]# vim sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: statefu-nfs
namespace: default
provisioner: nfs-deploy
reclaimPolicy: Retain
//运行yaml文件后,查看sc的信息:
[root@master yaml]# kubectl get sc
NAME PROVISIONER AGE
statefu-nfs nfs-deploy 48s
2)statefulsetリソースを作成します。
[root@master yaml]# vim statefulset.yaml
apiVersion: v1
kind: Service
metadata:
name: headless-svc #定义无头服务,需要定义标签
labels:
app: headless-svc
spec:
ports:
- name: testweb
port: 80
clusterIP: None #需要将cluster ip定义为none
selector:
app: nginx #此处指定的标签需要在后边进行定义
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sfs-web
spec:
serviceName: headless-svc #此处选择的服务名为上边定义的无头服务名
replicas: 3
selector:
matchLabels:
app: nginx #选择标签
template:
metadata:
labels:
app: nginx #定义标签
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts: #定义数据持久化
- name: test-nginx
mountPath: /usr/share/nginx/html #挂载到容器内的路径
volumeClaimTemplates: #通过该字段(模板)为每个pod创建pvc
- metadata:
name: test-nginx
annotations:
volume.beta.kubernetes.io/storage-class: statefu-nfs #此处选择之前创建的storage class,名称要一致
spec:
accessModes:
- ReadWriteOnce #采用ReadWriteOnce的访问模式
resources:
requests:
storage: 100Mi #请求100M的空间
[root@master yaml]# kubectl apply -f statefulset.yaml
service/headless-svc unchanged
statefulset.apps/sfs-web created
//は、動作した後、状態のヘッドレスサービスとstatefulsetビューが作成された:
SVCの//詳細表示:
//ビューポッド作成:()正常な動作を保証する
各ポッドが発注されて見ることができ、その名前(ドメイン名)が順番0,1,2にソートされます.....
#、上記皮下PVによって作成さに応じて、私たちといえば、PVCと自動的STSによってテンプレートを作成し、我々は、PVとPVCのクラスタを参照してください。
我々は、手動で作成したものを、ステータスがすでにバインドされ、アクセスモードがRWO(SCモードで定義されている)、削除回復戦略で、皮下STSによって動的に作成され、正常に作成されたPVとPVCを見ることはできませんが。
3)持続性試験データ
#ビューは、それがPVCごとに、共有ディレクトリを生成するかどうかについて、NFSサーバーをマウントするには:
#ディレクトリ内のポッドファイルを入力するためにテストページを作成します。
[root@master yaml]# cd /nfsdata/default-test-nginx-sfs-web-0-pvc-4ef5e77e-1198-4ccc-81a7-db48d8a75023/
[root@master default-test-nginx-sfs-web-0-pvc-4ef5e77e-1198-4ccc-81a7-db48d8a75023]# echo "<h1>hello world</h1>" > index.html
[root@master default-test-nginx-sfs-web-0-pvc-4ef5e77e-1198-4ccc-81a7-db48d8a75023]# ll
total 4
-rw-r--r-- 1 root root 21 Jan 12 17:13 index.html
#私たちは、ファイルが正常にマウントするかどうかを確認するために、ポッドに移動します。
#次に、ポッドを削除:
データが失われているかどうか、再生されたポッドが交換されていることを確認しますか?
以上の試験結果を通じ、当社は、一切の状態サービスは、状態サービスから違いはありませんがあることがわかります削除はポッドの新しい世代によってカバーされることはありませんした後も、ポッド名は変更されません再生成し、元のポッド内のデータまた、一緒に存在します。
:4)伸縮収容レプリカ
(1)拡大操作:
[マスターYAML @ルート]#Vimのstatefulset.yaml
:新しく生成されたポッド用//再実行YAMLファイル
逆の順序で(2):(ボリューム縮小操作を道ターンダウン)
//再実行してサービスを、ポッドのステータスを参照してください。
上記スケーリング演算能力を通じ、我々は秩序拡大と秩序収縮で本番環境の導入を、達成し、ポッドを起動および停止するために、そのstatefulsetのリソースを参照してくださいすることができ、特定の順序です。
5)ゾーニングの更新:分区更新的主要目的是为pod进行一个分区,为了使我们对某个应用所有pod中的某一部分或者有选择性的pod进行更新操作。
#アップデートする前に、聞かせてのは、更新されたパラメータを参照してください。
[root@master yaml]# kubectl explain sts.spec.updateStrategy.rollingUpdate
KIND: StatefulSet
VERSION: apps/v1
RESOURCE: rollingUpdate <Object>
DESCRIPTION:
RollingUpdate is used to communicate parameters when Type is
RollingUpdateStatefulSetStrategyType.
RollingUpdateStatefulSetStrategy is used to communicate parameter for
RollingUpdateStatefulSetStrategyType.
FIELDS:
partition <integer>
Partition indicates the ordinal at which the StatefulSet should be
partitioned. Default value is 0.
#上記のパラメータに基づいて、我々は、指定されたパーティションのポッド、ポッドやバージョンアップを分割します:
我々は8にレプリカの数を設定し、パーティションの更新を定義する、更新操作を更新されていない以前のポッドから(4番目のパーティションを含む)第ポッド(パーティション)の開始を表します。
注:パーティション、ゼロからデフォルトのパーティションを指定しない場合。
アップグレードは第四ポッドから開始します後#アップグレードのテストは、単にnginxの新しいバージョンへの変更をミラーリング、サービスを再実行していない、あなたは(第四含む)ポッドミラーリングバージョンを見ることができ、ポッドのパーティションの前に、バージョンは変更されません。
4、StatefulSet限界
1)该资源对象还在beta(测试)状态,需要kubernetes v1.5版本以上才支持。
2)所有pod的volume必须使用pv或者是管理员事先创建好的。
3)为了保证数据安全,删除statefulset时不会删除volume。
4)statefulset需要一个Headless Service服务来定义DNS domin,需要在statefulset之前创建好。
5)目前statefulset功能还尚未完善,比如上面的更新操作还需要手动解决。
アプリケーションをデプロイするために任意の識別子の安定、秩序ある展開、削除や規模、使用、および他の非国家コントローラまたはRSの展開を必要としない場合、これらは、statefulset資源の理解と実践されています。逆も使用後、ディスクを切る前に、ポッドをマウントすることができ、ポッドと容積の関係がオフされていないことを確認するために生産にstatefulsetコントローラを使用