kubernetes - 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 上自动创建磁盘(比如台湾的磁盘)并获取PV
和PVC
绑定。
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
感谢您阅读这里。我的问题是:
如果可能,我该如何配置kubelet
或kube-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
解决方案
经过几天的研究,我发现原因是:
- 主节点在
asia-northeast1-a
(东京) - 工作节点在
asia-east1-a
(台湾)和其他区域 cloud-provider-gcp
只搜索一个地域的zone(一般是master节点的zone,可以local-zone
在cloud config文件中设置),即默认只能支持一个zone或者一个region的多个zone
结论:
为了支持多个区域之间的多个区域,我们需要修改配置的gce提供程序代码,例如添加另一个字段来配置应该搜索哪些区域。
===========================更新======================= ==
我修改了 k8s 代码,在 github 上extra-zones
添加了一个像这个 diff 这样的配置字段,以使其适用于我的用例。
推荐阅读
- java - 提高 Apache Spark 到 Redis 的写入性能
- rabbitmq - RabbitMQ Web Stomp -- 关闭非 TLS 连接?
- oracle - Oracle OSM - 履行状态
- html - CSS Grid:将 div 推送到第一列并使其在悬停时跨越 100%
- python - 使用多个范围删除数据框的列
- json - 在 Excel 中使用 VBA 从 API 中检索 Json(API 密码问题)
- python - Python pyserial
- python - 如何在 Django 中打开特定外键的层次结构子级?
- javascript - 使用 window.history.pushstate 获取分页以跟随“后退”/“前进”按钮
- javascript - 根据用户运行时间给出的延迟加载 DIV 标签 - angularjs