我有一个 mysql 部署,其中有一个需要存储的 pod。这就是为什么它通过 pvc 在 /var/lib/mysql 上绑定到 250G 容量的卷。在容器中执行并检查可用磁盘大小,这些值不会相加:在 /var/lib/mysql 上,它显示只有 9.5G 可用,而不是 250G。
在 linux 容器内执行 df 显示磁盘总大小仅为 9.5G,已使用 4%:
nim@DESKTOP-FOASM6G:/home$ kubectl exec mysql-7947979f68-74plp -- df -h
Filesystem Size Used Avail Use% Mounted on
overlay 95G 2.5G 92G 3% /
tmpfs 64M 0 64M 0% /dev
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 95G 2.5G 92G 3% /etc/hosts
shm 64M 0 64M 0% /dev/shm
/dev/sdb 9.9G 307M 9.5G 4% /var/lib/mysql
tmpfs 2.4G 12K 2.4G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 2.0G 0 2.0G 0% /proc/acpi
tmpfs 2.0G 0 2.0G 0% /proc/scsi
tmpfs 2.0G 0 2.0G 0% /sys/firmware
在 Linux 容器内执行 lsblk 显示正确的 233Gi 磁盘大小,但缺少使用信息:
nim@DESKTOP-FOASM6G:/home$ kubectl exec -it mysqltest-5566cb6985-4rzcw -- lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
|-sda1 8:1 95.9G 0 part /etc/resolv.conf
|-sda2 8:2 0 16M 0 part
|-sda3 8:3 0 2G 0 part
|-sda4 8:4 0 16M 0 part
|-sda5 8:5 0 2G 0 part
|-sda6 8:6 512B 0 part
|-sda7 8:7 0 512B 0 part
|-sda8 8:8 16M 0 part
|-sda9 8:9 0 512B 0 part
|-sda10 8:10 0 512B 0 part
|-sda11 8:11 8M 0 part
`-sda12 8:12 0 32M 0 part
sdb 8:16 0 233G 0 disk /var/lib/mysql
Mysql Pod 描述:
nim@DESKTOP-FOASM6G:~$ kubectl describe pod mysql-7947979f68-74plp
Name: mysql-7947979f68-74plp
Namespace: default
Priority: 0
Node: gke-sblice-clust-pool-1-c1994f74-ueyy/10.156.15.207
Start Time: Wed, 19 Jul 2023 13:18:04 +0200
Labels: app=sql
pod-template-hash=7947979f68
Annotations: <none>
Status: Running
IP: 10.16.1.11
IPs:
IP: 10.16.1.11
Controlled By: ReplicaSet/mysql-7947979f68
Containers:
mysql:
Container ID: containerd://c1cd6e60c0f20956ca4146c315dd0665f2d1bb2eee0351e719a813a2ca62d87c
Image: mysql:5.6
Image ID: docker.io/library/mysql@sha256:20575ecebe6216036d25dab5903808211f1e9ba63dc7825ac20cb975e34cfcae
Port: 3306/TCP
Host Port: 0/TCP
State: Running
Started: Wed, 19 Jul 2023 13:18:06 +0200
Ready: True
Restart Count: 0
Limits:
cpu: 1
memory: 2500M
Requests:
cpu: 100m
memory: 512Mi
Liveness: exec [bash -c mysqladmin -uroot -p$MYSQL_ROOT_PASSWORD ping
] delay=30s timeout=5s period=10s #success=1 #failure=3
Readiness: exec [bash -c mysql -h127.0.0.1 -uroot -p$MYSQL_ROOT_PASSWORD -e'SELECT 1'
] delay=5s timeout=1s period=2s #success=1 #failure=3
Environment:
MYSQL_ROOT_PASSWORD: <set to the key 'MYSQL_ROOT_PASSWORD' in secret 'mysql-secrets'> Optional: false
MYSQL_DATABASE: wordpress
MYSQL_USER: <set to the key 'MYSQL_USER' of config map 'mysql-config'> Optional: false
MYSQL_PASSWORD: <set to the key 'MYSQL_PASSWORD' in secret 'mysql-secrets'> Optional: false
Mounts:
/var/lib/mysql from regional-storage-180723 (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-4qncz (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
regional-storage-180723:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: regional-storage-pvc-180723
ReadOnly: false
kube-api-access-4qncz:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events: <none>
此容器绑定到 PVC,并带有描述:
nim@DESKTOP-FOASM6G:/home$ kubectl describe pvc regional-storage-pvc-180723
Name: regional-storage-pvc-180723
Namespace: default
StorageClass: normal-storageclass
Status: Bound
Volume: pvc-e5baeec9-435d-46b8-a442-179d54c023e6
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
volume.kubernetes.io/selected-node: gke-sblice-clust-pool-1-c1994f74-ueyy
volume.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 233Gi
Access Modes: RWO
VolumeMode: Filesystem
DataSource:
APIGroup: snapshot.storage.k8s.io
Kind: VolumeSnapshot
Name: snapshot14072023
Used By: mysql-7947979f68-74plp
Events: <none>
PV本身描述为:
nim@DESKTOP-FOASM6G:/home$ kubectl describe pv pvc-e5baeec9-435d-46b8-a442-179d54c023e6
Name: pvc-e5baeec9-435d-46b8-a442-179d54c023e6
Labels: <none>
Annotations: pv.kubernetes.io/provisioned-by: pd.csi.storage.gke.io
volume.kubernetes.io/provisioner-deletion-secret-name:
volume.kubernetes.io/provisioner-deletion-secret-namespace:
Finalizers: [kubernetes.io/pv-protection external-attacher/pd-csi-storage-gke-io]
StorageClass: normal-storageclass
Status: Bound
Claim: default/regional-storage-pvc-180723
Reclaim Policy: Retain
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 233Gi
Node Affinity:
Required Terms:
Term 0: topology.gke.io/zone in [europe-west3-b]
Term 1: topology.gke.io/zone in [europe-west3-c]
Message:
Source:
Type: CSI (a Container Storage Interface (CSI) volume source)
Driver: pd.csi.storage.gke.io
FSType: ext4
VolumeHandle: projects/sblice/regions/europe-west3/disks/pvc-e5baeec9-435d-46b8-a442-179d54c023e6
ReadOnly: false
VolumeAttributes: storage.kubernetes.io/csiProvisionerIdentity=1689594187853-2313-pd.csi.storage.gke.io
Events: <none>
来自容器的日志:
nim@DESKTOP-FOASM6G:/home$ kubectl logs mysql-66fc8c8d48-v7fzd
2023-08-01 15:42:15+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.51-1debian9 started.
2023-08-01 15:42:15+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2023-08-01 15:42:15+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.51-1debian9 started.
2023-08-01 15:42:16 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2023-08-01 15:42:16 0 [Note] mysqld (mysqld 5.6.51) starting as process 1 ...
2023-08-01 15:42:16 1 [Note] Plugin 'FEDERATED' is disabled.
2023-08-01 15:42:16 1 [Note] InnoDB: Using atomics to ref count buffer pool pages
2023-08-01 15:42:16 1 [Note] InnoDB: The InnoDB memory heap is disabled
2023-08-01 15:42:16 1 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2023-08-01 15:42:16 1 [Note] InnoDB: Memory barrier is not used
2023-08-01 15:42:16 1 [Note] InnoDB: Compressed tables use zlib 1.2.11
2023-08-01 15:42:16 1 [Note] InnoDB: Using Linux native AIO
2023-08-01 15:42:16 1 [Note] InnoDB: Using CPU crc32 instructions
2023-08-01 15:42:16 1 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2023-08-01 15:42:16 1 [Note] InnoDB: Completed initialization of buffer pool
2023-08-01 15:42:16 1 [Note] InnoDB: Highest supported file format is Barracuda.
2023-08-01 15:42:16 1 [Note] InnoDB: 128 rollback segment(s) are active.
2023-08-01 15:42:16 1 [Note] InnoDB: Waiting for purge to start
2023-08-01 15:42:16 1 [Note] InnoDB: 5.6.51 started; log sequence number 11955998372
2023-08-01 15:42:16 1 [Note] RSA private key file not found: /var/lib/mysql//private_key.pem. Some authentication plugins will not work.
2023-08-01 15:42:16 1 [Note] RSA public key file not found: /var/lib/mysql//public_key.pem. Some authentication plugins will not work.
2023-08-01 15:42:16 1 [Note] Server hostname (bind-address): '*'; port: 3306
2023-08-01 15:42:16 1 [Note] IPv6 is available.
2023-08-01 15:42:16 1 [Note] - '::' resolves to '::';
2023-08-01 15:42:16 1 [Note] Server socket created on IP: '::'.
2023-08-01 15:42:16 1 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2023-08-01 15:42:16 1 [Warning] 'proxies_priv' entry '@ root@mysql-5c96657748-fv26w' ignored in --skip-name-resolve mode.
2023-08-01 15:42:16 1 [Note] Event Scheduler: Loaded 0 events
2023-08-01 15:42:16 1 [Note] mysqld: ready for connections.
Version: '5.6.51' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
有关存储类别的信息:
nim@DESKTOP-FOASM6G:/home$ kubectl describe storageclass normal-storageclass
Name: normal-storageclass
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"allowVolumeExpansion":true,"allowedTopologies":[{"matchLabelExpressions":[{"key":"topology.gke.io/zone","values":["europe-west3-b","europe-west3-c"]}]}],"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"normal-storageclass"},"parameters":{"replication-type":"regional-pd","type":"pd-standard"},"provisioner":"pd.csi.storage.gke.io","reclaimPolicy":"Retain","volumeBindingMode":"WaitForFirstConsumer"}
Provisioner: pd.csi.storage.gke.io
Parameters: replication-type=regional-pd,type=pd-standard
AllowVolumeExpansion: True
MountOptions: <none>
ReclaimPolicy: Retain
VolumeBindingMode: WaitForFirstConsumer
AllowedTopologies:
Term 0: topology.gke.io/zone in [europe-west3-b, europe-west3-c]
Events: <none>
我的部署和 PVC 的 yaml 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: sql
strategy:
type: Recreate
template:
metadata:
labels:
app: sql
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.gke.io/zone
operator: NotIn
values:
- europe-west3-a
containers:
- image: mysql:5.6
name: mysql
env:
# Use secret in real usage
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: MYSQL_ROOT_PASSWORD
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
valueFrom:
configMapKeyRef:
name: mysql-config
key: MYSQL_USER
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: MYSQL_PASSWORD
resources:
limits:
#cpu: "1000m"
#memory: "2.5G"
cpu: "500m"
memory: "1000M"
requests:
cpu: "500m"
memory: "500M"
readinessProbe:
exec:
command:
- bash
- "-c"
- |
mysql -h127.0.0.1 -uroot -p$MYSQL_ROOT_PASSWORD -e'SELECT 1'
initialDelaySeconds: 5
periodSeconds: 2
timeoutSeconds: 1
livenessProbe:
exec:
command:
- bash
- "-c"
- |
mysqladmin -uroot -p$MYSQL_ROOT_PASSWORD ping
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: regional-storage-180723
mountPath: /var/lib/mysql
#nodeSelector:
# location: pv
volumes:
- name: regional-storage-180723
persistentVolumeClaim:
#change claimName to bigger disc created by snapshot in case of need
claimName: regional-storage-pvc-180723
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: regional-storage-pvc-180723
spec:
dataSource:
name: snapshot14072023
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
storageClassName: normal-storageclass
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 250G
Kubectl 告诉我我安装了 250G 存储空间,并且在 pod 内(使用 df -h 服务)它告诉我我有 9.5G。我现在有多少可用磁盘空间?我需要做什么才能真正正确安装250G磁盘空间?如果我有 250G,我该用什么方法来检查磁盘空间使用情况以及如何设置限制?因为 GKE 控制台监控还告诉我,作为指标,我的磁盘空间要少得多。