K8S 启用 DefaultStorageClass

默认情况下通过 kubeadm 部署的 k8s 没有启动 DefaultStorageClass。 相关文档:persistent-volumes

  1. 查看 K8S API 服务器是否启用了 DefaultStorageClass,只有启用了此功能才能在没有指定 storageClass 的 pvc 中动态制备 pv。
kubectl -n kube-system describe pod kube-apiserver-k8s1 | grep enable-admission-plugins
 
# 启用的准入控制器使用逗号分隔,没有 DefaultStorageClass 说明没有开启
# 示例输出:
#     --enable-admission-plugins=NodeRestriction
  1. 启用 DefaultStorageClass

参考:修改 Kubernetes apiserver 启动参数

如果您使用 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 节点上都修改该文件,并使各节点上的参数保持一致。
  1. 创建一个 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