Кластер Kubernetes не может подключать и монтировать автоматически созданные диски облачной платформы Google к рабочим узлам - PullRequest
0 голосов
/ 29 мая 2019

В основном я пытаюсь развернуть кластер на GCE через kubeadm с поддержкой StorageClass (без использования Google Kubernetes Engine).

Скажем, я развернул кластер с главным узлом в Токио и тремя рабочими узлами в Гонконге, Тайване и Орегоне.

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"

Кублет на каждом узле начинался с --cloud-provider=gce, но я не нашел, как настроить зону. И когда я проверил журнал kubelet, я обнаружил, что этот флаг уже устарел на kubernetes v1.14.2 (последний раз в мае 2019 года).

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

ПВХ:

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

1 Ответ

1 голос
/ 30 мая 2019

После нескольких дней исследований я обнаружил, что причина:

  1. Главный узел находится в asia-northeast1-a (Токио)
  2. Рабочие узлы находятся в asia-east1-a (Тайвань) и других зонах
  3. cloud-provider-gcp только для поиска зоны в одном регионе (обычно это зона главного узла, но вы можете указать ее, установив local-zone в файле конфигурации облака), что означает, что она может поддерживать только один зона или несколько зон в одном регионе по умолчанию

Вывод:

Для поддержки нескольких зон в нескольких регионах нам необходимо изменить код конфигурации поставщика gce, например добавить другое поле, чтобы указать, какие зоны следует искать.

========================== UPDATE ==================== =====

Я изменил код k8s, добавив поле конфигурации extra-zones, например этот diff на github , чтобы оно работало в моем случае использования.

...