首页 > 编程知识 正文

kubernetes详解,kubernetes yaml

时间:2023-05-04 01:19:35 阅读:111820 作者:3473

hostPath volume的问题是,以前经常使用hostPath volume来允许Pod使用本地存储,并将Node文件系统中的文件或目录装载到容器中但是,为什么不适合在生产环境中使用?

为了区分群集中的每个节点,要使用主机路径卷,必须在节点选择器等中进行准确的调度。 这样的事情一多,我就烦躁。 请注意两种主机路径: 3DirectoryOrCreate和http://www.Sina.com/。 如果节点没有相应的文件/目录,则kubelet必须确保节点上有创建文件/目录,并且如果节点上的文件或目录是由root创建的,则控制例如,root用户可能需要启动进程并在预配置容器中运行,或者可能需要预先更改节点上的文件权限配置。 由于计划程序没有考虑主机路径卷的大小,主机路径也没有声明所需的存储大小,因此必须人工检查和保证调度时的存储考虑。 状态集不能使用主机路径卷,使用已编写的共享存储的Helm Chart与主机路径卷不兼容,需要修改的地方还不少,这也很痛苦。 localpersistentvolumelocalpersistentvolume用于解决主机路径卷面临的portability、磁盘会计和计划缺陷PV控制器和计划程序对本地PV执行特殊的逻辑处理,以便在Pod使用本地存储时出现Pod re-schedule时,可以重新计划到本地卷所在的Node

local pv在生产环境中使用,需要谨慎使用。 毕竟,它本质上使用了节点上的本地存储。 如果没有适当的存储复制机制,如果节点或磁盘发生异常,使用该卷的Pod也会发生异常,并导致数据丢失。 除非此风险对APP应用程序没有太大影响,或者明确知道允许数据丢失,否则不允许数据丢失。

本地持久性卷的设计主要面临两个难点

第一个难点是如何将本地磁盘抽象为PV,第二个难点是, 允许Kubernetes在调度程序包含请求Pod的本地持久性卷的节点上使用持久性卷的. spec.nodeAffinityfield编写本地虚拟机使用umebindingmode 3360 waitforfirstconsumer的本地存储存储库实现PVC的延迟绑定,无需等待PV控制器立即为PVC绑定

第一,当然,装载并格式化可用于您的宿主机的本地磁盘。 这也是最常见的操作。 第二,在实验环境中,可以实际在主机上装载几个ram磁盘(内存磁盘)来模拟本地磁盘。 然后,使用第二种方法在以前部署的Kubernetes群集上实践。

首先,在名为node-1的主机上创建装载点,如/mnt/disks。 然后,使用一些RAM Disk模拟本地磁盘,如下所示:

sudo mkdir/mnt/diskssudomkdir/mnt/disks/vol1sudo mount-ttmpfsvol1/mnt/disks/vol1# forvolinvol1vol2vol 3; do # sudo mkdir/mnt/disks/$ vol # sudo mount-t tmpfs $ vol/mnt/disks/$ vol # done然后是与这些本地磁盘对应的本地- PV .

API版本3360 v1 kind : persistentvolumemetadata : name : example-PV-0 spec : capacity : storage 33601 givolumememodadata epersistentvolumereclaimpolicy : deletestorageclassname 3360本地-存储本地3360 path :/storage local 3360 vol1node affinity : required : nodeselectorterms :-match expressions 3360-key 3: kubernetes.io/hoo

values: - node-001 --- apiVersion: v1kind: PersistentVolumemetadata: name: example-pv-1spec: capacity: storage: 1Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /mnt/disks/vol1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node-002

接下来,我们就可以使用 kubect create 来创建这个 PV,如下所示:

$ kubectl create -f local-pv.yaml persistentvolume/example-pv created$ kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEexample-pv 1Gi RWO Delete Available local-storage 16s

创建一个 StorageClass 来描述这个 PV,如下所示:

kind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: local-storageprovisioner: kubernetes.io/no-provisionervolumeBindingMode: WaitForFirstConsumer

我们就可以创建 StorageClass 了,如下所示:

$ kubectl create -f local-sc.yaml storageclass.storage.k8s.io/local-storage created

接下来,我们只需要定义一个非常普通的 PVC,就可以让 Pod 使用到上面定义好的 Local Persistent Volume 了,如下所示:

kind: PersistentVolumeClaimapiVersion: v1metadata: name: example-local-claimspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: local-storage

现在,我们来创建这个 PVC:

$ kubectl create -f local-pvc.yaml persistentvolumeclaim/example-local-claim created$ kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEexample-local-claim Pending local-storage 7s

然后,我们编写一个 Pod 来声明使用这个 PVC,如下所示:

apiVersion: apps/v1kind: Deploymentmetadata: name: example-pv-pod labels: app.kubernetes.io/name: example-pv-podspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: example-pv-pod template: metadata: labels: app.kubernetes.io/name: example-pv-pod spec: volumes: - name: example-pv-storage persistentVolumeClaim: claimName: example-local-claim containers: - name: example-pv-container image: nginx imagePullPolicy: IfNotPresent command: ["nginx", "-g", "daemon off;"] ports: - name: "http-server" containerPort: 80 protocol: TCP volumeMounts: - mountPath: "/usr/share/nginx/html" name: example-pv-storage

这个 Pod 没有任何特别的地方,你只需要注意,它的 volumes 字段声明要使用前面定义的、名叫 example-local-claim 的 PVC 即可。

而我们一旦使用 kubectl create 创建这个 Pod,就会发现,我们前面定义的 PVC,会立刻变成 Bound 状态,与前面定义的 PV 绑定在了一起,如下所示:

$ kubectl create -f local-pod.yaml pod/example-pv-pod created$ kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEexample-local-claim Bound example-pv 5Gi RWO local-storage 6h

也就是说,在我们创建的 Pod 进入调度器之后,“绑定”操作才开始进行。

这时候,我们可以尝试在这个 Pod 的 Volume 目录里,创建一个测试文件,比如:

$ kubectl exec -it example-pv-pod -- /kkdkh/sh# cd /usr/share/nginx/html# touch test.txt

然后,登录到 winex-k8s-node-001 这台机器上,查看一下它的 /mnt/disks/vol1 目录下的内容,你就可以看到刚刚创建的这个文件:

# 在winex-k8s-node-001上$ ls /mnt/disks/vol1test.txt

而如果你重新创建这个 Pod 的话,就会发现,我们之前创建的测试文件,依然被保存在这个持久化 Volume 当中:

$ kubectl delete -f local-pod.yaml $ kubectl create -f local-pod.yaml $ kubectl exec -it example-pv-pod -- /kkdkh/sh# ls /usr/share/nginx/html# touch test.txt

需要注意的是,我们上面手动创建 PV 的方式,即 Static 的 PV 管理方式,在删除 PV 时需要按如下流程执行操作:

删除使用这个 PV 的 Pod;从宿主机移除本地磁盘(比如,umount 它);删除 PVC;删除 PV。 多副本下使用Local Persistent Volume

StatefulSet在多副本情况下我们需要考虑一下几个问题:

多副本情况下怎么动态声明PVC动态声明的PVC怎么与PV绑定

有了上面的演示,下面给出一个多副本的StatefulSet yaml配置:

apiVersion: apps/v1kind: StatefulSetmetadata: name: example-pv-statefulset labels: app.kubernetes.io/name: example-pv-statefulsetspec: serviceName: "local-service" replicas: 2 selector: matchLabels: app.kubernetes.io/name: example-pv-statefulset template: metadata: labels: app.kubernetes.io/name: example-pv-statefulset spec: containers: - name: example-pv-statefulset-container image: nginx imagePullPolicy: IfNotPresent command: ["nginx", "-g", "daemon off;"] ports: - name: "http-server" containerPort: 80 protocol: TCP volumeMounts: - mountPath: "/usr/share/nginx/html" name: local-vol volumeClaimTemplates: - metadata: name: local-vol spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "local-storage" resources: requests: storage: 1G 通过配置文件可以看出使用volumeClaimTemplates模板可以动态声明PVCPVC与PV必须要延迟绑定,上面提到的Pod在进入调度之后,"绑定"操作才开始

执行上面yaml文件,如下所示:

$ kubectl apply -f local-statefulset.yamlstatefulset.apps/example-pv-statefulset created$ kubectl get podsexample-pv-statefulset-0 1/1 Running 0 8sexample-pv-statefulset-1 1/1 Running 0 5s$ kubectl get pvclocal-vol-example-pv-statefulset-0 Bound example-pv-0 1Gi RWO local-storage 15slocal-vol-example-pv-statefulset-1 Bound example-pv-1 1Gi RWO local-storage 12s

参考文献

极客时间《深入剖析Kubernetes》29讲|PV、PVC体系是不是多此一举?从本地持久化卷谈起Local Persistent Volumes for Kubernetes Goes Beta深度解析Kubernetes Local Persistent Volume(一)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。