【问题标题】:GKE Pods unable to mount PVC using NFS server volume when on same nodeGKE Pod 在同一节点上时无法使用 NFS 服务器卷挂载 PVC
【发布时间】:2021-02-13 07:46:17
【问题描述】:

我正在运行一个 GKE 集群,该集群有多个尝试访问共享卷的 pod。由于 GC 永久磁盘不允许 ReadWriteMany 访问,我在集群中设置了一个 NFS 服务器(与this 等许多示例所做的相同)以允许它。我在这个集群上以不同的命名空间运行生产环境和开发环境,但是由于这两个环境都运行同一个应用程序,它们都需要自己的文件系统。

目前,解决此问题的方法是以相同的方式设置 2 个 NFS 服务器(一个用于 prod,一个用于 dev)。似乎当使用 NFS 服务器挂载卷的 pod 与 NFS 服务器本身位于同一节点上时,它们无法挂载(错误是“无法附加或挂载卷 [...]:超时等待条件”)。但是,这似乎只发生在 dev 环境中,因为 prod 环境没有任何问题。目前,两台 NFS 服务器已分配到同一个节点,这也可能导致问题,但我不确定。

我一直试图弄清楚以这种方式拥有 2 个 NFS 服务器是否存在问题,或者尝试将 pod 连接到在同一节点上运行的 NFS 服务器是否存在问题,但无济于事迄今为止。有什么想法可能导致问题吗?

登录 nfs 服务器 pod(dev 和 prod 相同):

nfs-dev-server  Oct 30, 2020, 3:57:23 PM    NFS started 
nfs-dev-server  Oct 30, 2020, 3:57:22 PM    exportfs: / does not support NFS export 
nfs-dev-server  Oct 30, 2020, 3:57:22 PM    Starting rpcbind    
nfs-dev-server  Oct 30, 2020, 3:57:22 PM    rpcinfo: can't contact rpcbind: : RPC: Unable to receive; errno = Connection refused    
nfs-dev-server  Oct 30, 2020, 3:57:21 PM    Serving /   
nfs-dev-server  Oct 30, 2020, 3:57:21 PM    Serving /exports

【问题讨论】:

  • NFS-server pod 中是否有日志?如果出现任何内容,您能否分享两个 pod 的输出,或者来自故障 nfs pod 的日志?
  • 我已经添加了 NFS 服务器 pod 的日志,但是尽管有这些错误,它们通常似乎工作正常(至少在 NFS 方面,而不是上述问题)。 NFS pod 不是失败的,只是没有任何东西能够从同一个节点挂载到它们。

标签: kubernetes google-kubernetes-engine nfs


【解决方案1】:

我通过关注tutorial you have linked 重现了您的问题并遇到了同样的问题,原因是我在创建第二个PersistentVolume 时没有更改服务器 IP

这就是我在 GKE 中的 2 个独立命名空间中部署 2 个 NFS 服务器的方式- version: 1.17.12-gke.2502

创建 2 个磁盘 gcloud compute disks create --size=10GB --zone=us-east1-b gce-nfs-disk gcloud compute disks create --size=10GB --zone=us-east1-b gce-nfs-disk2dev 命名空间中创建 NFS 部署和服务

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-server
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      role: nfs-server
  template:
    metadata:
      labels:
        role: nfs-server
    spec:
      containers:
      - name: nfs-server
        image: gcr.io/google_containers/volume-nfs:0.8
        ports:
          - name: nfs
            containerPort: 2049
          - name: mountd
            containerPort: 20048
          - name: rpcbind
            containerPort: 111
        securityContext:
          privileged: true
        volumeMounts:
          - mountPath: /exports
            name: mypvc
      volumes:
        - name: mypvc
          gcePersistentDisk:
            pdName: gce-nfs-disk
            fsType: ext4
---
apiVersion: v1
kind: Service
metadata:
  name: nfs-server
  namespace: dev
spec:
  # clusterIP: 10.3.240.20
  ports:
    - name: nfs
      port: 2049
    - name: mountd
      port: 20048
    - name: rpcbind
      port: 111
  selector:
    role: nfs-server

NFS部署成功后,检查服务kubectl get svc -n dev的ClusterIP并将其添加到nfs: server: <CLUSTER_IP>

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs
spec:
  storageClassName: standard
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: <CLUSTER_IP_OF_SVC>
    path: "/"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs
  namespace: dev
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-nginx
  namespace: dev
spec:
  replicas: 6
  selector:
    matchLabels:
      name: nfs-nginx
  template:
    metadata:
      labels:
        name: nfs-nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: busybox
        volumeMounts:
          # name must match the volume name below
          - name: nfs
            mountPath: "/mnt"
      volumes:
      - name: nfs
        persistentVolumeClaim:
          claimName: nfs

检查并确认一切正常运行:

kubectl get pods -n dev -w
NAME                          READY   STATUS              RESTARTS   AGE
nfs-nginx-587f8bd757-4gm8z    1/1     Running             0          6s
nfs-nginx-587f8bd757-6lh4l    1/1     Running             0          6s
nfs-nginx-587f8bd757-czr4r    0/1     Running             0          6s
nfs-nginx-587f8bd757-m5vph    1/1     Running             0          6s
nfs-nginx-587f8bd757-wqcff    1/1     Running             0          6s
nfs-nginx-587f8bd757-xqnf9    1/1     Running             0          6s
nfs-server-5f58f8d764-gjjnf   1/1     Running             0          3m14s

prod 命名空间重复相同的操作,但请记住在 prod 命名空间中更改 nfs-service 的 IP 地址,并在 PV 清单中进行相应更改。部署后结果:

$ kubectl get pods -n prod
NAME                           READY   STATUS    RESTARTS   AGE
nfs-nginx2-5d75567b95-7n7gk    1/1     Running   0          6m25s
nfs-nginx2-5d75567b95-gkqww    1/1     Running   0          6m25s
nfs-nginx2-5d75567b95-gt96p    1/1     Running   0          6m25s
nfs-nginx2-5d75567b95-hf9j7    1/1     Running   0          6m25s
nfs-nginx2-5d75567b95-k2jdv    1/1     Running   0          6m25s
nfs-nginx2-5d75567b95-q457q    1/1     Running   0          6m25s
nfs-server2-8654b89f48-bp9lv   1/1     Running   0          7m19s

【讨论】:

  • 你是直接输入集群IP的吗?我目前正在使用“nfs-dev-server.development.svc.cluster.local”的集群内访问形式,即。 “svc-name.namespace.svc.cluster.local”。如果这是问题所在,你知道为什么它可能是相关的吗?唯一的其他区别是我使用 storageClassName: "",它是在 PVC 而不是 PV 中分配的。
  • 如何将多个永久性磁盘添加到单个 NFS 服务器?例如/exports/disks1 -> 这将指向第一个永久性磁盘。 /exports/disks2 -> 这将指向第二个永久性磁盘。这两个磁盘都将用于单独的 PV 和 PVC。
  • @Gordie 我在调用kubectl get svc ...后直接添加了ClusterIP
  • 你知道为什么这会有所不同吗?似乎使用 dns 名称是更好的做法,因为如果重新制作服务并获得不同的 clusterIP,则不会更改 dns 名称。
猜你喜欢
  • 1970-01-01
  • 2021-12-22
  • 2021-11-26
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 2021-07-14
  • 2019-10-09
  • 1970-01-01
相关资源
最近更新 更多