在部署 statefulset 类型的工作负载时,动态创建 PV/PVC 是一种比较常用的配置方式,动态创建 PV/PVC 的方法基本如下:

  • 1、创建自己的 StorageClass 备用。
  • 2、创建 statefulset ,在 yaml 文件的 volumeClaimTemplates 块,添加 StorageClass 的名字。

在部署Elasticsearch时,一直启动不起来

一直启动不起来,信息如下:

  • 1、Elasticsearch POD 一直处于 pending 状态;
  • 2、PVC一直无法绑定
  • 3、nfs-provisioner正常运行
  • 4、storageclass正常运行

nfs-provisioner日志

1
E1025 02:16:44.073064 1 controller.go:766] Unexpected error getting claim reference to claim "kube-logging/data-es-cluster-0": selfLink was empty, can't make reference

主要原因是,官方在 k8s 1.20 中基于对性能和统一apiserver调用方式的初衷,移除了对 SelfLink 的支持,而 nfs-provisioner 需要 SelfLink 该项功能。

解决方案

1、

修改 apiserver 的配置文件,重新启用 SelfLink 功能。针对 K8S,可添加如下配置:

1
2
3
4
5
6
7
8
# /etc/kubernetes/manifests/kube-apiserver.yaml

spec:
containers:
- command:
- kube-apiserver
...
- --feature-gates=RemoveSelfLink=false # 增加

这一步之后可能 kubelet 会停掉,执行kubectl 会报错

  • The connection to the server 192.168.1.11:6443 was refused - did you specify the right host or port?

只需要先重启docker 再重启kubelet

1
2
systemctl restart docker
systemctl restart kubelet

2、

使用新的不基于 SelfLink 功能的 provisioner 镜像,重新创建 provisioner 容器。

若你能科学上网,可使用这个镜像:

1
gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0

国内可使用这个镜像:

1
registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0