我就是我,不一样的烟火。
容器是可以随时死去的,但是,我们在容器执行完成之后,需要把结果存储下来,而我们的pod 是在各个主机上的,或者是一组pod 协同工作的时候,需要同时读写一块共同的数据,那么自然需要一个共同的可用的存储,我们使用的NFS 文件系统。
这里说明如何做安装nfs 服务已经使用k8s 创建在nfs 上创建pv,pvc 。
搭建NFS 服务
NFS需要nfs-utils和rpcbind两个包, 但安装nfs-utils时会一起安装上rpcbind
rpcinfo -p
rpm -qa |grep nfs-utils
yum -y install nfs-utils
# 设置开机启动
systemctl enable rpcbind.service
systemctl enable nfs-server.service
# 启动
systemctl start nfs-utils
systemctl enable nfs-utils
# 查看nfs服务信息
rpcinfo -p
# 关闭防火墙
systemctl stop firewalld.service
# 客户端只需要client 连接服务端即可
yum install nfs-utils
# 客户端验证
[root@localhost ~]# showmount -e 192.168.64.133
Export list for 192.168.64.133:
/home/nfs *
# 客户端挂载,挂载访问点:把服务端的文件目录挂载在本地 ,本地是/data/kubernetes
mkdir -p /data/kubernetes
mount -t nfs 192.168.10.134:/dada/k8s /data/kubernetes -o proto=tcp -o nolock
# 意思就是服务端上的挂载点是134 的 dada/k8s , 133 本地的目录是 /data/kubernetes
注意:挂载的时候,挂载点 /data/kubernetes 目录必须已经存在, 且在 /data/kubernetes 目录中没有文件或子目录。
k8s 的pv pvc
k8s 配置nfs provisor ,一个提供者,创建完storageCalss 之后,创建pv ,然后创建pvc
静态是直接指定多大的pv,指定使用多大的pvc
动态是从pvc 大小,自动的创建 pv 进行绑定,是和静态创建相反的过程。
即:
如果在pv 中指定了nfs 的路径,则是静态pv
如果是通过provisor 来指定,是动态pv 。
在k8s 原先配置一个nfs RBAC权限,使用create 命令创建。
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-provisioner-runner
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: ["watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-provisioner"]
verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
配置一个nfs provisioner :
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 192.168.64.134
- name: NFS_PATH
value: /dada/kubernetes
volumes:
- name: nfs-client-root
nfs:
server: 192.168.64.134
path: /dada/kubernetes
配置storageClass
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: fuseim.pri/ifs
测试例子:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web1
spec:
serviceName: "nginx3"
replicas: 1
volumeClaimTemplates:
- metadata:
name: default
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 2Gi
template:
metadata:
labels:
app: nginx3
spec:
containers:
- name: nginx
image: nginx:1.7.9
volumeMounts:
- mountPath: "/mnt"
name: default
部署
[root@bogon statefulset]# kubectl create -f deployment-nfs.yaml
[root@bogon statefulset]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nfs-client-provisioner 1 1 1 1 36m
[root@bogon statefulset]# kubectl create -f storageclass-nfs.yaml
[root@bogon statefulset]# kubectl get storageclass
NAME PROVISIONER AGE
managed-nfs-storage fuseim.pri/ifs 36m
[root@bogon statefulset]# kubectl create -f statefulset-nfs.yaml
statefulset "web" created
[root@bogon statefulset]# kubectl get pvc
小结
pvc 其实就是在 /dada/kubernetes 上这个目录下存储的数据,这个数据在 133 上可以从/data/kubernetes 上可以看到 。
volumeClaimTemplates 下的metadata.name属性必须和最下面的voluments.name属性一致,创建pod 的会校验。默认动态生成的pvc名称就是 : {volumeClaimTemplates.metadata.name}-{podName}"。 通过注解方式实现动态pvc绑定。
动态创建的pvc 删除之后,根据 策略,如果是delete ,pv也会自动删除、
网友评论