k8s之StorageClass(NFS)

一、前言

1、环境 k8s v1.23.5 ,服务器是centos7.9

192.168.164.20 k8s-master1
192.168.164.30 k8s-node1
192.168.164.40 k8s-node2

2、貌似storageClass在kubernetes v1.20就被砍了。

因为它比较慢,而且耗资源,但可以通过不同的实现镜像绕过,本帖就绕过了

3、本帖的这个sc底层是NFS实现的,所以需要NFS支持

二、创建NFS服务

1、给所有节点安装nfs-utils

yum install -y nfs-utils

2、在Master节点上搭建NFS服务

2-1、创建NFS共享目录

mkdir -p /data/k8s-nfs/nfs-provisioner

注:以后k8s申请的pv就自动被创建在这个目录下了

2-2、挂载目录到nfs

echo "/data/k8s-nfs/nfs-provisioner 192.168.164.0/24(rw,no_root_squash)" >> /etc/exports

注:192.168.164.0/24指的是你的谁可以访问这个nfs服务,通常是和k8s同网段的内网主机IP段。

2-3、启动NFS服务

systemctl start nfs-server.service
systemctl enable nfs-server.service

3、在任意Node节点上测试NFS服务是否生效

[root@k8s-node1 ~]# showmount -e 192.168.164.20
Export list for 192.168.164.20:
/data/k8s-nfs/nfs-provisioner 192.168.164.0/24

 注:192.168.164.20是你的NFS服务器,也是你的k8s-master节点ip

三、创建storageClass所需的配置文件和示例eg文件

1、创建sc所用的rbac

vim init-sc-serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- 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-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
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-provisioner# replace with namespace where provisioner is deployednamespace: default
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io

2、部署 NFS-Subdir-External-Provisioner

vim init-sc-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:nodeName: k8s-master1        # 这里是你的k8s-master节点的主机名,设置在master节点运行tolerations:                 # 设置容忍master节点污点- key: node-role.kubernetes.io/masteroperator: Equalvalue: "true"serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 192.168.164.20       # 这里是你的k8s-master节点的ip,也是nfs服务器地址- name: NFS_PATHvalue: /data/k8s-nfs/nfs-provisioner   # 这是NFS服务器端共享出来的路径volumes:- name: nfs-client-rootnfs:server: 192.168.164.20        # 这里是你的k8s-master节点的ip,也是nfs服务器地址path: /data/k8s-nfs/nfs-provisioner      # 这是NFS服务器端共享出来的路径

镜像可替换为:

37213690/nfs-subdir-external-provisioner:v4.0.0
registry.cn-hangzhou.aliyuncs.com/kahnxiao/nfs-subdir-external-provisioner:v4.0.0 

3、创建NFS StorageClass

vim init-sc-storage.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storageannotations:storageclass.kubernetes.io/is-default-class: "false"  # 是否设置为默认的storageclass
provisioner: k8s/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
allowVolumeExpansion: true
parameters:archiveOnDelete: "false" # 设置为"false"时删除PVC不会保留数据,"true"则保留数据

4、创建PVC

vim init-sc-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-claim
spec:storageClassName: managed-nfs-storageaccessModes: ["ReadWriteMany","ReadOnlyMany"]resources:requests:storage: 100Mi

5、创建Pod并绑定PV

vim eg-sc-busybox.yaml
apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: test-podimage: busybox:1.28imagePullPolicy: IfNotPresentcommand:- "/bin/sh"args:- "-c"- "sleep 3600"volumeMounts:- name: nfs-pvcmountPath: "/mnt/busybox"restartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: nfs-claim

四、使用配置文件生成StorageClass和示例eg资源

1、生成ServiceAccount

[root@k8s-master1 init-StorageClass]# kubectl apply -f init-sc-serviceaccount.yaml
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created

 

 2、生成NFS-Subdir-External-Provisioner

[root@k8s-master1 init-StorageClass]# kubectl apply -f init-sc-deployment.yaml
deployment.apps/nfs-client-provisioner created

 

 3、生成NFS StorageClass

[root@k8s-master1 init-StorageClass]# kubectl apply -f init-sc-storage.yaml

 4、生成PVC

[root@k8s-master1 init-StorageClass]# kubectl apply -f init-sc-pvc.yaml

 5、生成示例pod

[root@k8s-master1 init-StorageClass]# kubectl apply -f eg-sc-busybox.yaml
pod/test-pod created

五、测试动态NFS存储的效果

[root@k8s-master1 init-StorageClass]# kubectl exec -it test-pod -- ls /mnt/busybox/
[root@k8s-master1 init-StorageClass]# kubectl exec -it test-pod -- touch /mnt/busybox/test.txt
[root@k8s-master1 init-StorageClass]# ls /data/k8s-nfs/nfs-provisioner/
default-nfs-claim-pvc-3d0d0a1f-3ba1-4935-a420-d5b8aba38ab0
[root@k8s-master1 init-StorageClass]# echo "haha" > /data/k8s-nfs/nfs-provisioner/default-nfs-claim-pvc-3d0d0a1f-3ba1-4935-a420-d5b8aba38ab0/test.txt 
#再去看容器的挂载目录,发现刚写的内容已经跑到了容器里了
[root@k8s-master1 init-StorageClass]# kubectl exec -it test-pod -- cat /mnt/busybox/test.txt
haha

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/63707.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot启动图标替换-banner文件

1.banner.txt文件内容如下 ${AnsiColor.BRIGHT_YELLOW}${AnsiStyle.BOLD}_________ .__ __________ __ / _____/____________|__| ____ ____\______ \ ____ _____/ |_ \_____ \\____ \_ __ \ |/ \ / ___\| | _//…

cmake扩展(1)——VS+CMake创建Qt项目

创建项目 创建CMakeLists #cmake最低版本 cmake_minimum_required(VERSION 3.10) #项目名 project(regextool)#查找所有*.h,*.ui,*.cpp文件,并存入SOURCES中 file(GLOB SOURCES "*.cpp" "*.ui" "*.h")#开启moc set(CMAKE_AUTOMOC O…

Leetcode33 搜索旋转排序数组

题解: /*** 旋转排序数组可分为N1 N2两个部分,如:[4,5,6,7,1,2,3],N1为[4,5,6,7],N2为[1,2,3]** 必然满足以下两个条件:* 1. N1和N2都是分别递增的;* 2. N1中的所有元素大于N2中的所有元素;** …

Python-OpenCV中的图像处理-颜色空间转换

Python-OpenCV中的图像处理-颜色空间转换 颜色空间转换获取HSV的值 颜色空间转换 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种: BGR G r a y 和 B G R Gray 和 BGR Gray和BGRHSV。 注意:在 OpenCV 的…

8月9日上课内容 nginx反向代理与负载均衡

负载均衡工作当中用的很多的,也是面试会问的很重要的一个点 负载均衡:通过反向代理来实现(nginx只有反向代理才能做负载均衡) 正向代理的配置方法(用的较少) 反向代理的方式:四层代理与七层代…

三.SpringBoot整合Elasticsearch

SpringBoot整合Elasticsearch 前言一.java调用es的方式和工具二.java集成Elasticsearch-Rest-Client1.引入pom2.导入版本不一致问题3.编写配置类4.测试类4.1 执行前4.2 执行后 5.其他篇章 前言 我们整合es直接给es发请求就可以了,但是现在有很多方式去调用es的接口…

实战项目——多功能电子时钟

一,项目要求 二,理论原理 通过按键来控制状态机的状态,在将状态值传送到各个模块进行驱动,在空闲状态下,数码管显示基础时钟,基础时钟是由7个计数器组合而成,当在ADJUST状态下可以调整时间&…

HTML5 Canvas和Svg:哪个简单且好用?

HTML5 Canvas 和 SVG 都是基于标准的 HTML5 技术,可用于创建令人惊叹的图形和视觉体验。 首先,让我们花几句话介绍HTML5 Canvas和SVG。 什么是Canvas? Canvas(通过 标签使用)是一个 HTML 元素,用于在用户计算机屏幕…

kubernetes中最小组件——Pod

目录 一、Pod简介 二、Pod的使用方式 三、Pause——Pod中底层基础容器 四、为什么kubernetes这样设计Pod 五、Pod的分类 1.自主式Pod 2.控制器管理的Pod 3.静态Pod 六、Pod容器的分类 1. 基础容器(infrastructure container) 2. 初始化容器&am…

Reinforcement Learning with Code 【Chapter 10. Actor Critic】

Reinforcement Learning with Code 【Chapter 10. Actor Critic】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of …

pc端网页用vue并且实现响应式 vue+bootstrap-vue

1、hbuiler内新建vue项目 在项目文件夹下用npm加载依赖(或者用hbuilder内打开命令) 2、配置路由 src内新建router文件夹,router内新建index.js index.js内配置重定向到首页 main.js内配置路由 import router from /router/index.js new…

java获取到heapdump文件后,如何快速分析?

简介 在之前的OOM问题复盘之后,本周,又一Java服务出现了内存问题,这次问题不严重,只会触发堆内存占用高报警,没有触发OOM,但好在之前的复盘中总结了dump脚本,会在堆占用高时自动执行jstack与jm…