linux

K8S中挂载SMB共享作为StorageClass

Posted on 2024-05-27,4 min read

上周在机顶盒上部署了一套k3s集群,由于两个机顶盒都只有8G的EMMC,所以我想要把刷了DWRT固件的京东云路由器的256G存储空间作为SMB共享给集群使用,从创建SC、创建PVC,部署Deployment,一切都很顺利,但是我部署的两个项目,一个Alist,一个QD框架,在使用localstorage时都能正常运行,而使用SMB共享时都会起不来

查看日志都是sqlite3无法写database.db文件,于是我另外部署了一个sqlite3的Deployment,进入pod排查

touch testfile
echo “test” > testfile
cat testfile

文件可以正常创建、写入和读取,但使用sqlite3创建data.db、创建表却会报错

sqlite3 data.db
create table test (id integer primary key, name text);
insert into test (name) values ('Alice');
insert into test (name) values ('Bob');
select * from test;
Error: unable to open database "data.db": unable to open database file

困扰了一周,还是没能解决,现在先使用localstorage,等过段时间再回来看看😓

安装 csi-driver-smb

# 添加 Helm 仓库:
helm repo add csi-driver-smb https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/charts
helm repo update
# 安装 csi-driver-smb:
helm install csi-driver-smb csi-driver-smb/csi-driver-smb --namespace kube-system
# 检查 csi-smb-controller 和 csi-smb-node 的日志
kubectl logs -n kube-system -l app=csi-smb-controller
kubectl logs -n kube-system -l app=csi-smb-node

smb-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: smb-secret
  namespace: gutf
stringData:
  username: "guest"
  password: ""

smb-storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: smb
provisioner: smb.csi.k8s.io
parameters:
  source: "//192.168.123.1/mmcblk0p24"
  csi.storage.k8s.io/node-stage-secret-name: "smb-secret"
  csi.storage.k8s.io/node-stage-secret-namespace: "gutf"
  csi.storage.k8s.io/node-publish-secret-name: "smb-secret"
  csi.storage.k8s.io/node-publish-secret-namespace: "gutf"
reclaimPolicy: Retain  # only retain is supported
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=1000
  - gid=1000
  - vers=3.0

smb-pvc.yaml

apiVersion: v1
kind: Secret
metadata:
  name: smb-secret
  namespace: gutf
stringData:
  username: "guest"
  password: ""
root@k3s-master-octupos:/opt/testsmb# cat smb-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: smb-pvc
  namespace: gutf
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: smb

sqlite3-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sqlite3-test
  namespace: gutf
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sqlite3-test
  template:
    metadata:
      labels:
        app: sqlite3-test
    spec:
      securityContext:
        fsGroup: 1000  # 设置文件系统组
      initContainers:
      - name: init-permissions
        image: busybox:1.32.0-uclibc
        command: ["sh", "-c", "chown -R 1000:1000 /data && chmod -R 777 /data"]
        volumeMounts:
        - mountPath: /data
          name: smb-volume
      containers:
      - name: sqlite3
        image: keinos/sqlite3
        securityContext:
          runAsUser: 1000  # 设置运行用户
          runAsGroup: 1000  # 设置运行组
        command: ["sh", "-c", "while true; do sleep 3600; done"]
        volumeMounts:
        - mountPath: /data
          name: smb-volume
      volumes:
      - name: smb-volume
        persistentVolumeClaim:
          claimName: smb-pvc

下一篇: 花生壳DDNS更新shell脚本→

loading...