Kubernetes: не удалось получить GCE GCECloudProvider с ошибкой <nil>

Я настроил пользовательский кластер kubernetes на GCE, используя kubeadm. Я пытаюсь использовать StatefulSets с постоянным хранилищем.

У меня есть следующая конфигурация:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gce-slow
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  zones: europe-west3-b
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myname
  labels:
    app: myapp
spec:
  serviceName: myservice
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: mycontainer
          image: ubuntu:16.04
          env:
          volumeMounts:
          - name: myapp-data
            mountPath: /srv/data
      imagePullSecrets:
      - name: sitesearch-secret
  volumeClaimTemplates:
  - metadata:
      name: myapp-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: gce-slow
      resources:
        requests:
          storage: 1Gi

И я получаю следующую ошибку:

Nopx@vm0:~$ kubectl describe pvc
 Name:          myapp-data-myname-0
 Namespace:     default
 StorageClass:  gce-slow
 Status:        Pending
 Volume:
 Labels:        app=myapp
 Annotations:   volume.beta.kubernetes.io/storage-provisioner=kubernetes.io/gce-pd
 Finalizers:    [kubernetes.io/pvc-protection]
 Capacity:
 Access Modes:
 Events:
   Type     Reason              Age   From                         Message
   ----     ------              ----  ----                         -------
   Warning  ProvisioningFailed  5s    persistentvolume-controller  Failed to provision volume 
 with StorageClass "gce-slow": Failed to get GCE GCECloudProvider with error <nil>

Я шагаю в темноте и не знаю, чего не хватает. Кажется логичным, что это не работает, так как поставщик никогда не аутентифицируется в GCE. Любые намеки и указатели очень ценятся.

РЕДАКТИРОВАТЬ

Я попробовал решение здесь, отредактировав файл конфигурации в kubeadm с помощью kubeadm config upload from-fileОднако ошибка сохраняется. Конфигурация kubadm выглядит следующим образом:

api:
  advertiseAddress: 10.156.0.2
  bindPort: 6443
  controlPlaneEndpoint: ""
auditPolicy:
  logDir: /var/log/kubernetes/audit
  logMaxAge: 2
  path: ""
authorizationModes:
- Node
- RBAC
certificatesDir: /etc/kubernetes/pki
cloudProvider: gce
criSocket: /var/run/dockershim.sock
etcd:
  caFile: ""
  certFile: ""
  dataDir: /var/lib/etcd
  endpoints: null
  image: ""
  keyFile: ""
imageRepository: k8s.gcr.io
kubeProxy:
  config:
    bindAddress: 0.0.0.0
    clientConnection:
      acceptContentTypes: ""
      burst: 10
      contentType: application/vnd.kubernetes.protobuf
      kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
      qps: 5
    clusterCIDR: 192.168.0.0/16
    configSyncPeriod: 15m0s
    conntrack:
      max: null
      maxPerCore: 32768
      min: 131072
      tcpCloseWaitTimeout: 1h0m0s
      tcpEstablishedTimeout: 24h0m0s
    enableProfiling: false
    healthzBindAddress: 0.0.0.0:10256
    hostnameOverride: ""
    iptables:
      masqueradeAll: false
      masqueradeBit: 14
      minSyncPeriod: 0s
      syncPeriod: 30s
    ipvs:
      minSyncPeriod: 0s
      scheduler: ""
      syncPeriod: 30s
    metricsBindAddress: 127.0.0.1:10249
    mode: ""
    nodePortAddresses: null
    oomScoreAdj: -999
    portRange: ""
    resourceContainer: /kube-proxy
    udpIdleTimeout: 250ms
kubeletConfiguration: {}
kubernetesVersion: v1.10.2
networking:
  dnsDomain: cluster.local
  podSubnet: 192.168.0.0/16
  serviceSubnet: 10.96.0.0/12
nodeName: mynode
privilegedPods: false
token: ""
tokenGroups:
- system:bootstrappers:kubeadm:default-node-token
tokenTTL: 24h0m0s
tokenUsages:
- signing
- authentication
unifiedControlPlaneImage: ""

редактировать

Вопрос был решен в комментариях благодаря Антону Костенко. Последнее редактирование в сочетании с kubeadm upgrade решает проблему.

1 ответ

Ответ занял у меня некоторое время, но вот он:

Использование GCECloudProvider в Kubernetes вне Google Kubernetes Engine имеет следующие предварительные условия (последний пункт относится к Kubeadm):

  1. Виртуальная машина должна работать с учетной записью службы, которая имеет право на подготовку дисков. Информацию о том, как запустить виртуальную машину с учетной записью службы, можно найти здесь.

  2. Kubelet должен работать с аргументом --cloud-provider=gce, Для этого KUBELET_KUBECONFIG_ARGS в /etc/systemd/system/kubelet.service.d/10-kubeadm.conf должны быть отредактированы. Kubelet может быть перезапущен с sudo systemctl restart kubelet

  3. Файл облачной конфигурации Kubernetes должен быть настроен. Файл можно найти по адресу /etc/kubernetes/cloud-config и следующего контента достаточно, чтобы заставить облачного провайдера работать:

    [Global]
    project-id = "<google-project-id>"
    
  4. Kubeadm должен настроить GCE в качестве своего облачного провайдера. Конфиг, размещенный в вопросе, прекрасно работает для этого. Тем не менее nodeName должен быть изменен.

Создавайте динамические постоянные тома в узлах Kubernetes в облачной виртуальной машине Google.

Роль GCP:

  1. Облачная консоль Google перейдите в IAM & Admin.
  2. Добавьте новую учетную запись службы, например, gce-user.
  3. Добавьте роль "администратор вычислительного экземпляра".

Добавьте роль в GCP VM:

  1. остановите экземпляр и нажмите "Изменить".
  2. щелкните учетную запись службы и выберите новую учетную запись, например, gce-user.
  3. запустить виртуальную машину.

Добавьте параметр GCE в кубелет во всех узлах.

  • добавить "--cloud-provider = gce"
  • sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

добавить значение:

Environment="KUBELET_KUBECONFIG_ARGS= - bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cloud-provider=gce"

  • создать новый файл / etc / kubernetes / cloud-config на всех узлах

добавьте этот параметр. [Глобальный]id-проекта = "xxxxxxxxxxxx"

  • перезапустить кубелет
  • Добавить gce в контроллер-мастер
  • vi /etc/kubernetes/manifestests добавьте эти параметры в команды:
  • --cloud-provider = gce

затем перезапустите плоскость управления.

запустите контроллер ps -ef |grep, тогда вы должны увидеть "gce" в выводе контроллера.

Примечание. Вышеуказанный метод не рекомендуется в производственной системе, используйте конфигурацию kubeadm для обновления настроек диспетчера контроллеров.

Другие вопросы по тегам