K8S 启用 DefaultStorageClass
默认情况下通过 kubeadm 部署的 k8s 没有启动 DefaultStorageClass。 相关文档:persistent-volumes
- 查看 K8S API 服务器是否启用了
DefaultStorageClass
,只有启用了此功能才能在没有指定 storageClass 的 pvc 中动态制备 pv。
kubectl -n kube-system describe pod kube-apiserver-k8s1 | grep enable-admission-plugins
# 启用的准入控制器使用逗号分隔,没有 DefaultStorageClass 说明没有开启
# 示例输出:
# --enable-admission-plugins=NodeRestriction
- 启用
DefaultStorageClass
如果您使用 kubeadm 安装 Kubernetes 集群,Kubernetes apiserver 通过 static pod 启动,其 yaml 文件的位置在 /etc/kubernetes/manifests/kube-apiserver.yaml
这个路径下。
假设您要向 Kubernetes apiserver 追加如下 oidc 参数时,将这些参数追加到该 yaml 文件的 command
字段中即可:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- ...
- --enable-admission-plugins=...,DefaultStorageClass,...
- ...
生效 Static Pod 的配置文件被修改后,立即生效。
- Kubelet 会监听该文件的变化,当您修改了
/etc/kubernetes/manifests/kube-apiserver.yaml
文件之后,kubelet 将自动终止原有的 kube-apiserver-{nodename} 的 Pod,并自动创建一个使用了新配置参数的 Pod 作为替代。- 如果您有多个 Kubernetes Master 节点,您需要在每一个 Master 节点上都修改该文件,并使各节点上的参数保持一致。
- 创建一个 DefaultStorageClass
请注意,集群上最多只能有一个 默认 存储类,否则无法创建没有明确指定 storageClassName
的 PersistentVolumeClaim
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: default-storage
annotations:
# 只要指定了 storageclass.kubernetes.io/is-default-class 为 true 则表明这是一个默认存储类
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer