有状态工作负载的存储管理指南
立即解锁
发布时间: 2025-08-25 02:12:33 阅读量: 1 订阅数: 6 

### 有状态工作负载的存储准备与管理
在容器化应用的部署中,有状态工作负载的存储管理至关重要。本文将详细介绍在 AWS 和 GCP 环境中,如何进行存储类的设置、持久卷的创建与删除,以及 CSI 驱动的安装与使用。
#### 1. AWS EBS 存储管理
##### 1.1 设置默认存储类
在 AWS 环境中,我们可以通过以下步骤设置默认存储类:
1. 将现有的 `aws-io1-slow` 存储类设置为非默认选项:
```bash
$ kubectl patch storageclass aws-io1-slow -p '{"metadata":
{"annotations":{"storageclass.kubernetes.io/is-default-
class":"false"}}}'
```
2. 重新将 `aws-gp2` 定义为默认存储类:
```bash
$ kubectl patch storageclass aws-gp2 -p '{"metadata":
{"annotations":{"storageclass.kubernetes.io/is-default-
class":"true"}}}'
```
3. 确认新的默认存储类:
```bash
$ kubectl get sc
NAME PROVISIONER AGE
aws-gp2 (default) kubernetes.io/aws-ebs 10m
aws-io1-slow kubernetes.io/aws-ebs 8m
```
需要注意的是,同一时间只能有一个默认存储类,否则未定义存储类的 PVC 将无法使用默认存储类。
##### 1.2 使用 EBS 卷进行持久存储
除了动态创建 PVC 和卷,我们还可以手动创建卷并将其直接附加到应用程序作为持久卷,具体步骤如下:
1. 使用 AWS CLI 在与工作节点相同的区域创建 EBS 卷:
```bash
$ aws ec2 create-volume --availability-zone=us-west-2a --size=10 --
volume-type=gp2
```
2. 使用步骤 1 中创建的 EBS 卷 ID 部署测试应用程序:
```yaml
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: test-server
spec:
containers:
- image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-ebs
name: test-volume
volumes:
- name: test-volume
awsElasticBlockStore:
volumeID: vol-02f4bc9b938604f72
fsType: ext4
EOF
```
3. 验证 Pod 是否处于运行状态:
```bash
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
test-server 1/1 Running 0 4m32s
```
手动创建的 PV 的主要优点是它们不与单个集群或命名空间绑定,可以跨集群共享,而动态创建的 PVC 仅存在于创建的命名空间中,只能由该命名空间内的 Pod 使用。
##### 1.3 使用 EBS 存储类动态创建持久卷
作为 StatefulSet 的一部分,`volumeClaimTemplates` 可以使用所选的 PersistentVolume 供应程序提供的持久卷来提供持久存储。以下是使用 StorageClass 为应用程序动态创建 PV 的步骤:
1. 在应用程序部署清单的 `volumeClaimTemplates` 部分添加 `aws-gp2` 存储类行,示例如下:
```yaml
...
volumeClaimTemplates:
- metadata:
name: datadir
annotations:
volume.beta.kubernetes.io/storage-class: aws-gp2
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1G
...
```
2. 使用 `aws-gp2` 存储类部署 Redis StatefulSet。在执行之前,查看示例存储库中 `src/chapter5/aws` 目录下的 YAML 清单:
```bash
$ cat aws/redis-statefulset.yml
```
3. 创建 Redis StatefulSet:
```bash
$ kubectl apply -f aws/redis-statefulset.yml
```
4. 验证是否已创建 Pod:
```bash
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
rd-0 1/1 Running 0 9m9s
rd-1 1/1 Running 0 7m56s
rd-2 1/1 Running 0 6m47s
```
5. 列出创建的 PVC 和 PV:
```bash
$ kubectl get pvc,pv
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
datadir-rd-0 Bound pvc-8a538aa3-7382-4147-adde-1ea3dbaaafb4 1Gi RWO
aws-gp2 10m
datadir-rd-1 Bound pvc-171fbee3-39bf-4450-961f-6c1417ff3897 1Gi RWO
aws-gp2 9m1s
datadir-rd-2 Bound pvc-b40df89b-5349-4f02-8510-917012579746 1Gi RWO
aws-gp2 7m52s
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS
REASON AGE
pvc-171fbee3-39bf-4450-961f-6c1417ff3897 1Gi RWO Retain Bound
default/datadir-rd-1 aws-gp2 9m18s
pvc-8a538aa3-7382-4147-adde-1ea3dbaaafb4 1Gi RWO Retain Bound
default/datadir-rd-0 aws-gp2 10m
pvc-b40df89b-5349-4f02-8510-917012579746 1Gi RWO Retain Bound
default/datadir-rd-2 aws-gp2 8m10s
```
##### 1.4 删除 EBS 持久卷
当回收策略设置为保留卷时,需要分别删除 PVC 和 PV,步骤如下:
1. 删除工作负载,但不会删除 PVC 和 PV,除非 PVC 清单包含在工作负载清单中:
```bash
$ kubectl delete -f redis-statefulset.yml
```
2. 列出剩余的 PV:
```bash
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS
REASON AGE
pvc-171fbee3-39bf-4450-961f-6c1417ff3897 1Gi RWO Retain Bound
default/datadir-rd-1 aws-gp2 13m
pvc-8a538aa3-7382-4147-adde-1ea3dbaaafb4 1Gi RWO Retain Bound
default/datadir-rd-0 aws-gp2 15m
pvc-b40df89b-5349-4f02-8510-917012579746 1Gi RWO Retain Bound
default/datadir-rd-2 aws-gp2 12m
```
3. 删除 PVC:
```bash
$ kubectl delete pvc datadir-rd-0 datadir-rd-1 datadir-rd-2
```
4. 删除 PV:
```bash
$ kubectl delete pv <pv-name-1> <pv-name-2> <pv-name-3>
```
5. 打开 AWS 管理控制台,点击“Compute”选项下的“EC2”。
6. 在“Resources”部分,点击“Volumes”。
7. 选择可用且未使用的卷。
8. 从“Actions”下拉菜单中选择“Delete Volumes”。
##### 1.5 安装 EBS CSI 驱动管理 EBS 卷
Amazon EBS CSI 驱动提供了 Kubernetes CSI 接口,允许 Amazon EKS 集群简单地管理 Amazon EBS 卷的生命周期。安装步骤如下:
1. 配置 CSI 驱动权限,使用 Secret 资源替换 AWS 凭证:
```yaml
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: aws-secret
namespace: kube-system
stringData:
key_id: "YOUR_KEY_ID_HERE"
access_key: "YOUR_ACCESS_KEY_HERE"
EOF
```
2. 从存储库位置部署 AWS EBS CSI 驱动:
```bash
$ kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-
driver/deploy/kubernetes/overlays/stable/?ref=master"
```
3. 验证驱动是否正在运行:
```bash
$ kubectl get pods -n kube-system | grep ebs-csi
ebs-csi-controller-8579f977f4-ljfhm 4/4 Running 0 2m37s
ebs-csi-controller-8579f977f4-qw6ld 4/4 Running 0 2m37s
ebs-csi-node-5x8nh 3/3 Running 0 2m37s
ebs-csi-node-cfghj 3/3 Running 0 2m37s
ebs-csi-node-xp569 3/3 Running 0 2m37s
ebs-
```
0
0
复制全文
相关推荐









