longhorn通过 NFSv4 server(share-manager)暴露常规longhorn卷,原生支持RWX工作负载。
工作原理
这是官方文档的图
- 对于每个正在使用的RWX卷longhorn将在longhorn-system命名空间中创建一个share-manager-volume-name Pod。
- 该Pod负责通过在Pod内运行的NFSv4 server导出Longhorn卷。
- 还有为每个RWX卷创建的服务,用作实际NFSv4客户端连接的地址。
必须
为了能够使用RWX卷,每个客户端节点都需要安装NFSv4客户端。
ansible worker -m yum -a "state=installed name=nfs-utils"
# yum install nfs-utils
如果没有安装NFSv4客户端,在挂载卷时,会报错:
for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.\n
RWX卷创建使用
- 对于动态配置的Longhorn卷,访问模式基于PVC的访问模式。
- 对于手动创建的Longhorn卷(恢复、DR卷),可以在Longhorn UI创建期间指定访问模式。
- 通过UI为Longhorn卷创建PV/PVC时,PV/PVC的访问模式将基于卷的访问模式。
- 只要卷未绑定到PVC,就可以通过UI更改Longhorn卷的访问模式。
- 对于RWX PVC使用的Longhorn卷,卷访问模式将更改为RWX。
栗子
创建nginx-rwx pod,绑定nginx-rwx pvc,由longhorn自动配置longhorn volume,查看volume的访问模式。
cat nginx-rwx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-rwx
spec:
replicas: 1
selector:
matchLabels:
app: nginx-rwx
template:
metadata:
labels:
app: nginx-rwx
spec:
containers:
- name: nginx-rwx
image: nginx:stable-alpine
volumeMounts:
- mountPath: /etc/test
name: test
volumes:
- name: test
persistentVolumeClaim:
claimName: nginx-rwx
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-rwx
spec:
accessModes:
- ReadWriteMany
storageClassName: longhorn
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Service
metadata:
name: nginx-rwx
labels:
app: nginx-rwx
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
name: http
nodePort: 32758
selector:
app: nginx-rwx
kubectl apply -f nginx-rwx.yaml -n longhorn-system
创建了一个share-manager-pvc-955dcb55-db13-4026-9762-2f622230b544的pod。
查看容器内进程和目录挂载
share-manager pod日志:获取卷目录地址及文件类型,将目录格式化挂载到容器内/export/volume name,启动nfs server,export volume,volume健康检查。
查看volume的访问模式也是RWX,跟随PVC。
故障处理
- share-manager Pod的任何故障(卷故障、节点故障等)都将导致重新创建Pod并设置卷的remountRequestedAt标志, 这将导致workload Pods被删除,Kubernetes会重新创建它们。
- 此功能取决于 Automatically Delete Workload Pod when The Volume Is Detached Unexpectedly
- (卷意外分离时自动删除工作负载 Pod)的设置, 默认情况下为 true。如果该设置被禁用,workload Pods 可能会在RWX卷故障时出现 io errors。
- 建议启用上述设置以保证在RWX卷出现问题时自动进行工作负载故障转移。
数据迁移
官方给了一个job yaml,可以实现将数据从一个卷复制到另一个卷。(未测试)
- 将 data-source-pvc 替换为之前由 Kubernetes 创建的 NFSv4 RWX PVC 的名称。
- 将 data-target-pvc 替换为您希望用于新工作负载的新 RWX PVC 的名称。
- 两个 PVC 都需要存在于同一个命名空间中。
apiVersion: batch/v1
kind: Job
metadata:
namespace: default # namespace where the PVC's exist
name: volume-migration
spec:
completions: 1
parallelism: 1
backoffLimit: 3
template:
metadata:
name: volume-migration
labels:
name: volume-migration
spec:
restartPolicy: Never
containers:
- name: volume-migration
image: ubuntu:xenial
tty: true
command: [ "/bin/sh" ]
args: [ "-c", "cp -r -v /mnt/old /mnt/new" ]
volumeMounts:
- name: old-vol
mountPath: /mnt/old
- name: new-vol
mountPath: /mnt/new
volumes:
- name: old-vol
persistentVolumeClaim:
claimName: data-source-pvc # change to data source PVC
- name: new-vol
persistentVolumeClaim:
claimName: data-target-pvc # change to data target PVC