open-local部署和使用

打印 上一主题 下一主题

主题 893|帖子 893|积分 2679


Open-Local简介


Open-local 是阿里巴巴开源,由多个组件构成的本地磁盘管理系统,目标是解决当前kubernetes本地存储能力缺失问题。
Open-Local包含四大类组件:

•        Scheduler-Extender: 作为 Kubernetes Scheduler 的扩展组件,通过 Extender 方式实现,新增本地存储调度算法
•        CSI: 按照 CSI(Container Storage Interface) 标准实现本地磁盘管理能力
•        Agent: 运行在集群中的每个节点,根据配置清单初始化存储设备,并通过上报集群中本地存储设备信息以供 Scheduler-Extender 决策调度
•        Controller: 获取集群存储初始化配置,并向运行在各个节点的 Agent 下发详细的配置清单

架构图

 
 
 
 
Open-Local部署


方式1、Ack-distro 部署k8s,自带open-local(阿里巴巴二次开发的)


前期准备:(前期准备过程略)
        基于redhat和debian的linux发行版(本次实验使用centos7.9)
        LVM2+
        docker-ce版本:19.03.15
        集群中至少有一个空闲块设备用来测试
        Ack-distro

Ack-distro作为完整的kubernetes发行版,通过阿里巴巴开源的应用打包交付工具sealer,可以简单,快速的交付到离线环境,帮助使用者更简单、敏捷地管理自己的集群。Ack-distro 部署时会默认安装open-local。
 
安装sealer


(前提:需要docker-ce版本:19.03.15)
上传压缩包,解压到/usr/bin目录  (压缩包需要github或者网上找)
tar -zxvf sealer-latest-linux-amd64.tar.gz
cp sealer /usr/bin/
上传sealer部署k8s集群所需的镜像包ackdistro.tar  (压缩包需要github或者网上找)
sealer load -i ackdistro.tar
 
部署k8s


sealer run ack-agility-registry.cn-shanghai.cr.aliyuncs.com/ecp_builder/ackdistro:v1-20-4-ack-5 -m 10.0.101.89 -p asdfasdf..
-m 后面参数是k8s的masterIP
-p 后面参数是masterIP的root密码
(如果报错时间同步有问题,可以用:
sealer run ack-agility-registry.cn-shanghai.cr.aliyuncs.com/ecp_builder/ackdistro:v1-20-4-ack-5 -m 10.0.101.89 -p asdfasdf.. --env IgnoreErrors="OS;TimeSyncService")
完成之后,可以看到版本

 
 
 
查看open-local

 
 
 
支持的存储驱动


 
 
 

使用open-local



新增VG


首先新增LV
fdisk /dev/vdb
fdisk -l
pvcreate /dev/vdb1
pvscan
vgcreate -s 32M open-local-pool-1 /dev/vdb1
vgdisplay


 
 
 
存储初始化配置

(如果上面新建的名字就是open-local-pool-1,这个步骤可以省略)
首先kubectl get nlsc 查一下name

 
 

编辑nlsc:
kubectl edit nlsc yoda
文件内容中的open-local-pool-[0-9]+ 改为你新建的pv名字。加号+保留

 
 
 
创建一个Statefulset,使用已有的存储类模板
  1. [root@laijx-k8s-test1 tmp]# cat sts-nginx.yaml  
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: nginx-lvm
  6.   labels:
  7.     app: nginx-lvm
  8. spec:
  9.   ports:
  10.   - port: 80
  11.     name: web
  12.   clusterIP: None
  13.   selector:
  14.     app: nginx-lvm
  15. ---
  16. apiVersion: apps/v1
  17. kind: StatefulSet
  18. metadata:
  19.   name: nginx-lvm
  20. spec:
  21.   selector:
  22.     matchLabels:
  23.       app: nginx-lvm
  24.   podManagementPolicy: Parallel
  25.   serviceName: "nginx-lvm"
  26.   replicas: 1
  27.   volumeClaimTemplates:
  28.   - metadata:
  29.       name: html
  30.     spec:
  31.       accessModes:
  32.         - ReadWriteOnce
  33.       storageClassName: yoda-lvm-xfs
  34.       resources:
  35.         requests:
  36.           storage: 5Gi
  37.   template:
  38.     metadata:
  39.       labels:
  40.         app: nginx-lvm
  41.     spec:
  42.       tolerations:
  43.         - key: node-role.kubernetes.io/master
  44.           operator: Exists
  45.           effect: NoSchedule
  46.       containers:
  47.       - name: nginx
  48.         image: 10.0.103.102/laijxtest/nginx:v1.23
  49.         imagePullPolicy: IfNotPresent
  50.         volumeMounts:
  51.         - mountPath: "/data"
  52.           name: html
  53.         command:
  54.         - sh
  55.         - "-c"
  56.         - |
  57.             while true; do
  58.               echo "huizhi testing";
  59.               echo "yes ">>/data/yes.txt;
  60.               sleep 120s
  61.             done;
复制代码
View Code 

启动
Kubectl apply –f sts-nginx.yaml
现在可以看到已经创建了pv和pvc

 
 
 

扩容



kubectl patch pvc html-nginx-lvm-0 -p '{"spec":{"resources":{"requests":{"storage":"10Gi"}}}}'
将5G扩容为10G
Pvc需要等两分钟左右会显示变更为10G

 
 
 

进入容器查看挂载情况

 
 
 
 
删除pod,验证持久化存储

 
 
 
  
 
 

方式2、Helm安装open-local



前期准备:(具体准备过程略)



        基于redhat和debian的linux发行版(本次实验使用centos7.9)
        Kubernetes V1.20+ (如果有老版本的k8s,可能要先升级k8s版本)
        LVM2+
        Helm3.0+
        集群中至少有一个空闲块设备用来测试

服务器:
Master 10.0.101.91
Node1 10.0.101.10
Node2 10.0.101.92

首先在三台服务器安装docker-ce-20.10.6(我的操作环境是内网的,有外网的话会简单很多,直接yum)



上传安装包,通过yum安装已经准备好的rpm包
yum localinstall -y ./*

 
 
 

编辑配置文件
  1. Vim  /etc/docker/daemon.json
  2. {
  3. "storage-driver": "overlay2",
  4. "storage-opts": [
  5. "overlay2.override_kernel_check=true"],
  6. "insecure-registries" : ["10.0.103.102"],
  7. "exec-opts": ["native.cgroupdriver=systemd"],
  8. "log-driver": "json-file",
  9. "log-opts": {
  10.   "max-size": "100m",
  11.   "max-file": "3"
  12. }
  13. }
  14. systemctl start  docker
  15. systemctl enable docker
复制代码
 
 
安装k8s 1.22.4


Master:



上传rpm压缩包,解压,安装
unzip k8s-1.22.4.rpm.zip
yum localinstall -y ./*

 
 
 
 
echo "net.bridge.bridge-nf-call-iptables = 1" > /etc/sysctl.d/k8s.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf
 

导入k8s初始化需要的镜像包,并打标签(有外网的话这步可以跳过)


unzip k8simages.zip
docker load < coredns.tar
docker image

 
 
 
docker load < etcd.tar
docker load < pause.tar
docker load < kube-apiserver.tar
docker load < kube-controller-manager.tar
docker load < kube-proxy.tar
docker load < kube-scheduler.tar
docker tag 8a5cc299272d k8s.gcr.io/kube-apiserver:v1.22.4
docker tag 0ce02f92d3e4 k8s.gcr.io/kube-controller-manager:v1.22.4
docker tag 721ba97f54a6 k8s.gcr.io/kube-scheduler:v1.22.4
docker tag edeff87e4802 k8s.gcr.io/kube-proxy:v1.22.4
docker tag 8d147537fb7d k8s.gcr.io/coredns/coredns:v1.8.4
docker tag 004811815584 k8s.gcr.io/etcd:3.5.0-0
docker tag ed210e3e4a5b k8s.gcr.io/pause:3.5
 
systemctl start kubelet
systemctl enable kubelet
 
开始初始化

kubeadm init --kubernetes-version=v1.22.4 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
初始化完成之后执行:export KUBECONFIG=/etc/kubernetes/admin.conf
记录加入集群的命令,后面要用
kubeadm join 10.0.101.91:6443 --token ffvff0.bf7e0urhj0sys1ka --discovery-token-ca-cert-hash sha256:d7488bc4f02d96c359e322bef5097ff7d59d8ee31e6560011594f37bc0c0e29f
 
 
两台node节点操作:

上传rpm压缩包,解压,安装
unzip k8s-1.22.4.rpm.zip
yum localinstall -y ./*
echo "net.bridge.bridge-nf-call-iptables = 1" > /etc/sysctl.d/k8s.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf
systemctl start kubelet
systemctl enable kubelet
加入集群
kubeadm join 10.0.101.91:6443 --token ffvff0.bf7e0urhj0sys1ka --discovery-token-ca-cert-hash sha256:d7488bc4f02d96c359e322bef5097ff7d59d8ee31e6560011594f37bc0c0e29f
 
 

安装flannel



三台服务器操作:


导入flannel镜像包
Unzip flannel.zip
cd flannel/
docker load < flannel.tar
docker load < flannel-cni-plugin.tar

 
 
 

Master操作:


kubectl apply -f kube-flannel.yml
  1. [root@laijx-k8s-test1 ~]# cat  k8s/kube-flannel.yml
  2. ---
  3. kind: Namespace
  4. apiVersion: v1
  5. metadata:
  6.   name: kube-flannel
  7.   labels:
  8.     pod-security.kubernetes.io/enforce: privileged
  9. ---
  10. kind: ClusterRole
  11. apiVersion: rbac.authorization.k8s.io/v1
  12. metadata:
  13.   name: flannel
  14. rules:
  15. - apiGroups:
  16.   - ""
  17.   resources:
  18.   - pods
  19.   verbs:
  20.   - get
  21. - apiGroups:
  22.   - ""
  23.   resources:
  24.   - nodes
  25.   verbs:
  26.   - list
  27.   - watch
  28. - apiGroups:
  29.   - ""
  30.   resources:
  31.   - nodes/status
  32.   verbs:
  33.   - patch
  34. ---
  35. kind: ClusterRoleBinding
  36. apiVersion: rbac.authorization.k8s.io/v1
  37. metadata:
  38.   name: flannel
  39. roleRef:
  40.   apiGroup: rbac.authorization.k8s.io
  41.   kind: ClusterRole
  42.   name: flannel
  43. subjects:
  44. - kind: ServiceAccount
  45.   name: flannel
  46.   namespace: kube-flannel
  47. ---
  48. apiVersion: v1
  49. kind: ServiceAccount
  50. metadata:
  51.   name: flannel
  52.   namespace: kube-flannel
  53. ---
  54. kind: ConfigMap
  55. apiVersion: v1
  56. metadata:
  57.   name: kube-flannel-cfg
  58.   namespace: kube-flannel
  59.   labels:
  60.     tier: node
  61.     app: flannel
  62. data:
  63.   cni-conf.json: |
  64.     {
  65.       "name": "cbr0",
  66.       "cniVersion": "0.3.1",
  67.       "plugins": [
  68.         {
  69.           "type": "flannel",
  70.           "delegate": {
  71.             "hairpinMode": true,
  72.             "isDefaultGateway": true
  73.           }
  74.         },
  75.         {
  76.           "type": "portmap",
  77.           "capabilities": {
  78.             "portMappings": true
  79.           }
  80.         }
  81.       ]
  82.     }
  83.   net-conf.json: |
  84.     {
  85.       "Network": "10.244.0.0/16",
  86.       "Backend": {
  87.         "Type": "vxlan"
  88.       }
  89.     }
  90. ---
  91. apiVersion: apps/v1
  92. kind: DaemonSet
  93. metadata:
  94.   name: kube-flannel-ds
  95.   namespace: kube-flannel
  96.   labels:
  97.     tier: node
  98.     app: flannel
  99. spec:
  100.   selector:
  101.     matchLabels:
  102.       app: flannel
  103.   template:
  104.     metadata:
  105.       labels:
  106.         tier: node
  107.         app: flannel
  108.     spec:
  109.       affinity:
  110.         nodeAffinity:
  111.           requiredDuringSchedulingIgnoredDuringExecution:
  112.             nodeSelectorTerms:
  113.             - matchExpressions:
  114.               - key: kubernetes.io/os
  115.                 operator: In
  116.                 values:
  117.                 - linux
  118.       hostNetwork: true
  119.       priorityClassName: system-node-critical
  120.       tolerations:
  121.       - operator: Exists
  122.         effect: NoSchedule
  123.       serviceAccountName: flannel
  124.       initContainers:
  125.       - name: install-cni-plugin
  126.        #image: flannelcni/flannel-cni-plugin:v1.1.0 for ppc64le and mips64le (dockerhub limitations may apply)
  127.         image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0
  128.         command:
  129.         - cp
  130.         args:
  131.         - -f
  132.         - /flannel
  133.         - /opt/cni/bin/flannel
  134.         volumeMounts:
  135.         - name: cni-plugin
  136.           mountPath: /opt/cni/bin
  137.       - name: install-cni
  138.        #image: flannelcni/flannel:v0.19.2 for ppc64le and mips64le (dockerhub limitations may apply)
  139.         image: docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2
  140.         command:
  141.         - cp
  142.         args:
  143.         - -f
  144.         - /etc/kube-flannel/cni-conf.json
  145.         - /etc/cni/net.d/10-flannel.conflist
  146.         volumeMounts:
  147.         - name: cni
  148.           mountPath: /etc/cni/net.d
  149.         - name: flannel-cfg
  150.           mountPath: /etc/kube-flannel/
  151.       containers:
  152.       - name: kube-flannel
  153.        #image: flannelcni/flannel:v0.19.2 for ppc64le and mips64le (dockerhub limitations may apply)
  154.         image: docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2
  155.         command:
  156.         - /opt/bin/flanneld
  157.         args:
  158.         - --ip-masq
  159.         - --kube-subnet-mgr
  160.         resources:
  161.           requests:
  162.             cpu: "100m"
  163.             memory: "50Mi"
  164.           limits:
  165.             cpu: "100m"
  166.             memory: "50Mi"
  167.         securityContext:
  168.           privileged: false
  169.           capabilities:
  170.             add: ["NET_ADMIN", "NET_RAW"]
  171.         env:
  172.         - name: POD_NAME
  173.           valueFrom:
  174.             fieldRef:
  175.               fieldPath: metadata.name
  176.         - name: POD_NAMESPACE
  177.           valueFrom:
  178.             fieldRef:
  179.               fieldPath: metadata.namespace
  180.         - name: EVENT_QUEUE_DEPTH
  181.           value: "5000"
  182.         volumeMounts:
  183.         - name: run
  184.           mountPath: /run/flannel
  185.         - name: flannel-cfg
  186.           mountPath: /etc/kube-flannel/
  187.         - name: xtables-lock
  188.           mountPath: /run/xtables.lock
  189.       volumes:
  190.       - name: run
  191.         hostPath:
  192.           path: /run/flannel
  193.       - name: cni-plugin
  194.         hostPath:
  195.           path: /opt/cni/bin
  196.       - name: cni
  197.         hostPath:
  198.           path: /etc/cni/net.d
  199.       - name: flannel-cfg
  200.         configMap:
  201.           name: kube-flannel-cfg
  202.       - name: xtables-lock
  203.         hostPath:
  204.           path: /run/xtables.lock
  205.           type: FileOrCreate
复制代码
View Code 
正常部署flannel之后,集群node状态正常

 
 
 
部署个nginx测试一下
kubectl apply -f .

 
 
 
Pod部署正常。
 
 
部署helm3.7


tar -zxvf helm-v3.7.2-linux-amd64.tar.gz
cd linux-amd64/
mv helm /usr/bin/
helm version


 
 
 
 

Helm安装open-local



准备yaml文件


Helm安装open-local需要一些yaml文件,我已从github下载
open-local-main.zip

 
 
 

并且,由于我们是内网,所以需要将yaml文件中的镜像拉取策略由always改为ifnotpresent,并提前准备好镜像。
grep -C 2 -r image `find ./ -name "*.yaml"`
sed -i 's/imagePullPolicy:\ Always/imagePullPolicy:\ IfNotPresent/g' ./templates/*
 
准备镜像

通过helm安装open-local之前,需要将用到的镜像手动导入到docker
Unzip open-local-images.zip
导入镜像
for i in `ls` ;do docker load < $i;done


 
 
 
开始安装open-local

cd open-local-main
helm install open-local ./helm
观察进度
kubectl get pod –A

 
 
 
大概几分钟之后,我们就能看到需要的open-local已经部署完成了。且使用 kubectl get sc 能够看到目前支持的存储驱动类型
 
 
 
 
 
 
 
 
 
Open-local使用

创建样例pv和pvc,以供参考

参考open-local官方文档,创建一个StatefulSet 的同时创建pv和pvc:
  1. [root@laijx-k8s-test1 tmp]# cat sts-nginx.yaml  
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: nginx-lvm
  6.   labels:
  7.     app: nginx-lvm
  8. spec:
  9.   ports:
  10.   - port: 80
  11.     name: web
  12.   clusterIP: None
  13.   selector:
  14.     app: nginx-lvm
  15. ---
  16. apiVersion: apps/v1
  17. kind: StatefulSet
  18. metadata:
  19.   name: nginx-lvm
  20. spec:
  21.   selector:
  22.     matchLabels:
  23.       app: nginx-lvm
  24.   podManagementPolicy: Parallel
  25.   serviceName: "nginx-lvm"
  26.   replicas: 1
  27.   volumeClaimTemplates:
  28.   - metadata:
  29.       name: html
  30.     spec:
  31.       accessModes:
  32.         - ReadWriteOnce
  33.       storageClassName: yoda-lvm-xfs
  34.       resources:
  35.         requests:
  36.           storage: 5Gi
  37.   template:
  38.     metadata:
  39.       labels:
  40.         app: nginx-lvm
  41.     spec:
  42.       tolerations:
  43.         - key: node-role.kubernetes.io/master
  44.           operator: Exists
  45.           effect: NoSchedule
  46.       containers:
  47.       - name: nginx
  48.         image: 10.0.103.102/laijxtest/nginx:v1.23
  49.         imagePullPolicy: IfNotPresent
  50.         volumeMounts:
  51.         - mountPath: "/data"
  52.           name: html
  53.         command:
  54.         - sh
  55.         - "-c"
  56.         - |
  57.             while true; do
  58.               echo "huizhi testing";
  59.               echo "yes ">>/data/yes.txt;
  60.               sleep 120s
  61.             done;
复制代码
View Code 
在已有的pv和pvc的yaml文档进行修改,创建我们自己想要的新的pv和pvc

(或者你也可以直接将这个部署单元删除,然后其他的部署单元可以使用这个样例pv和pvc了)
kubectl get pv -o yaml

 
 
 

新建pv文件pv01.yaml,将uid,creationTimestamp注释掉,并修改name:


  1. [root@laijx-k8s-test1 k8s]# cat  pv01.yaml
  2. apiVersion: v1
  3. items:
  4. - apiVersion: v1
  5.   kind: PersistentVolume
  6.   metadata:
  7.     annotations:
  8.       pv.kubernetes.io/provisioned-by: local.csi.aliyun.com
  9. #    creationTimestamp: "2022-10-08T01:37:50Z"
  10.     finalizers:
  11.     - kubernetes.io/pv-protection
  12.     name: pv01
  13.     resourceVersion: "1941146"
  14. #    uid: f91ffa5b-e4dc-42ed-8855-f6420b0979b4
  15.   spec:
  16.     accessModes:
  17.     - ReadWriteOnce
  18.     capacity:
  19.       storage: 5Gi
  20.     claimRef:
  21. #      apiVersion: v1
  22. #      kind: PersistentVolumeClaim
  23. #      name: pvc01
  24. #      namespace: default
  25. #      resourceVersion: "1941140"
  26. #      uid: f8bbc82b-a781-4116-9bdd-59346b8d4240
  27.     csi:
  28.       driver: local.csi.aliyun.com
  29.       fsType: ext4
  30.       volumeAttributes:
  31.         csi.storage.k8s.io/pv/name: pv01
  32.         csi.storage.k8s.io/pvc/name: pvc01
  33.         csi.storage.k8s.io/pvc/namespace: default
  34.         storage.kubernetes.io/csiProvisionerIdentity: 1664262928261-8081-local.csi.aliyun.com
  35.         vgName: open-local-pool-0
  36.         volume.kubernetes.io/selected-node: laijx-k8s-test2
  37.         volumeType: LVM
  38.       volumeHandle: pv01
  39.     nodeAffinity:
  40.       required:
  41.         nodeSelectorTerms:
  42.         - matchExpressions:
  43.           - key: kubernetes.io/hostname
  44.             operator: In
  45.             values:
  46.             - laijx-k8s-test2
  47.     persistentVolumeReclaimPolicy: Delete
  48.     storageClassName: open-local-lvm
  49.     volumeMode: Filesystem
  50.   status:
  51.     phase: Bound
  52. kind: List
  53. metadata:
  54.   resourceVersion: ""
  55.   selfLink: ""
复制代码
View Code 
 
claimRef:这个字段要注释掉,否则pv会认为已经绑定了pvc,导致报错Bound claim has lost its PersistentVolume


 
 

新建pvc文件pvc01.yaml,将uid,creationTimestamp注释掉,并修改name:



 
 

修改后的文件如下:
  1. [root@laijx-k8s-test1 k8s]# cat pvc01.yaml
  2. apiVersion: v1
  3. items:
  4. - apiVersion: v1
  5.   kind: PersistentVolumeClaim
  6.   metadata:
  7.     annotations:
  8.       pv.kubernetes.io/bind-completed: "yes"
  9.       pv.kubernetes.io/bound-by-controller: "yes"
  10.       volume.beta.kubernetes.io/storage-provisioner: local.csi.aliyun.com
  11.       volume.kubernetes.io/selected-node: laijx-k8s-test2
  12. #    creationTimestamp: "2022-10-08T01:37:49Z"
  13.     finalizers:
  14.     - kubernetes.io/pvc-protection
  15.     labels:
  16.       app: pv01
  17.     name: pvc01
  18.     namespace: default
  19.     resourceVersion: "1941148"
  20. #    uid: f8bbc82b-a781-4116-9bdd-59346b8d4240
  21.   spec:
  22.     accessModes:
  23.     - ReadWriteOnce
  24.     resources:
  25.       requests:
  26.         storage: 5Gi
  27.     storageClassName: open-local-lvm
  28.     volumeMode: Filesystem
  29.     volumeName: pv01
  30.   status:
  31.     accessModes:
  32.     - ReadWriteOnce
  33.     capacity:
  34.       storage: 5Gi
  35.     phase: Bound
  36. kind: List
  37. metadata:
  38.   resourceVersion: ""
  39.   selfLink: ""
复制代码
View Code 
 
创建pv、pvc

kubectl apply -f pvc01.yaml -f pv01.yaml

 
 

storageClassName若指定 open-local-lvm,则创建的文件系统为ext4,
若指定open-local-lvm-xfs,则创建的文件系统为xfs
 
 

使用pv和pvc


在部署单元中使用创建的pvc
  1. [root@laijx-k8s-test1 k8s]# cat tomcat7-lvm.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: tomcat7-2
  6. spec:
  7.   replicas: 1
  8.   selector:
  9.     matchLabels:
  10.       app: tomcat7-2
  11.   template:
  12.     metadata:
  13.       labels:
  14.         app: tomcat7-2
  15.     spec:
  16.       containers:
  17.       - name: tomcat7-2
  18.         image: 10.0.103.102/laijxtest/tomcat7:v1
  19.         ports:
  20.         - containerPort: 80
  21.         command:
  22.         - sh
  23.         - "-c"
  24.         - |
  25.             while true; do
  26.               echo "laijx testing";
  27.               echo "yes ">>/tmp/yes.txt;
  28.               sleep 120s
  29.             done;
  30.         volumeMounts:
  31.         - mountPath: /data/
  32.           name: tomcat7-lvm
  33.       volumes:
  34.       - name: tomcat7-lvm
  35.         persistentVolumeClaim:
  36.           claimName: pvc01
  37. ---
  38. apiVersion: v1
  39. kind: Service
  40. metadata:
  41.   name: tomcat7-2
  42. spec:
  43.   ports:
  44.   - name: tomcat7-2-svc
  45.     port: 8080
  46.     targetPort: 8080
  47.     nodePort: 31124
  48.   selector:
  49.     app: tomcat7-2
  50.   type: NodePort
复制代码
View Code 
 

启动部署单元:
kubectl apply -f tomcat7-lvm.yaml

 
 
进入容器可以看到,/data路径已经成功挂载

 
 

验证持久化:


进入容器cp /tmp/yes.txt /data/ 然后重启pod,再次观察文件是否还在:

 
 持久化正常。
 
扩容pvc

kubectl patch pvc html-nginx-lvm-0 -p '{"spec":{"resources":{"requests":{"storage":"10Gi"}}}}'
 
 
 
 参考文档:
https://github.com/alibaba/open-local/tree/main/docs
https://developer.aliyun.com/article/790208  Open-Local - 云原生本地磁盘管理系统
https://segmentfault.com/a/1190000042291703     如何通过 open-local 玩转容器本地存储? | 龙蜥技术
https://www.luozhiyun.com/archives/335    深入k8s:持久卷PV、PVC及其源码分析

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表