1,為什么要使用Storage Class?
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),平魯網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:平魯?shù)鹊貐^(qū)。平魯做網(wǎng)站價(jià)格咨詢:028-86922220
2,stroage class在集群中的作用?
pvc是無法直接去向nfs-client-provisioner申請(qǐng)使用的存儲(chǔ)空間的,這時(shí),就需要通過SC這個(gè)資源對(duì)象去申請(qǐng)了,SC的根本作用就是根據(jù)pvc定義的來動(dòng)態(tài)創(chuàng)建pv,不僅節(jié)省了我們管理員的時(shí)間,還可以封裝不同類型的存儲(chǔ)供pvc選用。
Provisioner(供給方):提供了存儲(chǔ)資源的存儲(chǔ)系統(tǒng)。
ReclaimPolicy:pv的回收策略,可用的值有Delete(默認(rèn))和Retiain
Parameters(參數(shù)):存儲(chǔ)類使用參數(shù)描述要關(guān)聯(lián)到存儲(chǔ)卷。
3,下面基于NFS服務(wù)來實(shí)踐storage class
1)搭建NFS服務(wù)(我將master節(jié)點(diǎn)作為nfs server):
[root@master ~]# yum -y install nfs-utils
[root@master ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
[root@master ~]# mkdir /nfsdata #創(chuàng)建共享目錄
[root@master ~]# systemctl start rpcbind
[root@master ~]# systemctl enable rpcbind
[root@master ~]# systemctl start nfs-server
[root@master ~]# systemctl enable nfs-server
[root@master ~]# showmount -e #確保成功掛載
Export list for master:
/nfsdata *
2)創(chuàng)建rbac權(quán)限:
rbac(基于角色的訪問控制),就是用戶通過角色與權(quán)限進(jìn)行關(guān)聯(lián)。
是一個(gè)從認(rèn)證-----> 授權(quán)-----> 準(zhǔn)入機(jī)制。
[root@master sc]# vim rbac-rolebind.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-provisioner-runner
namespace: default
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","create","list", "watch","update"]
- 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
//執(zhí)行yaml文件:
[root@master sc]# kubectl apply -f rbac-rolebind.yaml
serviceaccount/nfs-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner created
以上我們新建的一個(gè)名為nfs-provisioner的ServiceAccount,然后綁定了一個(gè)名為nfs-provisioner-runner的ClusterRole,而該ClusterRole聲明了一些權(quán)限,其中就包括對(duì)pv的增,刪,改,查等權(quán)限,所以我們可以利用該serviceAccount來自動(dòng)創(chuàng)建pv。
3)創(chuàng)建一個(gè)nfs的Deployment
將里面的對(duì)應(yīng)的參數(shù)替換成我們自己的nfs配置。
[root@master sc]# vim nfs-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-client-provisioner
namespace: default
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: nfs-deploy #供給方的名稱(自定義)
- name: NFS_SERVER
value: 172.16.1.30 #nfs服務(wù)器的ip地址
- name: NFS_PATH
value: /nfsdata #nfs共享的目錄
volumes:
- name: nfs-client-root
nfs:
server: 172.16.1.30
path: /nfsdata
//導(dǎo)入nfs-client-provisioner鏡像(集群中的每個(gè)節(jié)點(diǎn)都需導(dǎo)入,包括master)
[root@master sc]# docker load --input nfs-client-provisioner.tar
5bef08742407: Loading layer 4.221MB/4.221MB
c21787dcfbf0: Loading layer 2.064MB/2.064MB
00376105a0f3: Loading layer 41.08MB/41.08MB
Loaded image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner:latest
//執(zhí)行yaml文件:
[root@master sc]# kubectl apply -f nfs-deployment.yaml
deployment.extensions/nfs-client-provisioner created
//確保pod正常運(yùn)行
[root@master sc]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-5457694c8b-k8t4m 1/1 Running 0 23s
nfs-client-provisionser工具的作用:它通過k8s的內(nèi)置的nfs驅(qū)動(dòng)掛載遠(yuǎn)端的nfs服務(wù)器到本地目錄,然后將自身作為storage provide(存儲(chǔ)提供),關(guān)聯(lián)sc。
4)創(chuàng)建storage class:
[root@master sc]# vim test-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: statefu-nfs
namespace: default
provisioner: nfs-deploy
reclaimPolicy: Retain
我們聲明了一個(gè)名為statefu-nfs的sc對(duì)象,注意下面的provisioner字段對(duì)應(yīng)的值一定要和上面的nfs的Deployment下面的PROVISIONER_NAME這個(gè)環(huán)境變量的值一樣。
//創(chuàng)建該資源對(duì)象:
[root@master sc]# kubectl apply -f test-sc.yaml
storageclass.storage.k8s.io/statefu-nfs created
5)上面把SC資源對(duì)象創(chuàng)建成功了,接下來我們測(cè)試是否能夠動(dòng)態(tài)創(chuàng)建pv。
//首先我們創(chuàng)建一個(gè)pvc對(duì)象:
[root@master sc]# vim test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-claim
namespace: default
spec:
storageClassName: statefu-nfs #sc一定要指向上面創(chuàng)建的sc名稱
accessModes:
- ReadWriteMany #采用ReadWriteMany的訪問模式
resources:
requests:
storage: 50Mi #請(qǐng)求50M的空間
//執(zhí)行yaml文件來創(chuàng)建pvc:
[root@master sc]# kubectl apply -f test-pvc.yaml
persistentvolumeclaim/test-claim created
我們可以看到pvc創(chuàng)建成功,狀態(tài)已經(jīng)是Bound了,是不是也生產(chǎn)了一個(gè)對(duì)應(yīng)的volume對(duì)象,最重要的一欄是STORAGECLASS,現(xiàn)在的值就是我們剛剛創(chuàng)建的sc對(duì)象名稱”statefu-nfs“。
//接下來我們查看一下pv,驗(yàn)證是否動(dòng)態(tài)創(chuàng)建:
我們可以看到已經(jīng)自動(dòng)生成了一個(gè)關(guān)聯(lián)的pv對(duì)象,訪問模式是RWX(在sc中定義的模式),回收策略Delete ,狀態(tài)同樣是Bound,是通過sc動(dòng)態(tài)創(chuàng)建的,而并不是我們手動(dòng)創(chuàng)建的。
我們通過部署一個(gè)nginx服務(wù)來測(cè)試我們上面用stroage class方式聲明的pvc對(duì)象(實(shí)現(xiàn)數(shù)據(jù)持久化)。
[root@master sc]# vim nginx-pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: nginx-pod
namespace: default
spec:
containers:
- name: nginx-pod
image: nginx
volumeMounts: #定義數(shù)據(jù)持久化
- name: nfs-pvc
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-pvc
persistentVolumeClaim: #指定pvc,注意下面聲明的pvc指向的是上面定義的pvc名稱
claimName: test-claim
//運(yùn)行nginx,并查看pod是否正常運(yùn)行:
[root@master sc]# kubectl apply -f nginx-pod.yaml
pod/nginx-pod created
//我們進(jìn)入pod中,創(chuàng)建測(cè)試網(wǎng)頁文件:
[root@master ~]# kubectl exec -it nginx-pod /bin/bash
root@nginx-pod:/# cd /usr/share/nginx/html/
root@nginx-pod:/usr/share/nginx/html# echo "welcome to Storage Class web
" > index.html
root@nginx-pod:/usr/share/nginx/html# cat index.html
welcome to Storage Class web
root@nginx-pod:/usr/share/nginx/html# exit
//我們回到nfs服務(wù)器的共享數(shù)據(jù)目錄下查看文件是否同步:
在nfs目錄下我們可以可以看到有名字很很長(zhǎng)的文件夾,這個(gè)文件夾的命名方式就是我們上面的規(guī)則生成的。
我們進(jìn)入到該目錄下,可以看到nginx中的數(shù)據(jù)已經(jīng)實(shí)現(xiàn)同步,且實(shí)現(xiàn)了數(shù)據(jù)持久化(這里就不做測(cè)試了,可自行測(cè)試)
最后測(cè)試nginx是否能夠正常訪問我們編寫的網(wǎng)頁:
//創(chuàng)建service資源對(duì)象,關(guān)聯(lián)上邊的pod,映射端口號(hào)。
一個(gè)完整的yaml文件內(nèi)容如下:
kind: Pod
apiVersion: v1
metadata:
name: nginx-pod
namespace: default
labels:
app: web
spec:
containers:
- name: nginx-pod
image: nginx
volumeMounts:
- name: nfs-pvc
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: default
spec:
type: NodePort
selector:
app: web
ports:
- name: nginx
port: 80
targetPort: 80
nodePort: 32134
//重新加載nginx,并訪問網(wǎng)頁:
[root@master sc]# kubectl apply -f nginx-pod.yaml
pod/nginx-pod configured
service/nginx-svc created