前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 配置 StorageClass(NFS)

Kubernetes 配置 StorageClass(NFS)

原创
作者头像
懒人的小脑
修改2020-11-30 11:23:52
4.9K0
修改2020-11-30 11:23:52
举报

在 k8s 环境,当pod需要存储空间时,StorageClass 比 PV 更灵活和方便。

环境信息

  1. Kubernetnes 1.18.3
  2. Kubernetnes 宿主机:CentOS 7.7
  3. NFS 服务:IP 地址 172.17.100.71,nfs 共享存储目录/storage

如何创建 StorageClass

  1. 创建或者选取一个 Namespace
  2. 创建 rbac,因为 StorageClass 有对应的 Pod 要运行,每个 pod 都有自己的身份即 ServiceAccount,而这个 serviceAccount 是和某个角色绑定的,所以需要创建 ServiceAccount、rule、rolebinding
  3. 创建 provisioner,即关联 NFS 工作类,负责给 PVC 提供存储资源,这里使用的是 nfs-client-provisione
  4. 创建 StorageClass,所有需要 PVC 通过该 StorageClass 即可获得存储空间

创建 StorageClass

  1. 创建或选取一个 Namespace 用于运行 nfs 相关的 pod。

这里使用了 kube-system名称空间。

  1. 创建 rbac
代码语言:txt
复制
kubectl apply -f https://raw.githubusercontent.com/Simontage/k8s/main/StorageClass-demo/rbac.yaml
代码语言:txt
复制
apiVersion: v1

kind: ServiceAccount

metadata:

  name: nfs-client-provisione

  # replace with namespace where provisioner is deployed

  namespace: kube-system

---

kind: ClusterRole

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  name: nfs-client-provisioner-runne

rules:

  - apiGroups: [""]

    resources: ["persistentvolumes"]

    verbs: ["get", "list", "watch", "create", "delete"]

  - apiGroups: [""]

    resources: ["persistentvolumeclaims"]

    verbs: ["get", "list", "watch", "update"]

  - apiGroups: ["storage.k8s.io"]

    resources: ["storageclasses"]

    verbs: ["get", "list", "watch"]

  - apiGroups: [""]

    resources: ["events"]

    verbs: ["create", "update", "patch"]

---

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  name: run-nfs-client-provisione

subjects:

  - kind: ServiceAccount

    name: nfs-client-provisione

    # replace with namespace where provisioner is deployed

    namespace: kube-system

roleRef:

  kind: ClusterRole

  name: nfs-client-provisioner-runne

  apiGroup: rbac.authorization.k8s.io

---

kind: Role

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  name: leader-locking-nfs-client-provisione

  # replace with namespace where provisioner is deployed

  namespace: kube-system

rules:

  - apiGroups: [""]

    resources: ["endpoints"]

    verbs: ["get", "list", "watch", "create", "update", "patch"]

---

kind: RoleBinding

apiVersion: rbac.authorization.k8s.io/v1

metadata:

  name: leader-locking-nfs-client-provisione

  # replace with namespace where provisioner is deployed

  namespace: kube-system

subjects:

  - kind: ServiceAccount

    name: nfs-client-provisione

    # replace with namespace where provisioner is deployed

    namespace: kube-system

roleRef:

  kind: Role

  name: leader-locking-nfs-client-provisione

  apiGroup: rbac.authorization.k8s.io
  1. 创建 provisione
代码语言:txt
复制
kubectl apply -f https://raw.githubusercontent.com/Simontage/k8s/main/StorageClass-demo/deployment.yaml
代码语言:txt
复制
apiVersion: apps/v1

kind: Deployment

metadata:

  name: nfs-client-provisione

  labels:

    app: nfs-client-provisione

  # replace with namespace where provisioner is deployed

  namespace: kube-system

spec:

  replicas: 1

  strategy:

    type: Recreate

  selector:

    matchLabels:

      app: nfs-client-provisione

  template:

    metadata:

      labels:

        app: nfs-client-provisione

    spec:

      serviceAccountName: nfs-client-provisione

      containers:

        - name: nfs-client-provisione

          image: quay.mirrors.ustc.edu.cn/external\_storage/nfs-client-provisioner:latest

          volumeMounts:

            - name: nfs-client-root

              mountPath: /persistentvolumes

          env:

            - name: PROVISIONER\_NAME

              value: fuseim.pri/ifs

            - name: NFS\_SERVER

              value: 172.17.100.71

            - name: NFS\_PATH

              value: /storage

      volumes:

        - name: nfs-client-root

          nfs:

            server: 172.17.100.71

            path: /storage

创建之后建议使用 kubectl describe pod-XXXXXX -n kube-systemkubectl logs -f xxxxxx -n kube-system

  1. 创建 StorageClass
代码语言:txt
复制
kubectl apply -f https://raw.githubusercontent.com/Simontage/k8s/main/StorageClass-demo/class.yaml
代码语言:txt
复制
apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

  name: managed-nfs-storage

  #可选,是否配置为默认 StorageClass

  annotations:

    storageclass.kubernetes.io/is-default-class: "true"

provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER\_NAME'

parameters:

  archiveOnDelete: "false"

class.yaml中的StorageClass名为managed-nfs-storage,后面的PVC就用这个名字去申请存储空间。

配置默认 StorageClass

列出集群中的 StorageClass

代码语言:txt
复制
kubectl get storageclass

NAME                 PROVISIONER               AGE

standard (default)   kubernetes.io/gce-pd      1d

gold                 kubernetes.io/gce-pd      1d

标记默认 StorageClass 非默认:

代码语言:txt
复制
kubectl patch storageclass standard -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

标记一个 StorageClass 为默认:

代码语言:txt
复制
kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

最多只能有一个 StorageClass 能够被标记为默认。 如果它们中有两个或多个被标记为默认,Kubernetes 将忽略这个注解, 也就是它将表现为没有默认 StorageClass。

参考链接

https://cloud.tencent.com/developer/article/1632950

https://kubernetes.io/zh/docs/tasks/administer-cluster/change-default-storage-class/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境信息
  • 如何创建 StorageClass
  • 创建 StorageClass
  • 配置默认 StorageClass
  • 参考链接
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档