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):
Виртуальная машина должна работать с учетной записью службы, которая имеет право на подготовку дисков. Информацию о том, как запустить виртуальную машину с учетной записью службы, можно найти здесь.
Kubelet должен работать с аргументом
--cloud-provider=gce
, Для этогоKUBELET_KUBECONFIG_ARGS
в/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
должны быть отредактированы. Kubelet может быть перезапущен сsudo systemctl restart kubelet
Файл облачной конфигурации Kubernetes должен быть настроен. Файл можно найти по адресу
/etc/kubernetes/cloud-config
и следующего контента достаточно, чтобы заставить облачного провайдера работать:[Global] project-id = "<google-project-id>"
Kubeadm должен настроить GCE в качестве своего облачного провайдера. Конфиг, размещенный в вопросе, прекрасно работает для этого. Тем не менее
nodeName
должен быть изменен.
Создавайте динамические постоянные тома в узлах Kubernetes в облачной виртуальной машине Google.
Роль GCP:
- Облачная консоль Google перейдите в IAM & Admin.
- Добавьте новую учетную запись службы, например, gce-user.
- Добавьте роль "администратор вычислительного экземпляра".
Добавьте роль в GCP VM:
- остановите экземпляр и нажмите "Изменить".
- щелкните учетную запись службы и выберите новую учетную запись, например, gce-user.
- запустить виртуальную машину.
Добавьте параметр 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 для обновления настроек диспетчера контроллеров.