Deerenaros
@Deerenaros
Программист, математик, задрот и даже чуть инженер

Как подключить fstab/cifs (flexvolume) на microk8s?

Поставил microk8s как (казалось бы) более лояльная к чему бы то там ни было поставка кубера. Перевёл пол зоопарка сервисов, и вот дошёл до того, что теперь мне надо смонтировать CIFS в k8s pod. Начал гуглить, нашёл про CSI и Flexvolume, для первого был пример, который, казалось бы, идеально должен подходить. Но.

Warning  FailedMount  50s (x45 over 76m)   kubelet, master  MountVolume.SetUp failed for volume "test" : Couldn't get secret default/cifs-secret err: Cannot get secret of type fstab/cifs


Подробности

root@master:~/yamls# kubectl describe pod/busybox
Name:         busybox
Namespace:    default
Priority:     0
Node:         master/172.17.101.90
Start Time:   Fri, 03 Jul 2020 11:13:22 +0300
Labels:       <none>
Annotations:  Status:  Pending
IP:           
IPs:          <none>
Containers:
  busybox:
    Container ID:  
    Image:         busybox
    Image ID:      
    Port:          <none>
    Host Port:     <none>
    Command:
      sleep
      3600
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /data from test (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-h942c (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  test:
    Type:       FlexVolume (a generic volume resource that is provisioned/attached using an exec based plugin)
    Driver:     fstab/cifs
    FSType:     cifs
    SecretRef:  &LocalObjectReference{Name:cifs-secret,}
    ReadOnly:   false
    Options:    map[mountOptions:dir_mode=0755,file_mode=0644,noperm networkPath://srv/path]
  default-token-h942c:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-h942c
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason       Age                  From                                      Message
  ----     ------       ----                 ----                                      -------
  Warning  FailedMount  15m (x7 over 51m)    kubelet, master  Unable to attach or mount volumes: unmounted volumes=[test], unattached volumes=[default-token-h942c test]: timed out waiting for the condition
  Warning  FailedMount  6m9s (x23 over 74m)  kubelet, master  Unable to attach or mount volumes: unmounted volumes=[test], unattached volumes=[test default-token-h942c]: timed out waiting for the condition
  Warning  FailedMount  50s (x45 over 76m)   kubelet, master  MountVolume.SetUp failed for volume "test" : Couldn't get secret default/cifs-secret err: Cannot get secret of type fstab/cifs


root@master:~/yamls# cat pod.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: cifs-secret
  namespace: default
data:
  username: '***='
  password: '*****=='
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: test
      mountPath: /data
  volumes:
  - name: test
    flexVolume:
      driver: "fstab/cifs"
      fsType: "cifs"
      secretRef:
        name: "cifs-secret"
      options:
        networkPath: "//srv/path"
        mountOptions: "dir_mode=0755,file_mode=0644,noperm"


При этом если
root@master:~/yamls# cat pod.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: cifs-secret
  namespace: default
data:
  username: '***='
  password: '*****=='
///

Тогда
root@master:~/yamls# kubectl apply -f pod.yaml 
pod/busybox configured
The Secret "cifs-secret" is invalid: type: Invalid value: "fstab/cifs": field is immutable


root@master:~/yamls# tree /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
/usr/libexec/kubernetes/kubelet-plugins/volume/exec/
└── fstab~cifs
    ├── cifs
    ├── LICENSE
    └── README.md

1 directory, 3 files


root@master:~/yamls# ps aux | grep kubelet
root      89326  0.0  0.0  14424  1112 pts/1    S+   13:55   0:00 grep --color=auto kubelet
root     108000  2.4  6.4 497056 259684 ?       Ssl  12:29   2:07 /snap/microk8s/1496/kube-apiserver --cert-dir=/var/snap/microk8s/1496/certs --service-cluster-ip-range=10.152.183.0/24 --authorization-mode=AlwaysAllow --basic-auth-file=/var/snap/microk8s/1496/credentials/basic_auth.csv --service-account-key-file=/var/snap/microk8s/1496/certs/serviceaccount.key --client-ca-file=/var/snap/microk8s/1496/certs/ca.crt --tls-cert-file=/var/snap/microk8s/1496/certs/server.crt --tls-private-key-file=/var/snap/microk8s/1496/certs/server.key --kubelet-client-certificate=/var/snap/microk8s/1496/certs/server.crt --kubelet-client-key=/var/snap/microk8s/1496/certs/server.key --secure-port=16443 --token-auth-file=/var/snap/microk8s/1496/credentials/known_tokens.csv --token-auth-file=/var/snap/microk8s/1496/credentials/known_tokens.csv --etcd-servers=https://127.0.0.1:12379 --etcd-cafile=/var/snap/microk8s/1496/certs/ca.crt --etcd-certfile=/var/snap/microk8s/1496/certs/server.crt --etcd-keyfile=/var/snap/microk8s/1496/certs/server.key --insecure-port=0 --requestheader-client-ca-file=/var/snap/microk8s/1496/certs/front-proxy-ca.crt --requestheader-allowed-names=front-proxy-client --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --proxy-client-cert-file=/var/snap/microk8s/1496/certs/front-proxy-client.crt --proxy-client-key-file=/var/snap/microk8s/1496/certs/front-proxy-client.key
root     108046  1.8  1.3 1559096 55200 ?       Ssl  12:29   1:35 /snap/microk8s/1496/kubelet --kubeconfig=/var/snap/microk8s/1496/credentials/kubelet.config --cert-dir=/var/snap/microk8s/1496/certs --client-ca-file=/var/snap/microk8s/1496/certs/ca.crt --anonymous-auth=false --network-plugin=cni --root-dir=/var/snap/microk8s/common/var/lib/kubelet --fail-swap-on=false --cni-conf-dir=/var/snap/microk8s/1496/args/cni-network/ --cni-bin-dir=/snap/microk8s/1496/opt/cni/bin/ --feature-gates=DevicePlugins=true --eviction-hard=memory.available<100Mi,nodefs.available<1Gi,imagefs.available<1Gi --container-runtime=remote --container-runtime-endpoint=/var/snap/microk8s/common/run/containerd.sock --containerd=/var/snap/microk8s/common/run/containerd.sock --node-labels=microk8s.io/cluster=true --cluster-domain=cluster.local --cluster-dns=10.152.183.10 --serialize-image-pulls=false --volume-plugin-dir=/usr/libexec/kubernetes/kubelet-plugins/volume/exec


root@master:~/yamls# snap list
Name      Version    Rev   Tracking       Publisher   Notes
core      16-2.45.1  9436  latest/stable  canonical✓  core
microk8s  v1.18.4    1496  1.18/stable    canonical✓  classic


Что сюда ещё добавить?


И вопрос в закат - а <ну зачем> так сложно-то? Мне ещё NFS и FTP монтировать, там такая же дичь? Есть может какие-то best practice?
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
Deerenaros
@Deerenaros Автор вопроса
Программист, математик, задрот и даже чуть инженер
По мотивам:

Так как секрет определяется иммутабельным во время создания - он не может изменятся. Единственный способ - пересоздать.
kubectl delete secret cifs-secret
Существующие поды использующие секрет будут удалены и пересозданы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы