【问题标题】:Kubernetes provisioning PVC from GCE Persistent disk volume shows errorKubernetes 从 GCE 持久磁盘卷配置 PVC 显示错误
【发布时间】:2020-05-16 18:29:52
【问题描述】:

我正在使用具有 2 个节点的 GCE 集群,我使用 kubeadm 进行设置。现在我想为要部署的 postgresql 设置一个持久卷。我创建了一个带有 storageClass 的 PVC 和 PV,并在同一个项目中创建了一个名为 postgres 的 10G 磁盘空间。我在下面附加了 PVC、PV 和部署的脚本。我也在使用有权访问磁盘的服务帐户。

1.Deployment.yml

apiVersion: apps/v1
kind: Deployment 
metadata:
  name: kyc-postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - image: "postgres:9.6.2"
        name: postgres
        ports:
        - containerPort: 5432
          name: postgres
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/db-data
      volumes:
      - name: postgres-storage
        persistentVolumeClaim:
          claimName: kyc-postgres-pvc

2.PersistentVolumeClaim.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: kyc-postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: standard

3.PersistentVolume.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: kyc-postgres-pv
  annotations:
    kubernetes.io/createdby: gce-pd-dynamic-provisioner
    pv.kubernetes.io/bound-by-controller: "yes"
    pv.kubernetes.io/provisioned-by: kubernetes.io/gce-pd
  finalizers:
  - kubernetes.io/pv-protection
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: kyc-postgres-pvc
    namespace: default
  gcePersistentDisk:
    fsType: NTFS
    pdName: postgres
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: failure-domain.beta.kubernetes.io/zone
          operator: In
          values:
          - us-central1-a
        - key: failure-domain.beta.kubernetes.io/region
          operator: In
          values:
          - us-central1-a
  persistentVolumeReclaimPolicy: Delete
  storageClassName: standard
  volumeMode: Filesystem
status:
  phase: Bound
  1. StorageClass.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  zone: us-central1-a

现在,当我创建这些卷和部署时,pod 没有正确启动。当我厌倦了创建部署时,我收到以下错误。

Failed to get GCE GCECloudProvider with error <nil>

我还附上了kubectl get sc的输出

NAME       PROVISIONER            RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
standard   kubernetes.io/gce-pd   Delete          Immediate           false                  10m

有人可以帮我解决这个问题吗?提前感谢您的宝贵时间 - 如果我遗漏了任何内容、过分强调或过分强调某个特定点,请在 cmets 中告诉我。

【问题讨论】:

  • 可以添加kubectl get sc的输出吗?

标签: postgresql kubernetes google-compute-engine persistent-volumes


【解决方案1】:

你的PersistentVolumeClaim 没有指定storageClassName,所以我想你可能想使用默认的StorageClass。使用默认 StorageClass 时,您无需创建 PersistentVolume 资源,该资源将从 Google Cloud Platform 动态提供。 (或者有什么特殊原因你不想使用默认的 StorageClass?)

【讨论】:

  • 感谢您的回复。实际上我错过了在 PerisistentVolumeClaim 中指定 storageClassName。另外我相信,当我使用 StorageClass 时,我会选择动态配置磁盘。所以当我使用上面提到的StoragClass(我已经添加了存储类,请看),我不需要手动创建磁盘并编写PersistentVolume资源文件。?
  • 您不需要创建PersistentVolume,并且您可以使用 default StorageClass,据我所知。所以你不需要指定storageClassName。这在 GKE 中开箱即用。除非您想要特定的需求,例如使用区域磁盘或其他东西。
【解决方案2】:

在 Google Kubernetes Engine 之外的 Kubernetes 中使用 GCECloudProvider 具有以下先决条件:

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

  2. Kubelet 需要使用 argument --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 配置为其cloud provider。但是,nodeName 必须更改。编辑配置文件并通过kubeadm config upload from-file上传到集群

    cloudProvider: gce
    

【讨论】:

  • 第三步,我有4个文件,admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf。我必须在哪个文件中添加项目 ID,我应该在所有节点中都这样做吗?
  • cloud-config 文件需要创建(如果它不存在)并通过在 kube-apiserver、kube-controller-manager 和库贝莱特。由于 kubelet 在每个节点中运行,因此只需要在每个节点中完成 kubelet
猜你喜欢
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2018-07-24
  • 2017-10-08
  • 2018-12-21
  • 2016-09-02
相关资源
最近更新 更多