Большинство NAS-устройств (до которых удалось добраться) почему-то до сих пор не поддерживают S3-протокол. При этом это основной протокол для бекапов в K8s. Поэтому давайте добавим такой адаптер.
Адаптер сделан на базе MinIO. Там для этого есть специальный режим (gateway nas).
Например, так:
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio
spec:
replicas: 1
selector:
matchLabels:
app: minio
strategy:
type: Recreate
template:
metadata:
labels:
app: minio
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
containers:
- name: main
image: minio/minio
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-ce"
- "/usr/bin/docker-entrypoint.sh minio -S /etc/minio/certs/ gateway nas --console-address=:9001 /storage"
resources:
limits:
memory: 4Gi
requests:
memory: 4Gi
env:
- name: MINIO_ROOT_USER
valueFrom:
secretKeyRef:
name: minio
key: accesskey
- name: MINIO_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: minio
key: secretkey
ports:
- name: api
containerPort: 9000
protocol: TCP
- name: console
containerPort: 9001
protocol: TCP
volumeMounts:
- name: storage
mountPath: "/storage"
securityContext:
fsGroup: 1000
runAsGroup: 1000
runAsUser: 1000
volumes:
- name: storage
hostPath:
path: /mnt/s3
type: Directory
- name: minio-user
secret:
defaultMode: 420
secretName: minio
---
apiVersion: v1
kind: Service
metadata:
name: minio
spec:
type: LoadBalancer
loadBalancerIP: 192.168.1.120
ports:
- port: 9000
targetPort: 9000
protocol: TCP
name: api
- port: 9001
targetPort: 9001
protocol: TCP
name: console
selector:
app: minio
и соответственно команды:
k create ns s3nas
k ns s3nas
k create secret generic minio --from-literal=accesskey=userNamek8s --from-literal="secretkey=PassWord"
k apply -f s3nas.yaml
Пример как смонтировать WebDav на каждой ноде (команды под Ubuntu):
apt-get -y install davfs2
mkdir /mnt/s3
cat << EOF | sudo tee -a /etc/fstab
https://192.168.1.100:5003/webdav/s3 /mnt/s3 davfs _netdev,auto,user,uid=1000 0 0
EOF
cat << EOF | sudo tee -a /etc/davfs2/secrets
/mnt/s3 userNamek8s PassWord
EOF
# import https cert
openssl s_client -connect 192.168.1.100:5003 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM > nas-CA.cer
mv nas-CA.cer /etc/ssl/certs/
cp /etc/ssl/certs/nas-CA.cer /etc/davfs2/certs/
echo "trust_ca_cert /etc/davfs2/certs/nas-CA.cer" >> /etc/davfs2/davfs2.conf
mount /mnt/s3
По порту 9001 можно получить доступ к веб-админке (там же можно создавать бакеты и пользователей), а для работы с консолью:
ACCESS_KEY=$(kubectl get secret minio -o jsonpath="{.data.accesskey}" | base64 --decode)
SECRET_KEY=$(kubectl get secret minio -o jsonpath="{.data.secretkey}" | base64 --decode)
brew install minio-mc
mc alias set minio-local http://192.168.78.120:9000 "$ACCESS_KEY" "$SECRET_KEY" --api s3v4
mc ls minio-local
Конечно, лучше когда том смонтирован непосредственно в контейнер, но в стандартном Кубере это не поддерживается. Нужно ставить плагин. Это сделаем когда-нибудь позже.
Еще вопросы безопасности (RBAC) и мониторинга (Prometheus) тут не затронуты, но для первой итерации для дома достаточно.