关于鉴权的问题。铁铁可能遇到了RBAC配置的问题,所以现在明确整个过程中各个组件需要的权限,ServiceAccount、ClusterRole、ClusterRoleBinding的作用,鉴权的大致步骤。
接下来我将分步骤详细说明自动创建PV的过程,创建PVC,到Kubernetes发现StorageClass,触发Provisioner,Provisioner创建PV,最后绑定PVC和PV,以及核心组件的作用。
1.大致流程

nfs-provisioner-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-provisioner
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nfs-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-provisioner
spec:
serviceAccountName: nfs-provisioner
containers:
- name: nfs-provisioner
image: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0
volumeMounts:
- name: nfs-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: my/nfs-provisioner # Provisioner 标识符
- name: NFS_SERVER
value: 192.168.111.100
- name: NFS_PATH
value: /shared # NFS 共享目录
volumes:
- name: nfs-root
nfs:
server: 192.168.111.100
path: /shared
nfs-provisioner-SA.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: default
nfs-provisioner-ClusterRole.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-provisioner-runner
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
nfs-provisioner-ClusterRoleBinding.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
nfs-provisioner-StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: my/nfs-provisioner #匹配nfs-provisioner的环境变量PROVISIONER_NAME
reclaimPolicy: Delete
nfs-provisioner-demopvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
storageClassName: nfs-client # 与 Provisioner 的 StorageClass 名称一致
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
kubectl apply -f nfs-provisioner-demonginx.yaml
kind: Pod
apiVersion: v1
metadata:
name: nfs-pod
spec:
containers:
- name: nfs-pod
image: nginx
volumeMounts:
- name: nfs-per
mountPath: "/usr/local/nginx/html"
volumes:
- name: nfs-per
persistentVolumeClaim:
claimName: nfs-pvc #指定pvc
运行
kubectl apply -f nfs-provisioner-SA.yaml
kubectl apply -f nfs-provisioner-ClusterRole.yaml
kubectl apply -f nfs-provisioner-ClusterRoleBinding.yaml
kubectl apply -f nfs-provisioner-deploy.yaml
kubectl apply -f nfs-provisioner-demopvc.yaml
kubectl apply -f nfs-provisioner-demonginx.yaml
运行结果查看


错误提醒
- bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program. 出现这种错误是因为客户端未安装nfs
- *大多数问题的原因内存不足或权限不足。
2. 自动创建 PV 的流程
步骤 1:用户创建 PVC
用户定义 PVC 并指定 storageClassName。
步骤 2:StorageClass 触发 Provisioner
- Kubernetes 发现 PVC 中指定的
storageClassName。 - 根据 StorageClass 中定义的
provisioner字段,找到对应的 Provisioner 服务。
步骤 3:Provisioner 创建 PV
- 监听 PVC 事件:
Provisioner 持续监听 Kubernetes API 中的 PVC 创建事件。 - 动态创建 PV:
- Provisioner 根据 PVC 请求的存储大小和参数,在 NFS 服务器上创建子目录。
- 创建对应的 PV 对象,并将其绑定到 PVC。
步骤 4:PV 与 PVC 绑定
- PV 创建成功后,Kubernetes 将其状态设置为
Bound,并与 PVC 绑定。 - 应用 Pod 可通过 PVC 挂载该 PV。
核心组件及作用
| 组件 | 作用 |
|---|---|
| StorageClass | 定义动态存储卷的类型和参数( provisioner 名称),用于触发 Provisioner 创建 PV。 |
| PVC | 用户请求存储资源的声明,指定所需存储大小、访问模式和 StorageClass。 |
| Provisioner | 监听 PVC 请求并根据 StorageClass 自动创建 PV 的后端服务( NFS Provisioner)。 |
| RBAC 权限 | 授予 Provisioner 操作 Kubernetes API 的权限(创建 PV)。 |
3. 组件调用与鉴权过程
Provisioner 需要访问 Kubernetes API 以监听 PVC 事件和创建 PV,这需要 RBAC 权限 控制。详细鉴权流程如下:
1:创建 ServiceAccount,定义 ServiceAccount nfs-provisioner-runner,用于 Provisioner Pod 的身份认证。
2:定义 ClusterRole,授予 ServiceAccount 操作 PV、PVC、StorageClass 等资源的权限。
3:绑定 ClusterRole 和 ServiceAccount,将 ClusterRole 的权限授予 ServiceAccount。
4:Provisioner Pod 使用 ServiceAccount,在 Deployment 中指定 ServiceAccount
关键权限说明
| 权限 | 作用 |
|---|---|
| persistentvolumes | 创建、删除 PV,并监听 PV 状态。 |
| persistentvolumeclaims | 监听 PVC 事件,更新 PVC 状态(如绑定 PV)。 |
| storageclasses | 获取 StorageClass 配置,确定如何创建 PV。 |
| events | 记录 Provisioner 操作的事件(如错误日志)。 |
| endpoints | 用于多副本 Provisioner 的 Leader Election(避免重复创建 PV) |
实验过程如有错误请评论我会快速回复哦...

939

被折叠的 条评论
为什么被折叠?



