Kubernetes 之 Nginx 动静态 PV 持久存储 下篇
接上篇 Kubernetes 中部署 NFS Provisioner 为 NFS 提供动态分配卷(上篇)请添加链接描述
一、nginx 使用 nfs 静态 PV
1、静态 nfs-static-nginx-rc.yaml
##清理资源 kubectl delete -f nfs-static-nginx-rc.yaml -n test cat >nfs-static-nginx-rc.yaml<<\EOF ##创建namespace --- apiVersion: v1 kind: Namespace metadata: name: test labels: name: test ##创建nfs-pv --- apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv labels: pv: nfs-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: nfs # 注意这里使用nfs的storageClassName,如果没改k8s的默认storageClassName的话,这里可以省略 nfs: path: /data/nfs/nginx/ server: 10.198.1.155 ##创建nfs-pvc --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-pvc namespace: test labels: pvc: nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: nfs selector: matchLabels: pv: nfs-pv ##部署应用nginx --- apiVersion: v1 kind: ReplicationController metadata: name: nginx-test namespace: test labels: name: nginx-test spec: replicas: 2 selector: name: nginx-test template: metadata: labels: name: nginx-test spec: containers: - name: nginx-test image: docker.io/nginx volumeMounts: - mountPath: /usr/share/nginx/html name: nginx-data ports: - containerPort: 80 volumes: - name: nginx-data persistentVolumeClaim: claimName: nfs-pvc ##创建service --- apiVersion: v1 kind: Service metadata: namespace: test name: nginx-test labels: name: nginx-test spec: type: NodePort ports: - port: 80 protocol: TCP targetPort: 80 name: http nodePort: 30080 selector: name: nginx-test EOF ##创建资源 kubectl apply -f nfs-static-nginx-rc.yaml -n test ##查看pv资源 kubectl get pv -n test --show-labels ##查看pvc资源 kubectl get pvc -n test --show-labels ##查看pod $ kubectl get pods -n test NAME READY STATUS RESTARTS AGE nginx-test-r4n2j 1/1 Running 0 54s nginx-test-zstf5 1/1 Running 0 54s #可以看到,nginx应用已经部署成功。 #nginx应用的数据目录是使用的nfs共享存储,我们在nfs共享的目录里加入index.html文件,然后再访问nginx-service暴露的端口 #切换到到nfs-server服务器上 echo "Test NFS Share discovery with nfs-static-nginx-rc" > /data/nfs/nginx/index.html #在浏览器上访问kubernetes主节点的 http://master:30080,就能访问到这个页面内容了
2、静态 nfs-static-nginx-deployment.yaml
##清理资源 kubectl delete -f nfs-static-nginx-deployment.yaml -n test cat >nfs-static-nginx-deployment.yaml<<\EOF ##创建namespace --- apiVersion: v1 kind: Namespace metadata: name: test labels: name: test ##创建nfs-pv --- apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv labels: pv: nfs-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: nfs # 注意这里使用nfs的storageClassName,如果没改k8s的默认storageClassName的话,这里可以省略 nfs: path: /data/nfs/nginx/ server: 10.198.1.155 ##创建nfs-pvc --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-pvc namespace: test labels: pvc: nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: nfs selector: matchLabels: pv: nfs-pv ##部署应用nginx --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: test labels: name: nginx-test spec: replicas: 2 selector: matchLabels: name: nginx-test template: metadata: labels: name: nginx-test spec: containers: - name: nginx-test image: docker.io/nginx volumeMounts: - mountPath: /usr/share/nginx/html name: nginx-data ports: - containerPort: 80 volumes: - name: nginx-data persistentVolumeClaim: claimName: nfs-pvc ##创建service --- apiVersion: v1 kind: Service metadata: namespace: test name: nginx-test labels: name: nginx-test spec: type: NodePort ports: - port: 80 protocol: TCP targetPort: 80 name: http nodePort: 30080 selector: name: nginx-test EOF ##创建资源 kubectl apply -f nfs-static-nginx-deployment.yaml -n test ##查看pv资源 kubectl get pv -n test --show-labels ##查看pvc资源 kubectl get pvc -n test --show-labels ##查看pod $ kubectl get pods -n test NAME READY STATUS RESTARTS AGE nginx-deployment-64d6f78cdf-8bw8t 1/1 Running 0 55s nginx-deployment-64d6f78cdf-n5n4q 1/1 Running 0 55s #可以看到,nginx应用已经部署成功。 #nginx应用的数据目录是使用的nfs共享存储,我们在nfs共享的目录里加入index.html文件,然后再访问nginx-service暴露的端口 #切换到到nfs-server服务器上 echo "Test NFS Share discovery with nfs-static-nginx-deployment" > /data/nfs/nginx/index.html #在浏览器上访问kubernetes主节点的 http://master:30080,就能访问到这个页面内容了
3、nginx?多目录挂载
PV 和 PVC 是一一对应关系,当有 PV 被某个 PVC ?所占用时,会显示 banding,其它 PVC 不能再使用绑定过的 PV。
PVC 一旦绑定 PV,就相当于是一个存储卷,此时 PVC 可以被多个? Pod 所使用。(PVC支不支持被多个 Pod 访问,取决于访问模型? ?accessMode 的定义)。
PVC 若没有找到合适的 PV 时,则会处于 pending 状态。
PV 是属于集群级别的,不能定义在名称空间中。
- PVC 时属于名称空间级别的。
##清理资源 kubectl delete -f nfs-static-nginx-dp-many.yaml -n test cat >nfs-static-nginx-dp-many.yaml<<\EOF ##创建namespace --- apiVersion: v1 kind: Namespace metadata: name: test labels: name: test ##创建nginx-data-pv --- apiVersion: v1 kind: PersistentVolume metadata: name: nginx-data-pv labels: pv: nginx-data-pv spec: capacity: storage: 50Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: nfs # 注意这里使用nfs的storageClassName,如果没改k8s的默认storageClassName的话,这里可以省略 nfs: path: /data/nfs/nginx/ server: 10.198.1.155 ##创建nginx-etc-pv --- apiVersion: v1 kind: PersistentVolume metadata: name: nginx-etc-pv labels: pv: nginx-etc-pv spec: capacity: storage: 50Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: nfs # 注意这里使用nfs的storageClassName,如果没改k8s的默认storageClassName的话,这里可以省略 nfs: path: /data/nfs/nginx/ server: 10.198.1.155 ##创建pvc名字为nfs-nginx-data,存放数据 --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-nginx-data namespace: test labels: pvc: nfs-nginx-data spec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi storageClassName: nfs selector: matchLabels: pv: nginx-data-pv ##创建pvc名字为nfs-nginx-etc,存放配置文件 --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-nginx-etc namespace: test labels: pvc: nfs-nginx-etc spec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi storageClassName: nfs selector: matchLabels: pv: nginx-etc-pv ##部署应用nginx --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: test labels: name: nginx-test spec: replicas: 2 selector: matchLabels: name: nginx-test template: metadata: labels: name: nginx-test spec: containers: - name: nginx-test image: docker.io/nginx volumeMounts: - mountPath: /usr/share/nginx/html name: nginx-data # - mountPath: /etc/nginx #--这里需要注意,如果是这么挂载,那么需要事先现在/data/nfs/nginx/目录下把nginx的完整配置提前拷贝好 # name: nginx-etc ports: - containerPort: 80 volumes: - name: nginx-data persistentVolumeClaim: claimName: nfs-nginx-data # - name: nginx-etc # persistentVolumeClaim: # claimName: nfs-nginx-etc ##创建service --- apiVersion: v1 kind: Service metadata: namespace: test name: nginx-test labels: name: nginx-test spec: type: NodePort ports: - port: 80 protocol: TCP targetPort: 80 name: http nodePort: 30080 selector: name: nginx-test EOF ##创建资源 kubectl apply -f nfs-static-nginx-dp-many.yaml -n test ##查看pv资源 kubectl get pv -n test --show-labels ##查看pvc资源 kubectl get pvc -n test --show-labels ##查看pod $ kubectl get pods -n test NAME READY STATUS RESTARTS AGE nginx-deployment-64d6f78cdf-8bw8t 1/1 Running 0 55s nginx-deployment-64d6f78cdf-n5n4q 1/1 Running 0 55s ##进入容器 kubectl exec -it nginx-deployment-f687cdf47-xncj8 -n test /bin/bash #可以看到,nginx应用已经部署成功。 #nginx应用的数据目录是使用的nfs共享存储,我们在nfs共享的目录里加入index.html文件,然后再访问nginx-service暴露的端口 #切换到到nfs-server服务器上 echo "Test NFS Share discovery with nfs-static-nginx-dp-many" > /data/nfs/nginx/index.html #在浏览器上访问kubernetes主节点的 http://master:30080,就能访问到这个页面内容了
4、参数 namespace
##清理资源 export NAMESPACE="mos-namespace" kubectl delete -f nfs-static-nginx-dp-many.yaml -n ${NAMESPACE} cat >nfs-static-nginx-dp-many.yaml<<-EOF ##创建namespace --- apiVersion: v1 kind: Namespace metadata: name: ${NAMESPACE} labels: name: ${NAMESPACE} ##创建nginx-data-pv --- apiVersion: v1 kind: PersistentVolume metadata: name: nginx-data-pv labels: pv: nginx-data-pv spec: capacity: storage: 50Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: nfs # 注意这里使用nfs的storageClassName,如果没改k8s的默认storageClassName的话,这里可以省略 nfs: path: /data/nfs/nginx/ server: 10.198.1.155 ##创建nginx-log-pv --- apiVersion: v1 kind: PersistentVolume metadata: name: nginx-log-pv labels: pv: nginx-log-pv spec: capacity: storage: 50Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: nfs # 注意这里使用nfs的storageClassName,如果没改k8s的默认storageClassName的话,这里可以省略 nfs: path: /data/nfs/nginx/ server: 10.198.1.155 ##创建pvc名字为nfs-nginx-data,存放数据 --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-nginx-data labels: pvc: nfs-nginx-data spec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi storageClassName: nfs selector: matchLabels: pv: nginx-data-pv ##创建pvc名字为nfs-nginx-log,存放日志文件 --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-nginx-log labels: pvc: nfs-nginx-log spec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi storageClassName: nfs selector: matchLabels: pv: nginx-log-pv ##部署应用nginx --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: name: nginx-test spec: replicas: 2 selector: matchLabels: name: nginx-test template: metadata: labels: name: nginx-test spec: containers: - name: nginx-test image: docker.io/nginx volumeMounts: - mountPath: /usr/share/nginx/html name: nginx-data - mountPath: /var/log/nginx name: nginx-log ports: - containerPort: 80 volumes: - name: nginx-data persistentVolumeClaim: claimName: nfs-nginx-data - name: nginx-log persistentVolumeClaim: claimName: nfs-nginx-log ##创建service --- apiVersion: v1 kind: Service metadata: name: nginx-test labels: name: nginx-test spec: type: NodePort ports: - port: 80 protocol: TCP targetPort: 80 name: http nodePort: 30180 selector: name: nginx-test EOF ##创建资源 kubectl apply -f nfs-static-nginx-dp-many.yaml -n ${NAMESPACE}
二、nginx 使用 nfs 动态 PV
1、动态 nfs-dynamic-nginx.yaml
通过参数控制在哪个命名空间创建
##清理命名空间 kubectl delete ns k8s-public ##创建命名空间 kubectl create ns k8s-public ##清理资源 kubectl delete -f nfs-dynamic-nginx-deployment.yaml -n k8s-public cat >nfs-dynamic-nginx-deployment.yaml<<\EOF ##动态申请nfs-dynamic-pvc --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-dynamic-claim spec: storageClassName: nfs-storage #--需要与上面创建的storageclass的名称一致 accessModes: - ReadWriteMany resources: requests: storage: 90Gi ##部署应用nginx --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: name: nginx-test spec: replicas: 3 selector: matchLabels: name: nginx-test template: metadata: labels: name: nginx-test spec: containers: - name: nginx-test image: docker.io/nginx volumeMounts: - mountPath: /usr/share/nginx/html name: nginx-data ports: - containerPort: 80 volumes: - name: nginx-data persistentVolumeClaim: claimName: nfs-dynamic-claim ##创建service --- apiVersion: v1 kind: Service metadata: name: nginx-test labels: name: nginx-test spec: type: NodePort ports: - port: 80 protocol: TCP targetPort: 80 name: http nodePort: 30090 selector: name: nginx-test EOF ##创建资源 kubectl apply -f nfs-dynamic-nginx-deployment.yaml -n k8s-public ##查看pv资源 kubectl get pv -n k8s-public --show-labels ##查看pvc资源 kubectl get pvc -n k8s-public --show-labels ##查看pod $ kubectl get pods -n k8s-public NAME READY STATUS RESTARTS AGE nginx-deployment-544f569478-5t8wm 1/1 Running 0 40s nginx-deployment-544f569478-8gks5 1/1 Running 0 40s nginx-deployment-544f569478-pw96x 1/1 Running 0 40s #可以看到,nginx应用已经部署成功。 #nginx应用的数据目录是使用的nfs共享存储,我们在nfs共享的目录里加入index.html文件,然后再访问nginx-service暴露的端口 #切换到到nfs-server服务器上 #注意动态的在这个目录,创建的目录命名方式为 “namespace名称-pvc名称-pv名称” /data/nfs/kube-public-test-claim-pvc-ad304939-e75d-414f-81b5-7586ef17db6c echo "Test NFS Share discovery with nfs-dynamic-nginx-deployment" > /data/nfs/kube-public-test-claim-pvc-ad304939-e75d-414f-81b5-7586ef17db6c/index.html #在浏览器上访问kubernetes主节点的 http://master:30090,就能访问到这个页面内容了
参考文档:
https://kubernetes.io/zh/docs/tasks/run-application/run-stateless-application-deployment/
- https://blog.51cto.com/ylw6006/2071845?在kubernetes集群中运行nginx
作者:Lancger
github 地址:https://url.cn/5osLAuY
转载请获得作者授权
Golang 课程火热招生资料找WeChat:17812796384
相关推荐
朱培知浅ZLH 2020-11-16
cdbdqn00 2020-11-12
达观数据 2020-11-11
JustinChia 2020-11-11
远远的山 2020-11-09
jingtao 2020-11-08
大叔比较胖 2020-10-30
gracecxj 2020-10-30
onepiecedn 2020-10-29
kunyus 2020-10-28
JustHaveTry 2020-10-27
锋锋 2020-10-26
hubanbei00的家园 2020-10-25
谢恩铭 2020-10-23
btqszl 2020-10-21
kaidiphp 2020-10-13
guchengxinfen 2020-10-12
liverlife 2020-10-10
BigDataMining 2020-10-08