微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有NFS持久卷的Kubernetes状态集

如何解决具有NFS持久卷的Kubernetes状态集

我有一个kubernetes集群,并且为mongodb进行了简单部署,并设置了NFS持久卷。它工作正常,但是由于数据库资源是stateful,因此我想到了将Statefulset用作mongodb,但是现在的问题是,当我浏览文档时,statefulset有{{1 }},而不是volumeClaimTemplates(在部署中)。

但是现在问题来了。

volumes

这样做:

deployment-> PersistentVolume-> PersistentVolumeClaim

但是我们如何在Deployment中做到这一点?

是这样的吗?

Statefulset-> volumeClaimTemplates

如何为StatefulSet设置PersistentVolume。如果我们不将volumeClaimTemplates用于PersistentVolume,它将如何创建卷?在何处创建卷?是在StatefulSet机器(即kubernetes工作者节点)中吗?

因为我有一个用于host部署的独立NFS设置程序(副本集= 1),我如何在mongodb中使用相同的设置?

这是我的StatefulSet->我将其转换为有状态集,如第二个代码段(mongo-deployment.yaml

所示。
  1. mongo-stateful.yaml
mongo-deployment.yaml
  1. <omitted> --- apiVersion: v1 kind: PersistentVolume Metadata: name: task-pv-volume labels: name: mynfs # name can be anything spec: storageClassName: manual # same storage class as pvc capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: server: <nfs-server-ip> path: "/srv/nfs/mydata" --- apiVersion: v1 kind: PersistentVolumeClaim Metadata: name: task-pv-claim spec: storageClassName: manual accessModes: - ReadWriteMany # must be the same as PersistentVolume resources: requests: storage: 1Gi --- apiVersion: apps/v1 kind: Deployment Metadata: name: mongodb-deployment labels: name: mongodb spec: selector: matchLabels: app: mongodb replicas: 1 template: Metadata: labels: app: mongodb spec: containers: - name: mongodb image: mongo ports: - containerPort: 27017 ... # omitted some parts for easy reading volumeMounts: - name: data mountPath: /data/db volumes: - name: data persistentVolumeClaim: claimName: task-pv-claim
mongo-stateful.yaml

但这不起作用(--- apiVersion: v1 kind: PersistentVolume Metadata: name: task-pv-volume labels: name: mynfs # name can be anything spec: storageClassName: manual # same storage class as pvc capacity: storage: 10Gi accessModes: - ReadWriteOnce nfs: server: <nfs-server-ip> path: "/srv/nfs/mydata" --- apiVersion: apps/v1 kind: StatefulSet Metadata: name: mongodb-statefulset spec: selector: matchLabels: name: mongodb-statefulset serviceName: mongodb-statefulset replicas: 2 template: Metadata: labels: name: mongodb-statefulset spec: terminationGracePeriodSeconds: 10 containers: - name: mongodb image: mongo:3.6.4 ports: - containerPort: 27017 volumeMounts: - name: db-data mountPath: /data/db volumeClaimTemplates: - Metadata: name: db-data spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "manual" resources: requests: storage: 2Gi )窗格处于mongo-stateful.yaml状态,如我所描述的那样:

认调度程序0/3个节点可用:1个节点有污点{node-role.kubernetes.io/master:},该容器无法容忍,2个容器具有未绑定的立即PersistentVolumeClaims

PS:部署工作正常,没有任何错误,Statefulset存在问题

有人可以帮助我,如何编写带有卷的状态集?

解决方法

如果您的存储类不支持动态卷配置,则您必须使用yaml文件手动创建PV和关联的PVC ,然后volumeClaimTemplates将允许将现有的PVC与statefulset的Pod链接。 / p>

这是一个有效的示例:https://github.com/k8s-school/k8s-school/blob/master/examples/MONGODB-install.sh

您应该:

  • https://kind.sigs.k8s.io/上本地运行,它支持动态卷配置,因此这里将自动创建PVC和PV
  • 导出PV和PVC Yaml文件
  • 使用这些yaml文件作为模板为NFS后端创建PV和PVC。

您将在这里得到种类:

$ ./MONGODB-install.sh               
+ kubectl apply -f 13-12-mongo-configmap.yaml
configmap/mongo-init created
+ kubectl apply -f 13-11-mongo-service.yaml
service/mongo created
+ kubectl apply -f 13-14-mongo-pvc.yaml
statefulset.apps/mongo created
$ kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
mongo-0   2/2     Running   0          8m38s
mongo-1   2/2     Running   0          5m58s
mongo-2   2/2     Running   0          5m45s
$ kubectl get pvc
NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
database-mongo-0   Bound    pvc-05247511-096e-4af5-8944-17e0d8222512   1Gi        RWO            standard       8m42s
database-mongo-1   Bound    pvc-f53c35a4-6fc0-4b18-b5fc-d7646815c0dd   1Gi        RWO            standard       6m2s
database-mongo-2   Bound    pvc-2a711892-eeee-4481-94b7-6b46bf5b76a7   1Gi        RWO            standard       5m49s
$ kubectl get pv 
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE
pvc-05247511-096e-4af5-8944-17e0d8222512   1Gi        RWO            Delete           Bound    default/database-mongo-0   standard                8m40s
pvc-2a711892-eeee-4481-94b7-6b46bf5b76a7   1Gi        RWO            Delete           Bound    default/database-mongo-2   standard                5m47s
pvc-f53c35a4-6fc0-4b18-b5fc-d7646815c0dd   1Gi        RWO            Delete           Bound    default/database-mongo-1   standard                6m1s

和PVC的转储(由volumeClaimTemplate在这里生成,因为是odf类动态卷配置):

$ kubectl get pvc database-mongo-0 -o yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: rancher.io/local-path
    volume.kubernetes.io/selected-node: kind-worker2
  creationTimestamp: "2020-10-16T15:05:20Z"
  finalizers:
  - kubernetes.io/pvc-protection
  labels:
    app: mongo
  managedFields:
    ...
  name: database-mongo-0
  namespace: default
  resourceVersion: "2259"
  selfLink: /api/v1/namespaces/default/persistentvolumeclaims/database-mongo-0
  uid: 05247511-096e-4af5-8944-17e0d8222512
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: standard
  volumeMode: Filesystem
  volumeName: pvc-05247511-096e-4af5-8944-17e0d8222512
status:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 1Gi
  phase: Bound

以及相关的PV:

kubectl get pv pvc-05247511-096e-4af5-8944-17e0d8222512 -o yaml     
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: rancher.io/local-path
  creationTimestamp: "2020-10-16T15:05:23Z"
  finalizers:
  - kubernetes.io/pv-protection
  managedFields:
    ...
  name: pvc-05247511-096e-4af5-8944-17e0d8222512
  resourceVersion: "2256"
  selfLink: /api/v1/persistentvolumes/pvc-05247511-096e-4af5-8944-17e0d8222512
  uid: 3d1e894e-0924-411a-8378-338e48ba4a28
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 1Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: database-mongo-0
    namespace: default
    resourceVersion: "2238"
    uid: 05247511-096e-4af5-8944-17e0d8222512
  hostPath:
    path: /var/local-path-provisioner/pvc-05247511-096e-4af5-8944-17e0d8222512_default_database-mongo-0
    type: DirectoryOrCreate
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - kind-worker2
  persistentVolumeReclaimPolicy: Delete
  storageClassName: standard
  volumeMode: Filesystem
status:
  phase: Bound

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。