StatefulSetのK8S

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ビューが作成された:
StatefulSetのK8S
StatefulSetのK8S
SVCの//詳細表示:
StatefulSetのK8S
//ビューポッド作成:()正常な動作を保証する
StatefulSetのK8S
各ポッドが発注されて見ることができ、その名前(ドメイン名)が順番0,1,2にソートされます.....

#、上記皮下PVによって作成さに応じて、私たちといえば、PVCと自動的STSによってテンプレートを作成し、我々は、PVとPVCのクラスタを参照してください。
StatefulSetのK8S

我々は、手動で作成したものを、ステータスがすでにバインドされ、アクセスモードがRWO(SCモードで定義されている)、削除回復戦略で、皮下STSによって動的に作成され、正常に作成されたPVとPVCを見ることはできませんが。

3)持続性試験データ
#ビューは、それがPVCごとに、共有ディレクトリを生成するかどうかについて、NFSサーバーをマウントするには:
StatefulSetのK8S

#ディレクトリ内のポッドファイルを入力するためにテストページを作成します。

[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

#私たちは、ファイルが正常にマウントするかどうかを確認するために、ポッドに移動します。
StatefulSetのK8S

#次に、ポッドを削除:
StatefulSetのK8S
データが失われているかどうか、再生されたポッドが交換されていることを確認しますか?
StatefulSetのK8S

以上の試験結果を通じ、当社は、一切の状態サービスは、状態サービスから違いはありませんがあることがわかります削除はポッドの新しい世代によってカバーされることはありませんした後も、ポッド名は変更されません再生成し、元のポッド内のデータまた、一緒に存在します。

:4)伸縮収容レプリカ
(1)拡大操作:
[マスターYAML @ルート]#Vimのstatefulset.yaml
StatefulSetのK8S
:新しく生成されたポッド用//再実行YAMLファイル
StatefulSetのK8S
逆の順序で(2):(ボリューム縮小操作を道ターンダウン)
StatefulSetのK8S
//再実行してサービスを、ポッドのステータスを参照してください。
StatefulSetのK8S

上記スケーリング演算能力を通じ、我々は秩序拡大と秩序収縮で本番環境の導入を、達成し、ポッドを起動および停止するために、その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.

#上記のパラメータに基づいて、我々は、指定されたパーティションのポッド、ポッドやバージョンアップを分割します:
StatefulSetのK8S

我々は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コントローラを使用

おすすめ

転載: blog.51cto.com/13972012/2466248