前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Kubernetes(k8s)-StorageClass案例

Kubernetes(k8s)-StorageClass案例

作者头像
运维小路
发布2025-01-20 20:40:23
发布2025-01-20 20:40:23
9000
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们上一小节介绍了StorageClass的基本逻辑,本小节将介绍一个真实的案例使用最容易获取的nfs作为服务端来提供存储。

1.准备NFS

这里的nfs是我已经提前搭建的好的nfs服务端。安装参考:Linux基础软件-nfs,记住nfs服务器的ip和路径后面会用到。

代码语言:javascript
代码运行次数:0
复制
[root@node01 ~]# showmount -e 192.168.31.194
Export list for 192.168.31.194:
/home *

2.创建对应的资源

当然这里的RBAC,我们还没讲,你可以简单的理解这个是我们向Kube-apiservice申请的权限,暂时我们先忽略。

代码语言:javascript
代码运行次数:0
复制
apiVersion: v1
kind: Namespace
metadata:
  name: nfs-provisioner
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
  namespace: nfs-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "update", "list", "watch", "create", "delete", "patch"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: run-nfs-provisioner
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nfs-provisioner-runner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: nfs-provisioner

创建一个命名空间,创建一个ServiceAccount供Pod使用,创建一个ClusterRole(定义了需要的权限)和ClusterRoleBinding,并把他权限加给创建的ServiceAccount。

3.创建控制器

代码语言:javascript
代码运行次数:0
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-provisioner
  namespace: nfs-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-provisioner
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccountName: nfs-provisioner
      containers:
        - name: nfs-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          env:
            - name: PROVISIONER_NAME
              value: my-nfs-provisioner
            - name: NFS_SERVER
              value: 192.168.31.194
            - name: NFS_PATH
              value: /home
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.31.194
            path: /home

创建一个NFS控制器的Deployment,引用刚才的ServiceAccount,使得这个Pod具备操作pv及pvc和sc的相关权限和能力。

注:这个Pod所在的节点也必须安装NFS客户端,因为这个Pod会把NFS挂载到自己的容器里面。

4.创建StorageClass

代码语言:javascript
代码运行次数:0
复制
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: my-nfs-provisioner

创建一个StorageClass,使用刚才的创建的Pod,通过它来完成NFS相关资源的创建删除回收并且提供给PVC调用。

5.PVC申请资源

代码语言:javascript
代码运行次数:0
复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: nfs-provisioner
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
  storageClassName: nfs-storage

到这里PVC的流程上其实就已经结束,但是由于版本的问题,这个PVC并不能创建成功,nfs-provisioner这个控制器Pod会出现下面的错误。

代码语言:javascript
代码运行次数:0
复制
I0113 08:45:10.442535       1 controller.go:987] provision "nfs-provisioner/my-pvc" class "nfs-storage": started
E0113 08:45:10.445031       1 controller.go:1004] provision "nfs-provisioner/my-pvc" class "nfs-storage": unexpected error getting claim reference: selfLink was empty, can't make reference

我们还需要修改kub-apiservice参数才可用正常使用,修改方法:

代码语言:javascript
代码运行次数:0
复制
vi /etc/kubernetes/manifests/kube-apiserver.yaml
#添加一行,注意格式
- --feature-gates=RemoveSelfLink=false

这个时候PVC创建成功,在NFS服务器里面会创建对应PVC的目录,这样可用确保每个PVC都是有自己独立的目录。确保数据不冲突,管理也更方便。

剩下的其实就是在Pod里里面使用这个PVC,可以参考我们上上小节的引用方式(Kubernetes(k8s)-PV&PVC应用)。这样业务方可根据自己的业务需求创建PVC,来申请对应的资源,并不需要手工去处理PVC和PV的绑定关系,这个操作会由StorageClass直接完成。

当然如果你的业务比较简单,也可用直接在Pod里面引用NFS,而不经过PV,PVC,StorageClass这一系列操作。

代码语言:javascript
代码运行次数:0
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"  # 挂载点,根据需要更改
          name: nfs-volume
      volumes:
      - name: nfs-volume
        nfs:
          server: 192.168.31.194  # 替换为你的NFS服务器IP地址
          path: "/home"  # 替换为NFS服务器上导出路径

注意:Pod所在的节点也必须安装NFS客户端,而且由于不知道哪个节点会被调度,所以需要在每个节点都安装NFS客户端。

历史推荐内容Docker-docker基本信息,基本命令,dockerfile,原理,仓库,存储网络日志,番外篇云计算&虚拟化-包括服务器购买,虚拟化介绍,虚拟磁盘,虚拟网络,创建虚拟机,安装虚拟机,dashboard,xml解释,克隆,快照,初始化,esxi介绍。Linux进阶-包括硬件,日常运维,基础软件,日志,进阶命令,防火墙,shell编程,内核,linux系统及初始化Linux基础-包括文件的增删改查,磁盘管理,网络配置,用户配置,权限配置

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档