K8s磁盘挂载


k8s查看磁盘挂载情况


要查看Kubernetes集群中Pod使用的卷及其挂载情况,可以使用以下命令:

  1. 列出集群中所有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。

  1. 查看指定Pod中卷的具体挂载情况:
1
kubectl describe pod <pod-name> -n <namespace>

在返回结果的”Volumes”部分,可以看到该Pod使用的每个卷的类型、大小、挂载路径等详细信息。

  1. 查看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:

  1. 列出指定namespace下所有Pod及其挂载卷:
1
kubectl get pods -n <namespace> -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.name}{"("}{.hostPath.path}{")"}{" "}{end}{end}'
  1. 查看指定namespace下某个Pod中卷的详细挂载信息:
1
kubectl describe pod <pod-name> -n <namespace>
  1. 查看节点上与该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. 获取所有卷的主机路径
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. 查看这些路径对应的磁盘分区大小及使用情况
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卷,可以通过以下方式查看使用情况:

  1. NFS存储

通过查看NFS服务器上的存储目录大小和使用情况。例如,如果你的NFS卷对应服务器上的/data/nfsvol目录:

1
2
du -sh /data/nfsvol  # 查看总大小
df -h /data/nfsvol # 查看可用空间
  1. 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
  1. Ceph存储

使用Ceph命令行或Web UI查看池使用情况:

1
2
3
4
5
6
7
# 命令行查看池空间
rados df

# 安装ceph Web UI
yum install ceph-mgr-dashboard

# 访问Web UI查看详情
  1. Cloud存储(AWS EBS、Azure Disk等)

大多数云服务商都提供了存储监控工具,可以在其控制台查看卷使用情况。也可以使用一些第三方工具如Kubernetes插件去获取使用量数据。

  1. 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是存储资源的”使用者”,用于申请使用存储

使用过程是:

  1. 集群管理员先创建PV,描述可用的持久化存储资源
  2. 用户创建PVC,声明需要的存储容量和访问模式
  3. Kubernetes根据PVC要求,自动匹配合适的PV并完成绑定
  4. Pod通过PVC来使用被绑定的PV存储资源

PV和PVC实现了Kubernetes存储资源的动态供给和分配,让运维和应用彼此独立。PVC消除了应用直接访问底层存储的需求,实现了应用/数据的解耦。

总的来说:

  • PV是存储资源本身
  • 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 插件包括:

  1. ctx: 快速切换 Kubernetes 上下文。
  2. ns: 快速切换 Kubernetes 命名空间。
  3. tree: 以树形结构显示 Kubernetes 资源。
  4. access-matrix: 显示 RBAC 授权情况。
  5. ingress-nginx: 交互式创建/更新 ingress-nginx 资源。
  6. node-shell: 可远程启动 shell 到 kubernetes 节点。
  7. resource-capacity: 根据集群容量查看节点是否可调度。
  8. exec-env: 从集群内外执行命令。
  9. yaml-merge: 合并多个 YAML 文件。
  10. 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 命令显示文件系统使用情况的方式。

这个插件的主要作用包括:

  1. 显示 PV 使用情况概览
    可以一目了然看到每个 PV 的总容量、已用容量、可用容量和使用百分比等关键指标。

  2. 方便管理 PV 资源
    根据 PV 使用情况,可以判断是否需要扩容或者删除空闲 PV,从而更好地管理存储资源。

  3. 故障排查
    当遇到 PV 使用相关的问题时,可以快速分析发现潜在原因,如存储资源不足等。

  4. 自动识别存储类型
    该插件能够自动识别 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 的磁盘使用情况:

1
kubectl df-pv

这将列出所有 PV 的名称、容量、已用空间和可用空间等信息。确保你已经正确安装了 kubectl krew,以便使用该插件。