ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
整个的流程为: * 创建本地持久存储卷 * 将本地持久存储卷绑定到 Node 上 * 创建 StatefulSet 创建 local PV,在 /home/shiyanlou 目录下新建`local-storage.yaml`文件,并向其中写入如下代码: ~~~yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage # provisioner 的值为 kubernetes.io/no-provisioner,因为 local pv 不支持 Dynamic Provisioning,不能在创建 pvc 的时候自动创建 pv provisioner: kubernetes.io/no-provisioner # 使用延迟卷绑定功能,将 volume binding 延迟至 pod scheduling 阶段执行 volumeBindingMode: WaitForFirstConsumer ~~~ 执行创建: ~~~bash $ kubectl create -f local-storage.yaml storageclass.storage.k8s.io/local-storage created ~~~ 然后在每个 Node 上创建一个 PV,在 /home/shiyanlou 目录下新建`local-pv.yaml`文件,并向其中写入如下内容: ~~~yaml --- apiVersion: v1 kind: PersistentVolume metadata: name: local-pv1 spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage # local.path 指明对应的磁盘路径 local: path: /tmp # spec.nodeAffinity 指定对应的 node nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - kube-node-1 --- apiVersion: v1 kind: PersistentVolume metadata: name: local-pv2 spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /tmp nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - kube-node-2 ~~~ 上面的配置会在 kube-node-1 和 kube-node-2 两个 Node 上分别创建一个 PV。其中,存储类 spec.storageClassName 用的是前面启用的 local-storage, spec.capacity.storage 指定了容量为 1G,挂载路径 spec.local.path 为 /tmp(该路径需要在 Node 上存在)。 执行创建: ~~~bash $ kubectl create -f local-pv.yaml persistentvolume/local-pv1 created persistentvolume/local-pv2 created $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE local-pv1 1Gi RWO Retain Available local-storage 2m47s local-pv2 1Gi RWO Retain Available local-storage 2m47s ~~~ 可以看到两个 PV 都已创建成功,其状态为可用(Available),底层资源提供者为 local-storage。 创建有状态集合,在 /home/shiyanlou 目录下新建`web.yaml`文件,并向其中写入如下代码: ~~~yaml 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: serviceName: 'nginx' replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: - ReadWriteOnce storageClassName: local-storage resources: requests: storage: 10Mi ~~~ 其中 Service 的`clusterIP`指定为 None,表示它是一个 Headless Service,集群不用为它分配 IP。StatefulSet 包含 2 个 Pod 副本,它们的名字分别为`web-0`和`web-1`,并且都挂载了一个 PV。不管 Pod 被重新调度到哪个节点,Pod 的名字和挂载的 PV 都将跟之前保持一致。 在执行创建之前可以监听 Pod 的创建过程,在一个新的终端执行如下命令: ~~~bash kubectl get pods -w -l app=nginx ~~~ 然后执行创建: ~~~bash $ kubectl create -f web.yaml service/nginx created statefulset.apps/web created ~~~ 这个时候可以看到整个的创建过程: ~~~bash $ kubectl get pods -w -l app=nginx web-0 0/1 Pending 0 0s web-0 0/1 Pending 0 1s web-0 0/1 ContainerCreating 0 1s web-0 1/1 Running 0 9s web-1 0/1 Pending 0 0s web-1 0/1 Pending 0 1s web-1 0/1 ContainerCreating 0 1s web-1 1/1 Running 0 8s ~~~ 查看创建的 Headless Service 和 StatefulSet: ~~~bash $ kubectl get service nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx ClusterIP None <none> 80/TCP 22s $ kubectl get statefulset web NAME READY AGE web 2/2 37s ~~~ 查看根据 volumeClaimTemplates 自动创建 PVC: ~~~bash # PVC 名称的格式为:$(volumeClainTemplates.name)-(pod_name),这里 volumeClainTemplates.name 为 www,pod_name 为 web-[0-1] $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE www-web-0 Bound local-pv1 1Gi RWO local-storage 2m53s www-web-1 Bound local-pv2 1Gi RWO local-storage 2m44s ~~~ 查看创建的 Pod,它们都是有序的: ~~~bash # Pod 名称的格式为:$(StatefulSet名称)-$(序号),这里为:web-0、web-1 $ kubectl get pods -l app=nginx NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 5m33s web-1 1/1 Running 0 5m24s ~~~