作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
我们上一小节介绍了StorageClass的基本逻辑,本小节将介绍一个真实的案例使用最容易获取的nfs作为服务端来提供存储。
1.准备NFS
这里的nfs是我已经提前搭建的好的nfs服务端。安装参考:Linux基础软件-nfs,记住nfs服务器的ip和路径后面会用到。
[root@node01 ~]# showmount -e 192.168.31.194
Export list for 192.168.31.194:
/home *
2.创建对应的资源
当然这里的RBAC,我们还没讲,你可以简单的理解这个是我们向Kube-apiservice申请的权限,暂时我们先忽略。
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.创建控制器
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
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: my-nfs-provisioner
创建一个StorageClass,使用刚才的创建的Pod,通过它来完成NFS相关资源的创建删除回收并且提供给PVC调用。
5.PVC申请资源
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会出现下面的错误。
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参数才可用正常使用,修改方法:
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这一系列操作。
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基础-包括文件的增删改查,磁盘管理,网络配置,用户配置,权限配置 |
---|