k8s查看磁盘挂载情况
要查看Kubernetes集群中Pod使用的卷及其挂载情况,可以使用以下命令:
列出集群中所有Pod及其挂载的卷:
1 kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.name}{"("}{.hostPath.path}{")"}{" "}{end}{end}'
这将输出每个Pod名称以及该Pod挂载的卷名称和卷在节点上的hostPath。
查看指定Pod中卷的具体挂载情况:
1 kubectl describe pod <pod-name> -n <namespace>
在返回结果的”Volumes”部分,可以看到该Pod使用的每个卷的类型、大小、挂载路径等详细信息。
查看Kubernetes节点上的挂载情况:
1 kubectl get nodes -o=jsonpath='{range .items[*]}{"\nNode: "{.metadata.name}{"\n"}{range .metadata.annotations}{\"{@key}=\"{@value}\"}{" "}{end}{end}'
这将输出每个节点上的所有挂载点及其注释信息。
需要注意的是,以上命令仅显示Kubernetes管理的卷挂载情况,如果您使用了其他方式手动挂载卷,需要在节点上使用常规的Linux命令(如df、mount等)来查看具体挂载情况。
在testnet这台机器上:
1 kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.name}{"("}{.hostPath.path}{")"}{" "}{end}{end}'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 demo-taskon-xyz-bench-web-795f4db85b-wctl9: kube-api-access-sjzr2() etcd-0: etcd-data() kube-api-access-vctrv() release-name-rabbitmq-0: data() configuration() kube-api-access-gz6gc() reverse-proxy-l1-polygon-d87b98cd9-gxqrl: kube-api-access-k6qgj() reverse-proxy-l2-polygon-normal-7ffccc54c-hk7ld: config-volume() kube-api-access-rx777() taskon-airdrop-nft-token-65b6dbddbf-fq9xs: eth-config-volume() configjson-volume() kube-api-access-qzlhl() taskon-demo-backend-786f7d68f4-x4vv2: configjson-volume() uploaddata() kube-api-access-qvg4t() taskon-download-5ccb96864c-pmpkk: configjson-volume() downloaddata() kube-api-access-gvgxl() taskon-gas-station-54f6f74c5f-zbxgh: configjson-volume() eth-config-volume() logdata() kube-api-access-bqknk() taskon-reward-d7fbb54b6-jgjzk: configjson-volume() uploaddata() kube-api-access-fbrqj() taskon-schedule-555cf978f7-mxwtn: configjson-volume() kube-api-access-tsvmr() taskon-sign-server-5fcc979f95-d5q8p: configjson-volume() keystore-volume() kube-api-access-4p44g() taskon-testnet-redis-76f8cb66d8-lfvd5: config() kube-api-access-xc9nd() ingress-nginx-admission-create--1-568k9: kube-api-access-gkmw6() ingress-nginx-admission-patch--1-665qc: kube-api-access-77g9k() ingress-nginx-controller-8c675bd6c-x8qps: webhook-cert() kube-api-access-9fx9v() coredns-84c9f96f76-dg9x5: config-volume() kube-api-access-562km() coredns-84c9f96f76-tl5l7: config-volume() kube-api-access-x4s7x() csi-cbs-controller-7b75b77c65-gqppb: socket-dir() kube-api-access-b4fqz() csi-cbs-node-jrpcf: plugin-dir(/var/lib/kubelet/plugins/com.tencent.cloud.csi.cbs) registration-dir(/var/lib/kubelet/plugins_registry/) plugins-mount-dir(/var/lib/kubelet/plugins) pods-mount-dir(/var/lib/kubelet/pods) host-dev(/dev) host-sys(/sys) lib-modules(/lib/modules) kube-api-access-hzz2x() csi-cbs-node-nkjd7: plugin-dir(/var/lib/kubelet/plugins/com.tencent.cloud.csi.cbs) registration-dir(/var/lib/kubelet/plugins_registry/) plugins-mount-dir(/var/lib/kubelet/plugins) pods-mount-dir(/var/lib/kubelet/pods) host-dev(/dev) host-sys(/sys) lib-modules(/lib/modules) kube-api-access-h4hx7() ip-masq-agent-cnkfj: tz-config(/etc/localtime) config() lib-modules(/lib/modules) kube-api-access-hjqhw() ip-masq-agent-wkq76: tz-config(/etc/localtime) config() lib-modules(/lib/modules) kube-api-access-zb5c2() kube-proxy-9567z: tz-config(/etc/localtime) xtables-lock(/run/xtables.lock) lib-modules(/lib/modules) kubeconfig() proc(/proc) kube-api-access-gcpnc() kube-proxy-zq9nm: tz-config(/etc/localtime) xtables-lock(/run/xtables.lock) lib-modules(/lib/modules) kubeconfig() proc(/proc) kube-api-access-brfpr() l7-lb-controller-7554c997f6-rmx6t: kube-api-access-9jvs2() tke-bridge-agent-b8hvr: cni-bin-dir(/opt/cni/bin) cni-net-dir(/etc/cni/net.d) modules-dir(/lib/modules) cri-sock-dir(/var/run) cni-path(/var/lib/cni/networks/tke-bridge) kube-api-access-swb2w() tke-bridge-agent-fv6vq: cni-bin-dir(/opt/cni/bin) cni-net-dir(/etc/cni/net.d) modules-dir(/lib/modules) cri-sock-dir(/var/run) cni-path(/var/lib/cni/networks/tke-bridge) kube-api-access-cx8gr() tke-cni-agent-gc5gn: cni-bin-dir(/opt/cni/bin) cni-net-dir(/etc/cni/net.d) kube-conf-dir(/etc/kubernetes) tke-cni-agent-conf() kube-api-access-jsnfx() tke-cni-agent-vvv5h: cni-bin-dir(/opt/cni/bin) cni-net-dir(/etc/cni/net.d) kube-conf-dir(/etc/kubernetes) tke-cni-agent-conf() kube-api-access-rf4vp() tke-monitor-agent-tnqkg: tz(/etc/localtime) hostrootpath(/) proc-info(/proc) kube-api-access-sjqtr() tke-monitor-agent-tsxtz: tz(/etc/localtime) hostrootpath(/) proc-info(/proc) kube-api-access-gd5f8()
如何查看某个特定namespace下的挂载情况?
要查看某个特定namespace下Pod使用的卷及其挂载情况,可以在上述命令中加入-n参数指定namespace:
列出指定namespace下所有Pod及其挂载卷:
1 kubectl get pods -n <namespace> -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.name}{"("}{.hostPath.path}{")"}{" "}{end}{end}'
查看指定namespace下某个Pod中卷的详细挂载信息:
1 kubectl describe pod <pod-name> -n <namespace>
查看节点上与该namespace相关的卷挂载:
1 kubectl get pods -n <namespace> -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.hostPath.path}{" "}{"("}{.name}{")"}{end}{end}' | awk '{print $2}' | xargs -I{} grep {} /proc/mounts
这条命令先获取namespace下所有Pod挂载卷在节点上的hostPath路径,然后用grep查找/proc/mounts中匹配这些路径的挂载信息。
需要注意的是,Kubernetes的存储卷可以通过多种形式提供,如hostPath、NFS、云存储等,上述命令主要关注hostPath形式的本地挂载。对于其他存储类型,可能需要特定的查看方式。
kubectl get pods -n benchtaskon -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.name}{"("}{.hostPath.path}{")"}{" "}{end}{end}'
输出为:
1 2 3 4 5 6 7 8 9 10 11 12 13 demo-taskon-xyz-bench-web-795f4db85b-wctl9: kube-api-access-sjzr2() etcd-0: etcd-data() kube-api-access-vctrv() release-name-rabbitmq-0: data() configuration() kube-api-access-gz6gc() reverse-proxy-l1-polygon-d87b98cd9-gxqrl: kube-api-access-k6qgj() reverse-proxy-l2-polygon-normal-7ffccc54c-hk7ld: config-volume() kube-api-access-rx777() taskon-airdrop-nft-token-65b6dbddbf-fq9xs: eth-config-volume() configjson-volume() kube-api-access-qzlhl() taskon-demo-backend-786f7d68f4-x4vv2: configjson-volume() uploaddata() kube-api-access-qvg4t() taskon-download-5ccb96864c-pmpkk: configjson-volume() downloaddata() kube-api-access-gvgxl() taskon-gas-station-54f6f74c5f-zbxgh: configjson-volume() eth-config-volume() logdata() kube-api-access-bqknk() taskon-reward-d7fbb54b6-jgjzk: configjson-volume() uploaddata() kube-api-access-fbrqj() taskon-schedule-555cf978f7-mxwtn: configjson-volume() kube-api-access-tsvmr() taskon-sign-server-5fcc979f95-d5q8p: configjson-volume() keystore-volume() kube-api-access-4p44g() taskon-testnet-redis-76f8cb66d8-lfvd5: config() kube-api-access-xc9nd()
对于taskon线上环境:
kubectl get pods -n taskon -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.name}{"("}{.hostPath.path}{")"}{" "}{end}{end}'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 airdrop-backend-6c47c9594d-vlgm6: eth-config-volume() configjson-volume() kube-api-access-dp565() etcd-0: etcd-data() kube-api-access-hhcwq() etcd-1: etcd-data() kube-api-access-tx7h5() etcd-2: etcd-data() kube-api-access-qsl2x() extension-taskon-web-759c96df4d-cs5dg: kube-api-access-9mtts() mysql-exporter-exporter-6d8966b7b8-bpxf9: my-cnf() kube-api-access-6mg44() mysql-ro0-exporter-exporter-8478844bfb-5ch97: my-cnf() kube-api-access-bwsx9() mysql-ro1-exporter-exporter-687b9658d5-qsfc2: my-cnf() kube-api-access-9x99q() taskon-admin-python-68f9ffccd9-2sx6h: kube-api-access-cmcnx() taskon-airdrop-nft-token-65b6dbddbf-hvv8f: eth-config-volume() configjson-volume() kube-api-access-hq7nx() taskon-backend-db-76bcb6d7f8-lbk96: mysql-persistent-storage() config-volume() kube-api-access-ddncr() taskon-backend-golang-withlog-xxl-6c5769db7-4j542: ont-config-volume() eth-config-volume() configjson-volume() uploaddata() kube-api-access-ldzvl() taskon-docs-web-65685f4c98-k4rbt: kube-api-access-j57zw() taskon-download-6d655d55c8-lbl9v: configjson-volume() downloaddata() kube-api-access-bvpg5() taskon-event-tracker-5c65f58f58-shqps: configjson-volume() kube-api-access-5sf8z() taskon-extension-backend-golang-6ccc47456d-v447l: configjson-volume() helpjson-volume() uploaddata() kube-api-access-qrzdz() taskon-gas-station-744ff57fcf-w2jtf: configjson-volume() eth-config-volume() logdata() kube-api-access-p7qr7() taskon-operation-bot-675c8885d7-fz9tp: kube-api-access-6sgtl() taskon-operation-off-chain-979f9b6fb-s7t55: kube-api-access-h9jdk() taskon-operation-web-preview-bbbb589fd-mw5lm: kube-api-access-qpmpn() taskon-payment-66ccf696b6-v6hgl: configjson-volume() kube-api-access-kgkn7() taskon-public-api-7778bb87d4-snlbw: kube-api-access-w2pbz() taskon-redis-buy-exporter-5c5c58578d-cdgph: kube-api-access-km462() taskon-reward-58d7cffb9f-95tbg: configjson-volume() uploaddata() kube-api-access-m9ffc() taskon-schedule-5658bfb8b5-fvftp: configjson-volume() uploaddata() kube-api-access-jz89p() taskon-sign-server-6b687cb5db-xbs5k: configjson-volume() uploaddata() kube-api-access-hlm4q() taskon-solana-scanner-7d869d4b84-tbzdk: configjson-volume() kube-api-access-mdq84() taskon-uni-auth-79d86b68bd-fs99d: kube-api-access-r5slb() universal-verification-55789f6b79-qr4rb: configjson-volume() kube-api-access-6p8p9() www-taskon-xyz-6657b9cb54-5fgdz: kube-api-access-dcc9d() www-taskon-xyz-6657b9cb54-dpxhg: kube-api-access-ngg4v() www-taskon-xyz-6657b9cb54-krr85: kube-api-access-nnsqc()
这个输出列出了当前namespace下所有Pod及其挂载的卷信息。
每一行都是一个Pod的名称,后面跟着”:”分隔,然后列出该Pod挂载的所有卷名称,卷名称后的圆括号中是该卷在节点上的主机路径(hostPath)。
例如:
1 taskon-backend-golang-withlog-xxl-6c5769db7-4j542: ont-config-volume() eth-config-volume() configjson-volume() uploaddata() kube-api-access-ldzvl()
这一行说明该Pod挂载了5个卷:
ont-config-volume
eth-config-volume
configjson-volume
uploaddata
kube-api-access-ldzvl
括号中的路径表示这些卷在节点上对应的主机目录路径。
这个输出让您一目了然该namespace下所有Pod使用的存储卷情况,并且可以查看每个卷在节点上的具体挂载位置,有助于存储使用和故障排查。
如何查看这些卷的大小,以及当前的空间使用情况 要查看这些卷的大小及当前空间使用情况,需要结合几个命令:
获取所有卷的主机路径
1 kubectl get pods -n <namespace> -o=jsonpath='{range .items[*]}{"\n"}{range .spec.volumes[*]}{.hostPath.path}{" "}{"("}{.name}{")"}{end}{end}' | awk '{print $1}' | sort -u
这个命令列出该namespace下所有Pod挂载卷在节点上的主机路径,并去重。
查看这些路径对应的磁盘分区大小及使用情况
1 df -h $(kubectl get pods -n <namespace> -o=jsonpath='{range .items[*]}{"\n"}{range .spec.volumes[*]}{.hostPath.path}{" "}{end}{end}' | awk '{print $1}' | sort -u)
这个命令将把第1步获取的路径作为df命令的输入参数,输出各个路径对应分区的总大小和已使用/可用空间等信息。
例如,对于给定的输出:
1 2 /var/lib/kubelet/pods/f7139201-1234/volumes/kubernetes.io~configmap/configjson-volume 8.0M 4.0K 7.9M 1% / /var/lib/kubelet/pods/f7139201-abcd/volumes/kubernetes.io~configmap/uploaddata 8.0M 4.0K 7.9M 1% /
说明 configjson-volume 和 uploaddata 这两个卷所在的磁盘分区总大小是8M,已使用4K,可用7.9M。
通过这种方式,你可以清楚查看到每个存储卷使用的底层磁盘空间情况。需要注意的是,有些卷可能使用网络存储而不是本地磁盘,对这些存储则需要使用其他工具查看使用情况。
kubectl get pods -n taskon -o=jsonpath='{range .items[*]}{"\n"}{range .spec.volumes[*]}{.hostPath.path}{" "}{"("}{.name}{")"}{end}{end}' | awk '{print $1}' | sort -u
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 (configjson-volume) (etcd-data) (eth-config-volume) (kube-api-access-6sgtl) (kube-api-access-9mtts) (kube-api-access-cmcnx) (kube-api-access-dcc9d) (kube-api-access-h9jdk) (kube-api-access-j57zw) (kube-api-access-km462) (kube-api-access-ngg4v) (kube-api-access-nnsqc) (kube-api-access-qpmpn) (kube-api-access-r5slb) (kube-api-access-w2pbz) (my-cnf) (mysql-persistent-storage) (ont-config-volume)
在testnet上面,kb get pods -o=jsonpath='{range .items[*]}{"\n"}{range .spec.volumes[*]}{.hostPath.path}{" "}{"("}{.name}{")"}{end}{end}' | awk '{print $1}' | sort -u
输出:
1 2 3 4 5 6 7 8 (config) (configjson-volume) (config-volume) (data) (etcd-data) (eth-config-volume) (kube-api-access-k6qgj) (kube-api-access-sjzr2)
df -h $(kubectl get pods -n taskon -o=jsonpath='{range .items[*]}{"\n"}{range .spec.volumes[*]}{.hostPath.path}{" "}{end}{end}' | awk '{print $1}' | sort -u)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 Filesystem Size Used Avail Use% Mounted on udev 3.6G 0 3.6G 0% /dev tmpfs 745M 2.9M 742M 1% /run /dev/vda2 99G 51G 45G 54% / tmpfs 3.7G 24K 3.7G 1% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup /dev/loop1 46M 46M 0 100% /snap/certbot/3643 /dev/loop0 46M 46M 0 100% /snap/certbot/3700 /dev/loop2 106M 106M 0 100% /snap/core/16574 /dev/loop3 104M 104M 0 100% /snap/core/16928 /dev/loop5 64M 64M 0 100% /snap/core20/2264 tmpfs 745M 0 745M 0% /run/user/1000 /dev/loop6 64M 64M 0 100% /snap/core20/2318
testnet上面:
df -h $(kb get pods -o=jsonpath='{range .items[*]}{"\n"}{range .spec.volumes[*]}{.hostPath.path}{" "}{end}{end}' | awk '{print $1}' | sort -u)
输出为:
1 2 3 4 5 6 7 8 Filesystem Size Used Avail Use% Mounted on udev 3.6G 0 3.6G 0% /dev tmpfs 745M 2.8M 742M 1% /run /dev/vda2 79G 19G 57G 26% / tmpfs 3.7G 24K 3.7G 1% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup tmpfs 745M 0 745M 0% /run/user/1000
网络存储如何看?
对于使用网络存储(如NFS、Gluster、Ceph等)的Kubernetes卷,可以通过以下方式查看使用情况:
NFS存储
通过查看NFS服务器上的存储目录大小和使用情况。例如,如果你的NFS卷对应服务器上的/data/nfsvol目录:
1 2 du -sh /data/nfsvol # 查看总大小 df -h /data/nfsvol # 查看可用空间
Gluster存储
使用gluster命令行工具查看卷使用情况:
1 2 3 4 5 6 7 8 # 安装gluster客户端 yum install glusterfs-client -y # 启动gluster本地挂载 glusterfs --volfile-server=<gluster-server-ip> --volfile-id=/volumename /mnt # 查看卷使用情况 df -h /mnt
Ceph存储
使用Ceph命令行或Web UI查看池使用情况:
1 2 3 4 5 6 7 # 命令行查看池空间 rados df # 安装ceph Web UI yum install ceph-mgr-dashboard # 访问Web UI查看详情
Cloud存储(AWS EBS、Azure Disk等)
大多数云服务商都提供了存储监控工具,可以在其控制台查看卷使用情况。也可以使用一些第三方工具如Kubernetes插件去获取使用量数据。
Kubernetes存储资源查看
从Kubernetes 1.8+版本开始,可以使用kubectl get pv/pvc查看持久卷和持久卷声明的使用情况。
1 2 kubectl get pv -o=custom-columns=NAME:.metadata.name,CAPACITY:.spec.capacity.storage,ACCESSMODES:.spec.accessModes kubectl get pvc -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,CAPACITY:.spec.resources.requests.storage,ACCESSMODES:.spec.accessModes
这些命令可以显示持久卷的总容量、访问模式等信息。
根据使用的具体存储类型,选择合适的工具和命令来查看网络存储的使用情况。同时也要留意监控系统,对于异常的使用量能及时报警。
testnet:
1 2 3 4 5 6 7 8 9 10 11 12 13 ubuntu@VM-0-47-ubuntu:~$ kubectl get pv -o=custom-columns=NAME:.metadata.name,CAPACITY:.spec.capacity.storage,ACCESSMODES:.spec.accessModes NAME CAPACITY ACCESSMODES pvc-15fc505c-cb27-487a-8425-ac4c9536fe94 10Gi [ReadWriteOnce] pvc-2dabba0c-13e3-4de6-98bc-7b9849c00ab2 10Gi [ReadWriteOnce] pvc-768c3d3f-5cd3-4066-b7eb-719332af5e05 10Gi [ReadWriteOnce] pvc-85661fad-7444-434f-9193-fa965afff1ed 10Gi [ReadWriteOnce] pvc-a05f41fe-95e7-4cbb-bc3d-b2ac78afc289 10Gi [ReadWriteOnce] pvc-cfd775db-c051-427d-a42b-8c3b38ae43e9 10Gi [ReadWriteOnce] ubuntu@VM-0-47-ubuntu:~$ ubuntu@VM-0-47-ubuntu:~$ ubuntu@VM-0-47-ubuntu:~$ kubectl get pvc -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,CAPACITY:.spec.resources.requests.storage,ACCESSMODES:.spec.accessModes NAME STATUS CAPACITY ACCESSMODES ubuntu@VM-0-47-ubuntu:~$
taskon:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ubuntu@VM-0-22-ubuntu:~$ kubectl get pv -o=custom-columns=NAME:.metadata.name,CAPACITY:.spec.capacity.storage,ACCESSMODES:.spec.accessModes NAME CAPACITY ACCESSMODES pvc-066bd279-b3fb-475c-8061-bad84ef4f23b 40Gi [ReadWriteOnce] pvc-28ce2beb-d64d-4dbb-8a62-365f5ab0b18f 150Gi [ReadWriteOnce] pvc-2ccdbed3-4c12-4ccc-9644-16adcc796dbf 50Gi [ReadWriteOnce] pvc-4312d4ae-3029-496f-ad2c-158547738807 10Gi [ReadWriteOnce] pvc-68edc0a6-9c42-41a8-8088-c4811549e62f 300Gi [ReadWriteOnce] pvc-789e1583-df22-4d80-8f9f-c0c630272e8d 10Gi [ReadWriteOnce] pvc-8cf5dce0-1082-4482-8c2c-ec7745866520 40Gi [ReadWriteOnce] pvc-91cd5406-fd69-4e24-af71-0440c53cb6dc 10Gi [ReadWriteOnce] pvc-b5483d81-9dd8-4f54-a453-9370641e53e3 40Gi [ReadWriteOnce] pvc-bbc33e96-bfad-4674-b3fe-a06acd702684 10Gi [ReadWriteOnce] pvc-c5a099b7-a7b5-49f9-8dab-b0a5a8e2b2e7 100Gi [ReadWriteOnce] pvc-eacf9ab3-eed5-473d-992c-8cf15187b1fa 50Gi [ReadWriteOnce] pvc-f573f87b-e390-4e48-9e89-45487016a399 10Gi [ReadWriteOnce] pvc-fc21fa72-b85d-4ad1-afda-74c171e3c75f 40Gi [ReadWriteOnce] ubuntu@VM-0-22-ubuntu:~$ ubuntu@VM-0-22-ubuntu:~$ ubuntu@VM-0-22-ubuntu:~$ kubectl get pvc -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,CAPACITY:.spec.resources.requests.storage,ACCESSMODES:.spec.accessModes NAME STATUS CAPACITY ACCESSMODES ubuntu@VM-0-22-ubuntu:~$
所以我们使用的都是pv而不是pvc?
pv和pvc的区别是什么? PV(Persistent Volume)和PVC(Persistent Volume Claim)是Kubernetes中管理存储的两个重要资源对象:
PV(Persistent Volume)是由集群管理员提供的存储资源,它是对底层存储系统(如分区、网络存储等)的一层抽象,定义了一段可供使用的存储空间,包括存储类型、容量、访问模式等。PV属于集群级别的资源。
PVC(Persistent Volume Claim)是由用户创建的存储请求,用来从PV中申请存储空间。PVC可以指定所需的存储容量、访问模式等参数,Kubernetes将根据PVC要求找到一个合适的PV,并将其绑定。PVC属于命名空间级别的资源。
两者的关系可以理解为:
PV是存储资源的”供应商”,由管理员事先准备好
PVC是存储资源的”使用者”,用于申请使用存储
使用过程是:
集群管理员先创建PV,描述可用的持久化存储资源
用户创建PVC,声明需要的存储容量和访问模式
Kubernetes根据PVC要求,自动匹配合适的PV并完成绑定
Pod通过PVC来使用被绑定的PV存储资源
PV和PVC实现了Kubernetes存储资源的动态供给和分配,让运维和应用彼此独立。PVC消除了应用直接访问底层存储的需求,实现了应用/数据的解耦。
总的来说:
如何查看和pod的关联? 要查看持久卷(Persistent Volume, PV)与Pod的关联关系,您可以使用以下命令:
1 kubectl get pv -o=custom-columns=NAME:.metadata.name,CLAIMREF:.spec.claimRef.name
这将列出所有PV,并显示每个PV的名称(NAME)和与之关联的PersistentVolumeClaim(PVC)的名称(CLAIMREF)。
PVC与Pod的关联关系可以通过以下命令查看:
1 kubectl get pvc -o=custom-columns=NAME:.metadata.name,VOLUMENAME:.spec.volumeName,STATUS:.status.phase,NAMESPACE:.metadata.namespace,POD:.spec.volumeName
这将列出所有PVC,并显示PVC名称、绑定的PV名称(VOLUMENAME)、状态(STATUS)、所在名称空间(NAMESPACE),以及使用该PVC的Pod名称(POD)。
因此,您可以先查看PV与PVC的映射关系,再查看PVC与Pod的绑定关系,从而建立PV、PVC和Pod之间的关联。
testnet:
1 2 3 4 5 6 7 8 kubectl get pv -o=custom-columns=NAME:.metadata.name,CLAIMREF:.spec.claimRef.name NAME CLAIMREF pvc-15fc505c-cb27-487a-8425-ac4c9536fe94 gasstationlog pvc-2dabba0c-13e3-4de6-98bc-7b9849c00ab2 data-release-name-rabbitmq-0 pvc-768c3d3f-5cd3-4066-b7eb-719332af5e05 etcd-data-etcd-0 pvc-85661fad-7444-434f-9193-fa965afff1ed downloaddata-testnet pvc-a05f41fe-95e7-4cbb-bc3d-b2ac78afc289 reward pvc-cfd775db-c051-427d-a42b-8c3b38ae43e9 taskondemobackend
taskon:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 kubectl get pv -o=custom-columns=NAME:.metadata.name,CLAIMREF:.spec.claimRef.name NAME CLAIMREF pvc-066bd279-b3fb-475c-8061-bad84ef4f23b etcd-data-etcd-1 pvc-28ce2beb-d64d-4dbb-8a62-365f5ab0b18f taskonbackendupload pvc-2ccdbed3-4c12-4ccc-9644-16adcc796dbf alertmanager-prometheus-kube-prometheus-alertmanager-db-alertmanager-prometheus-kube-prometheus-alertmanager-0 pvc-4312d4ae-3029-496f-ad2c-158547738807 gasstationlog pvc-68edc0a6-9c42-41a8-8088-c4811549e62f taskonbackenduploadxxl pvc-789e1583-df22-4d80-8f9f-c0c630272e8d prometheus-grafana pvc-8cf5dce0-1082-4482-8c2c-ec7745866520 etcd-data-etcd-0 pvc-91cd5406-fd69-4e24-af71-0440c53cb6dc downloaddata pvc-b5483d81-9dd8-4f54-a453-9370641e53e3 rewardlog pvc-bbc33e96-bfad-4674-b3fe-a06acd702684 taskonsigdata pvc-c5a099b7-a7b5-49f9-8dab-b0a5a8e2b2e7 mysqldb pvc-eacf9ab3-eed5-473d-992c-8cf15187b1fa prometheus-prometheus-kube-prometheus-prometheus-db-prometheus-prometheus-kube-prometheus-prometheus-0 pvc-f573f87b-e390-4e48-9e89-45487016a399 taskonextensionupload pvc-fc21fa72-b85d-4ad1-afda-74c171e3c75f etcd-data-etcd-2
如果你想在列出PV与关联的PVC名称的同时也查看PV的容量大小,可以使用以下命令:
1 kubectl get pv -o=custom-columns=NAME:.metadata.name,CAPACITY:.spec.capacity.storage,CLAIMREF:.spec.claimRef.name
这条命令定制了输出列:
NAME: 显示PV的名称
CAPACITY: 显示PV的容量大小,来自.spec.capacity.storage字段
CLAIMREF: 显示绑定到该PV的PVC名称,来自.spec.claimRef.name字段
执行后,输出将类似这样:
1 2 3 4 NAME CAPACITY CLAIMREF pvc-066bd279-b3fb-475c-8061-bad84ef4f23b 40Gi pvc-example1 pvc-28ce2beb-d64d-4dbb-8a62-365f5ab0b18f 150Gi pvc-example2 ...
这样你就可以一次性看到PV名称、容量大小以及绑定的PVC名称了。根据需要你还可以调整列的排列顺序。
testnet:
1 2 3 4 5 6 7 8 kubectl get pv -o=custom-columns=NAME:.metadata.name,CAPACITY:.spec.capacity.storage,CLAIMREF:.spec.claimRef.name NAME CAPACITY CLAIMREF pvc-15fc505c-cb27-487a-8425-ac4c9536fe94 10Gi gasstationlog pvc-2dabba0c-13e3-4de6-98bc-7b9849c00ab2 10Gi data-release-name-rabbitmq-0 pvc-768c3d3f-5cd3-4066-b7eb-719332af5e05 10Gi etcd-data-etcd-0 pvc-85661fad-7444-434f-9193-fa965afff1ed 10Gi downloaddata-testnet pvc-a05f41fe-95e7-4cbb-bc3d-b2ac78afc289 10Gi reward pvc-cfd775db-c051-427d-a42b-8c3b38ae43e9 10Gi taskondemobackend
taskon:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 kubectl get pv -o=custom-columns=NAME:.metadata.name,CAPACITY:.spec.capacity.storage,CLAIMREF:.spec.claimRef.name NAME CAPACITY CLAIMREF pvc-066bd279-b3fb-475c-8061-bad84ef4f23b 40Gi etcd-data-etcd-1 pvc-28ce2beb-d64d-4dbb-8a62-365f5ab0b18f 150Gi taskonbackendupload pvc-2ccdbed3-4c12-4ccc-9644-16adcc796dbf 50Gi alertmanager-prometheus-kube-prometheus-alertmanager-db-alertmanager-prometheus-kube-prometheus-alertmanager-0 pvc-4312d4ae-3029-496f-ad2c-158547738807 10Gi gasstationlog pvc-68edc0a6-9c42-41a8-8088-c4811549e62f 300Gi taskonbackenduploadxxl pvc-789e1583-df22-4d80-8f9f-c0c630272e8d 10Gi prometheus-grafana pvc-8cf5dce0-1082-4482-8c2c-ec7745866520 40Gi etcd-data-etcd-0 pvc-91cd5406-fd69-4e24-af71-0440c53cb6dc 10Gi downloaddata pvc-b5483d81-9dd8-4f54-a453-9370641e53e3 40Gi rewardlog pvc-bbc33e96-bfad-4674-b3fe-a06acd702684 10Gi taskonsigdata pvc-c5a099b7-a7b5-49f9-8dab-b0a5a8e2b2e7 100Gi mysqldb pvc-eacf9ab3-eed5-473d-992c-8cf15187b1fa 50Gi prometheus-prometheus-kube-prometheus-prometheus-db-prometheus-prometheus-kube-prometheus-prometheus-0 pvc-f573f87b-e390-4e48-9e89-45487016a399 10Gi taskonextensionupload pvc-fc21fa72-b85d-4ad1-afda-74c171e3c75f 40Gi etcd-data-etcd-2
这几个是taskon要求的,日志啥因为pod重启后,可能飘到不同节点上,所以不能在宿主机上做一个volumn映射. 所以需要一个独立的和宿主机解耦的存储,也就是PVC,这个只和pod挂钩,不和宿主机绑到一起
如何查看某个pod挂载的pvc?
要查看某个特定 Pod 挂载的 PVC,可以使用以下命令:
1 kubectl describe pod <pod_name>
这将显示该 Pod 的详细信息,包括挂载的卷(volumes)。
在输出中,查找 Volumes:部分,您将看到类似这样的信息:
1 2 3 4 5 6 Volumes: ... pvc-xyz: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: pvc-xyz ReadOnly: false
这里 pvc-xyz 就是该 Pod 挂载的 PVC 名称。
您也可以使用 -o参数来自定义输出格式,只列出关于卷的信息:
1 kubectl get pod <pod_name> -o=jsonpath='{.spec.volumes[?(@.persistentVolumeClaim)].name}'
这将直接输出 Pod 挂载的所有 PVC 名称,无需查看其他详细信息。
如果您知道要查看的 PVC 名称,也可以使用:
1 kubectl describe pvc <pvc_name>
它会显示该 PVC 的详情,包括被哪些 Pod 使用(如果有)。
怎么查看当前的使用量??
需要依靠第三方插件
curl https://krew.sh/df-pv | bash
kubectl df-pv
https://github.com/kubernetes-sigs/krew
Krew是kubectl插件的包管理器,它能帮助你发现、安装和管理插件。它类似于apt、dnf或brew等工具。目前,在Krew上有超过200个kubectl插件可用。对于kubectl用户来说,Krew能够以一致的方式帮助你找到、安装和管理插件。对于插件开发者来说,Krew能够帮助你打包和分发插件,并使其易于发现。你可以通过Krew文档找到安装说明、用户指南和开发者指南,也可以查看发布Krew、插件生命周期和Krew架构等文档。如果你想贡献代码,可以参考贡献指南。
k8s 中的 krew 是一个用于管理 kubectl 插件的工具。它让你可以轻松地发现、安装、升级和管理 kubectl 插件。
一些比较实用的 krew 插件包括:
ctx : 快速切换 Kubernetes 上下文。
ns : 快速切换 Kubernetes 命名空间。
tree : 以树形结构显示 Kubernetes 资源。
access-matrix : 显示 RBAC 授权情况。
ingress-nginx : 交互式创建/更新 ingress-nginx 资源。
node-shell : 可远程启动 shell 到 kubernetes 节点。
resource-capacity : 根据集群容量查看节点是否可调度。
exec-env : 从集群内外执行命令。
yaml-merge : 合并多个 YAML 文件。
view-secret : 解码 Kubernetes secret。
使用 krew 安装这些插件非常简单,只需要执行 kubectl krew install <插件名> 即可。安装后,这些插件就可以像 kubectl 子命令一样使用了,如 kubectl tree 等。
krew 可以极大扩展 kubectl 的功能,让你更方便地管理和操作 Kubernetes 资源。它已经整合了大量有用的插件,也支持自定义插件的安装。
df-pv插件有何作用? df-pv 是一个 krew 插件,用于显示 Kubernetes 集群中持久卷(Persistent Volumes)的使用情况。
安装这个插件后,可以通过运行 kubectl df-pv 命令来查看集群中所有 PV 的容量使用情况,输出格式类似于 df 命令显示文件系统使用情况的方式。
这个插件的主要作用包括:
显示 PV 使用情况概览 可以一目了然看到每个 PV 的总容量、已用容量、可用容量和使用百分比等关键指标。
方便管理 PV 资源 根据 PV 使用情况,可以判断是否需要扩容或者删除空闲 PV,从而更好地管理存储资源。
故障排查 当遇到 PV 使用相关的问题时,可以快速分析发现潜在原因,如存储资源不足等。
自动识别存储类型 该插件能够自动识别 PV 使用的存储类型,如 NFS、GlusterFS、Ceph等,并显示在输出中。
总的来说,df-pv 插件以一种易读的格式展示了集群存储使用状况的全景,方便存储管理和故障排查,是 Kubernetes 管理员的一个实用工具。
太好用了
testnet:
1 2 3 4 5 6 7 8 9 10 11 kubectl df-pv PV NAME PVC NAME NAMESPACE NODE NAME POD NAME VOLUME MOUNT NAME SIZE USED AVAILABLE %USED IUSED IFREE %IUSED pvc-2dabba0c-13e3-4de6-98bc-7b9849c00ab2 data-release-name-rabbitmq-0 benchtaskon 172.22.0.49 release-name-rabbitmq-0 data 9Gi 264Ki 9Gi 0.00 61 655299 0.01 pvc-768c3d3f-5cd3-4066-b7eb-719332af5e05 etcd-data-etcd-0 benchtaskon 172.22.0.47 etcd-0 etcd-data 9Gi 122Mi 9Gi 1.22 20 655340 0.00 pvc-cfd775db-c051-427d-a42b-8c3b38ae43e9 taskondemobackend benchtaskon 172.22.0.47 taskon-demo-backend-786f7d68f4-x4vv2 uploaddata 9Gi 523Mi 9Gi 5.24 1150 654210 0.18 pvc-15fc505c-cb27-487a-8425-ac4c9536fe94 gasstationlog benchtaskon 172.22.0.47 taskon-gas-station-54f6f74c5f-zbxgh logdata 9Gi 44Ki 9Gi 0.00 171 655189 0.03 pvc-a05f41fe-95e7-4cbb-bc3d-b2ac78afc289 reward benchtaskon 172.22.0.47 taskon-reward-d7fbb54b6-jgjzk uploaddata 9Gi 1024Ki 9Gi 0.01 266 655094 0.04 pvc-85661fad-7444-434f-9193-fa965afff1ed downloaddata-testnet benchtaskon 172.22.0.47 taskon-download-5ccb96864c-pmpkk downloaddata 9Gi 24Ki 9Gi 0.00 11 655349 0.00 ubuntu@VM-0-47-ubuntu:~$
taskon:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 kubectl df-pv PV NAME PVC NAME NAMESPACE NODE NAME POD NAME VOLUME MOUNT NAME SIZE USED AVAILABLE %USED IUSED IFREE %IUSED pvc-c5a099b7-a7b5-49f9-8dab-b0a5a8e2b2e7 mysqldb taskon 172.22.0.27 taskon-backend-db-76bcb6d7f8-lbk96 mysql-persistent-storage 97Gi 337Mi 97Gi 0.34 402 6553198 0.01 pvc-8cf5dce0-1082-4482-8c2c-ec7745866520 etcd-data-etcd-0 taskon 172.22.0.27 etcd-0 etcd-data 39Gi 984Mi 38Gi 2.46 29 2621411 0.00 pvc-b5483d81-9dd8-4f54-a453-9370641e53e3 rewardlog taskon 172.22.0.27 taskon-reward-58d7cffb9f-95tbg uploaddata 39Gi 3Gi 35Gi 9.66 79 2621361 0.00 pvc-2ccdbed3-4c12-4ccc-9644-16adcc796dbf alertmanager-prometheus-kube-prometheus-alertmanager-db-alertmanager-prometheus-kube-prometheus-alertmanager-0 monitoring 172.22.0.41 alertmanager-prometheus-kube-prometheus-alertmanager-0 alertmanager-prometheus-kube-prometheus-alertmanager-db 48Gi 36Ki 48Gi 0.00 16 3276784 0.00 pvc-68edc0a6-9c42-41a8-8088-c4811549e62f taskonbackenduploadxxl taskon 172.22.0.60 taskon-backend-golang-withlog-xxl-6c5769db7-4j542 uploaddata 294Gi 63Gi 230Gi 21.72 817110 18843690 4.16 pvc-789e1583-df22-4d80-8f9f-c0c630272e8d prometheus-grafana monitoring 172.22.0.41 prometheus-grafana-5574f84564-88hvh storage 9Gi 39Mi 9Gi 0.40 42 655318 0.01 pvc-eacf9ab3-eed5-473d-992c-8cf15187b1fa prometheus-prometheus-kube-prometheus-prometheus-db-prometheus-prometheus-kube-prometheus-prometheus-0 monitoring 172.22.0.22 prometheus-prometheus-kube-prometheus-prometheus-0 prometheus-prometheus-kube-prometheus-prometheus-db 48Gi 2Gi 46Gi 4.58 133 3276667 0.00 pvc-4312d4ae-3029-496f-ad2c-158547738807 gasstationlog taskon 172.22.0.60 taskon-gas-station-744ff57fcf-w2jtf logdata 9Gi 2Gi 7Gi 22.18 189 655171 0.03 pvc-f573f87b-e390-4e48-9e89-45487016a399 taskonextensionupload taskon 172.22.0.41 taskon-extension-backend-golang-6ccc47456d-v447l uploaddata 9Gi 1684Ki 9Gi 0.02 186 655174 0.03 pvc-bbc33e96-bfad-4674-b3fe-a06acd702684 taskonsigdata taskon 172.22.0.22 taskon-sign-server-6b687cb5db-xbs5k uploaddata 9Gi 330Mi 9Gi 3.31 370 654990 0.06 pvc-91cd5406-fd69-4e24-af71-0440c53cb6dc downloaddata taskon 172.22.0.60 taskon-download-5f8688f86f-h2t8g downloaddata 9Gi 1999Mi 7Gi 20.04 5246 650114 0.80 pvc-fc21fa72-b85d-4ad1-afda-74c171e3c75f etcd-data-etcd-2 taskon 172.22.0.41 etcd-2 etcd-data 39Gi 984Mi 38Gi 2.46 29 2621411 0.00 pvc-066bd279-b3fb-475c-8061-bad84ef4f23b etcd-data-etcd-1 taskon 172.22.0.22 etcd-1 etcd-data 39Gi 984Mi 38Gi 2.46 29 2621411 0.00
kubectl df-pv 是一个 Kubernetes 插件命令,用于显示所有持久卷(Persistent Volumes, PV)的磁盘使用情况。这个命令可以帮助你快速查看每个 PV 的空间使用情况。
如果你还没有安装该插件,可以通过以下命令进行安装:
1 kubectl krew install df-pv
安装后,可以使用以下命令查看 PV 的磁盘使用情况:
这将列出所有 PV 的名称、容量、已用空间和可用空间等信息。确保你已经正确安装了 kubectl krew,以便使用该插件。
原文链接: https://dashen.tech/2018/05/15/K8s磁盘挂载/
版权声明: 转载请注明出处.