# openshift3.11配置local volume

参考：

<https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner>

<https://docs.okd.io/3.11/install_config/configuring_local.html>

<https://ieevee.com/tech/2019/01/17/local-volume.html>

## 下载local storage provisioner代码

```
git clone https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner.git
```

```
cd sig-storage-local-static-provisioner
```

## 生成local-volume-provisioner部署文件

如果不使用helm，或不方便安装heml，则跳过生成步骤，直接修改使用已经生成好的示例yaml配置，在`provisioner/deployment/kubernetes/example/`目录下

### 安装helm

mac安装helm

```
brew install kubernetes-helm
```

### 修改变量

vi helm/provisioner/values.yaml

注意：namespaces必须为kube-system,否则 local-volume-provisioner ds部署文件中的`priorityClassName: system-node-critical` 没有权限

```
...
  namespace: kube-system
...
  image: quay.io/external_storage/local-volume-provisioner:v2.3.0
...
prometheus:
  operator:
    enabled: true

    serviceMonitor:
      interval: 10s

      namespace: openshift-monitoring

      selector:
        k8s-app: local-volume-provisioner
```

### 生成部署文件

```
helm template ./helm/provisioner > ./provisioner/deployment/kubernetes/provisioner_generated.yaml
```

## 部署local-volume-provisioner

上传`provisioner/deployment/kubernetes/example/default_example_storageclass.yaml`到master1主机,可以酌情修改storageclass的名字，执行创建

```
oc create -f default_example_storageclass.yaml
```

上传provisioner\_generated.yaml到master1主机，执行部署

```
kubectl create -f provisioner_generated.yaml
```

异常清理创建的相关服务（异常重建测试时使用）

```
oc delete -n kube-system ds local-volume-provisioner
oc delete -n kube-system configmap/local-provisioner-config
oc delete -n kube-system daemonset.apps/local-volume-provisioner
oc delete -n kube-system service/local-volume-provisioner
oc delete -n kube-system serviceaccount/local-storage-admin
oc delete -n openshift-monitoring servicemonitors local-volume-provisioner
oc delete -n kube-system sa local-storage-admin
oc delete -n kube-system clusterrolebinding local-storage-provisioner-pv-binding
oc delete -n kube-system clusterrole local-storage-provisioner-node-clusterrole
oc delete -n kube-system clusterrolebinding local-storage-provisioner-node-binding
```

## 创建测试挂载卷

```
mkdir /mnt/fast-disks
for vol in vol1 vol2 vol3; do
    mkdir /mnt/fast-disks/$vol
    mount -t tmpfs $vol /mnt/fast-disks/$vol
done
```

## 批量创建localvolume使用的卷

注：最初的卷有考虑尝试过 使用文件创建loop设备挂载分区，经常测试，loop设备在极端持续压力下，会导致主机异常，强制重启主机后分区不能挂载主机，导致不能正常启动，稳定性不如lvm,所以下面的localvolume全部采用lvm挂载。

添加磁盘设备

创建pv

```
pvcreate /dev/vdb
```

创建vg

```
vgcreate vg_localvolume /dev/vdb
```

创建lvm

```
for i in {1..100};do
  mkdir /mnt/fast-disks/lv$i
  lvcreate -L 11G -n lv$i vg_localvolume
  mkfs.xfs /dev/mapper/vg_localvolume-lv$i
  echo "/dev/mapper/vg_localvolume-lv$i /mnt/fast-disks/lv$i xfs defaults 0 0" >> /etc/fstab
done
```

确认并挂载

```
cat /etc/fstab
mount -a
```

清理lvm

```
for i in {1..100};do
  umount /dev/mapper/vg_localvolume-lv$i
  lvremove -y /dev/mapper/vg_localvolume-lv$i
  rm -r /mnt/fast-disks/lv$i
done

vgremove vg_localvolume
pvremove /dev/vdb
```

## 发布服务测试

statefulset-nginx-slim.yaml

```
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: example
  namespace: jyliu
spec:
  serviceName: nginx
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: nginx
          image: 'docker.io/googlecontainer/nginx-slim:0.8'
          ports:
            - containerPort: 80
              name: web
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: fast-disks
        resources:
          requests:
            storage: 1Gi
```

```
oc create -f statefulset-nginx-slim.yaml
```

## 支持作者

如果文章对您有帮助，欢迎打赏，谢谢

![支付宝](/files/-LbLkf5wGLqw4_zZhgmC)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://liujinye.gitbook.io/openshift-docs/storage/openshift3.11-pei-zhi-localvolume.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
