【问题标题】:Kubernetes: Failed to get GCE GCECloudProvider with error <nil>Kubernetes:获取 GCE GCECloudProvider 失败,错误 <nil>
【发布时间】:2018-10-10 12:45:25
【问题描述】:

我已经使用 kubeadm 在 GCE 上设置了一个自定义 kubernetes 集群。我正在尝试将 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 进行身份验证。非常感谢任何提示和指针。

编辑

我尝试了解决方案here,使用kubeadm config upload from-file 编辑kubeadm 中的配置文件,但错误仍然存​​在。 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: ""

编辑

感谢 Anton Kostenko,问题在 cmets 中得到了解决。最后的编辑加上kubeadm upgrade 解决了这个问题。

【问题讨论】:

  • 感谢提示,我会调查的。
  • 该问题的解决方案似乎不起作用。我编辑了问题。
  • 你打电话给upgrade了吗?这里是关于config 选项——“从 v1.8.0 开始,kubeadm 将集群的配置上传到 kube-system 命名空间中名为 kubeadm-config 的 ConfigMap 中,然后在升级时读取 ConfigMap。这样可以正确配置系统组件,并提供无缝的用户体验。”因此,要应用新配置,您应该更新集群。
  • 谢谢!毕竟这是个问题。我收到一个新错误“权限不足”,所以看起来第一个错误已经解决了。

标签: kubernetes google-compute-engine kubeadm


【解决方案1】:

答案花了我一段时间,但这里是:

在 Google Kubernetes Engine 之外的 Kubernetes 中使用 GCECloudProvider 具有以下先决条件(最后一点是 Kubeadm 特定的):

  1. VM 需要使用有权配置磁盘的服务帐户运行。有关如何使用服务帐户运行 VM 的信息,请参见 here

  2. Kubelet 需要使用参数--cloud-provider=gce 运行。为此必须编辑/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 中的KUBELET_KUBECONFIG_ARGS。然后可以使用 sudo systemctl restart kubelet

  3. 重新启动 Kubelet
  4. Kubernetes cloud-config 文件需要配置。该文件可以在/etc/kubernetes/cloud-config 找到,以下内容足以让云提供商工作:

    [Global]
    project-id = "<google-project-id>"
    
  5. Kubeadm 需要将 GCE 配置为其云提供商。问题中发布的配置适用于此。但是,nodeName 必须更改。

【讨论】:

  • 能分享一下/etc/kubernetes/cloud-config文件的内容吗
【解决方案2】:

在 Google 云虚拟机的 Kubernetes 节点中创建动态持久卷。

GCP 角色:

  1. 谷歌云控制台转到 IAM & Admin。
  2. 添加一个新的服务帐户,例如 gce-user。
  3. 添加角色“计算实例管理员”。

将角色添加到 GCP 虚拟机:

  1. 停止实例并点击编辑。
  2. 单击服务帐户并选择新帐户,例如 gce-user。
  3. 启动虚拟机。

在所有节点的kubelet中添加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"

  • 重启kubelet
  • 在主控制器中添加 gce
  • vi /etc/kubernetes/manifests 在命令下添加此参数:
  • --cloud-provider=gce

然后重启控制平面。

运行 ps -ef |grep 控制器,然后您必须在控制器输出中看到“gce”。

注意:生产系统不建议使用上述方法,请使用 kubeadm config 更新控制器管理器设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2017-11-23
    • 2016-10-28
    • 2019-12-02
    • 2019-03-05
    • 2017-05-18
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多