首页 > 解决方案 > Kubernetes 集群无法将自动创建的谷歌云平台磁盘附加和挂载到工作节点

问题描述

基本上我正在尝试通过kubeadm支持 StorageClass(不使用 Google Kubernetes Engine)在 GCE 上部署集群。

假设我在东京部署了一个主节点,在香港、台湾和俄勒冈部署了 3 个工作节点。

NAME              STATUS   ROLES    AGE     VERSION
k8s-node-hk       Ready    <none>   3h35m   v1.14.2
k8s-node-master   Ready    master   3h49m   v1.14.2
k8s-node-oregon   Ready    <none>   3h33m   v1.14.2
k8s-node-tw       Ready    <none>   3h34m   v1.14.2

Kube-controller-manager并且kubelet都以 开头cloud-provider=gce,现在我可以申请StorageClass然后PersistentVolumeClaim在 GCP 上自动创建磁盘(比如台湾的磁盘)并获取PVPVC绑定。

kubectl get pvc

NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
eth-pvc   Bound    pvc-bf35e3c9-81e2-11e9-8926-42010a920002   10Gi       RWO            slow           137m

kubectl get pv

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
pvc-bf35e3c9-81e2-11e9-8926-42010a920002   10Gi       RWO            Delete           Bound    default/eth-pvc   slow                    137m

但是,kube-controller-manager找不到台湾节点并将磁盘挂载到同一区域的节点,并且它记录了(我们可以看到区域asia-northeast1-a不正确):

I0529 07:25:46.366500       1 reconciler.go:288] attacherDetacher.AttachVolume started for volume "pvc-bf35e3c9-81e2-11e9-8926-42010a920002" (UniqueName: "kubernetes.io/gce-pd/kubernetes-dynamic-pvc-bf35e3c9-81e2-11e9-8926-42010a920002") from node "k8s-node-tokyo" 
E0529 07:25:47.296824       1 attacher.go:102] Error attaching PD "kubernetes-dynamic-pvc-bf35e3c9-81e2-11e9-8926-42010a920002" to node "k8s-node-tokyo": GCE persistent disk not found: diskName="kubernetes-dynamic-pvc-bf35e3c9-81e2-11e9-8926-42010a920002" zone="asia-northeast1-a"

每个节点上的 kubelet 都以 开头--cloud-provider=gce,但是我没有找到如何配置区域。当我检查 kubelet 的日志时,我发现这个标志已经在 kubernetes v1.14.2(2019 年 5 月的最新版本)上被弃用。

May 29 04:36:03 k8s-node-tw kubelet[29971]: I0529 04:36:03.623704   29971 server.go:417] Version: v1.14.2
May 29 04:36:03 k8s-node-tw kubelet[29971]: W0529 04:36:03.624039   29971 plugins.go:118] WARNING: gce built-in cloud provider is now deprecated. The GCE provider is deprecated and will be removed in a future release

但是,kubelet 使用k8s-node-tw正确的区域和区域注释节点:

May 29 04:36:05 k8s-node-tw kubelet[29971]: I0529 04:36:05.157665   29971 kubelet_node_status.go:331] Adding node label from cloud provider: beta.kubernetes.io/instance-type=n1-standard-1
May 29 04:36:05 k8s-node-tw kubelet[29971]: I0529 04:36:05.158093   29971 kubelet_node_status.go:342] Adding node label from cloud provider: failure-domain.beta.kubernetes.io/zone=asia-east1-a
May 29 04:36:05 k8s-node-tw kubelet[29971]: I0529 04:36:05.158201   29971 kubelet_node_status.go:346] Adding node label from cloud provider: failure-domain.beta.kubernetes.io/region=asia-east1

感谢您阅读这里。我的问题是:

如果可能,我该如何配置kubeletkube-controller-manager正确使其支持 GCP 的存储类以及创建的磁盘连接和挂载成功?

==================K8s配置文件======================

部署(相关部分):

  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: eth-pvc
  - name: config
    configMap:
      name: {{ template "ethereum.fullname" . }}-geth-config
  - name: account
    secret:
      secretName: {{ template "ethereum.fullname" . }}-geth-account

PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: eth-pvc
spec:
  storageClassName: slow
  resources:
    requests:
      storage: 10Gi
  accessModes:
    - ReadWriteOnce

SC:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  replication-type: none
  zone: asia-east1-a

标签: kubernetesgoogle-cloud-platformgoogle-compute-enginekubeadmkubelet

解决方案


经过几天的研究,我发现原因是:

  1. 主节点在asia-northeast1-a(东京)
  2. 工作节点在asia-east1-a(台湾)和其他区域
  3. cloud-provider-gcp只搜索一个地域的zone(一般是master节点的zone,可以local-zone在cloud config文件中设置),即默认只能支持一个zone或者一个region的多个zone

结论:

为了支持多个区域之间的多个区域,我们需要修改配置的gce提供程序代码,例如添加另一个字段来配置应该搜索哪些区域。

===========================更新======================= ==

我修改了 k8s 代码,在 github 上extra-zones添加了一个像这个 diff 这样的配置字段,以使其适用于我的用例。


推荐阅读