Kubernetes pv-pvc-nfs-service综合实验

该实验详细介绍了如何在Kubernetes(K8s)集群中利用PV(PersistentVolume)和PVC(PersistentVolumeClaim)结合NFS(NetworkFileSystem)服务进行持久化存储。首先,配置了NFS服务器并测试了K8s节点对其的挂载。接着,在Master节点创建了PV和PVC,并部署了一个Pod来使用这些资源。最后,通过Deployment和Service将Pod对外发布,使得内网数据可被外网访问。

目录

实验:pv-pvc-nfs-service综合实验

实验环境

实验描述

实验拓扑图: 

实验步骤:

1、修改nfs服务器的主机名:

2、搭建nfs服务器:(131条消息) 搭建NFS服务器_搭建nfs存储_Claylpf的博客-优快云博客

3、测试k8s上所有节点服务器是否可以挂载到NFS服务器上去

4、在master机器上创建pv使用nfs服务器上的共享目录

5、在master机器上创建pvc使用pv

6、在master机器上创建pod使用pvc

7、测试去访问它(在node1上去访问)

8、使用deployment方式部署pod

9、创建一个service发布我们的Pod

10、测试访问


实验:pv-pvc-nfs-service综合实验

实验环境

4台centos7虚拟机 (都已经搭建好k8s) 和一台准备搭建nfs服务器的centos7虚拟机

实验描述

使用pv持久卷和pvc持久卷申请结合nfs将内网的数据发布出去,让外网的用户可以访问到内网的数据,更深刻的理解pv、pvc和nfs的使用流程,有更深刻的体会。

实验拓扑图: 

实验步骤:

1、修改nfs服务器的主机名:

[root@nginx-lb1 ~]# hostnamectl set-hostname nfs
[root@nginx-lb1 ~]# su - root
上一次登录:一 7月 17 00:16:08 CST 2023从 192.168.2.43pts/1 上
[root@nfs ~]# 

2、搭建nfs服务器:(131条消息) 搭建NFS服务器_搭建nfs存储_Claylpf的博客-优快云博客

[root@nfs ~]# ps aux|grep nfs
root       3248  0.0  0.0      0     0 ?        S<   00:36   0:00 [nfsd4_callbacks]
root       3254  0.0  0.0      0     0 ?        S    00:36   0:00 [nfsd]
root       3255  0.0  0.0      0     0 ?        S    00:36   0:00 [nfsd]
root       3256  0.0  0.0      0     0 ?        S    00:36   0:00 [nfsd]
root       3257  0.0  0.0      0     0 ?        S    00:36   0:00 [nfsd]
root       3258  0.0  0.0      0     0 ?        S    00:36   0:00 [nfsd]
root       3259  0.0  0.0      0     0 ?        S    00:36   0:00 [nfsd]
root       3260  0.0  0.0      0     0 ?        S    00:36   0:00 [nfsd]
root       3261  0.0  0.0      0     0 ?        S    00:36   0:00 [nfsd]
root       3271  0.0  0.0 112824   988 pts/1    R+   00:36   0:00 grep --color=auto nfs
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# mkdir /web
[root@nfs ~]# cd /web/
[root@nfs web]# ls
[root@nfs web]# exportfs -rv
exporting 192.168.2.0/24:/web

成功搭建NFS服务器

3、测试k8s上所有节点服务器是否可以挂载到NFS服务器上去

[root@master ~]# mkdir /sanchuang
[root@master ~]# mount 192.168.2.77:/web /sanchuang      #挂载命令
[root@master ~]# df|grep web
192.168.2.77:/web       17811456 1769728 16041728   10% /sanchuang
[root@master ~]# 

4、在master机器上创建pv使用nfs服务器上的共享目录

创建pv-nfs.yaml文件

[root@master pv]# vim pv-nfs.yaml
[root@master pv]# cat pv-nfs.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: sc-nginx-pv
  labels:
    type: sc-nginx-pv
spec:
  capacity:
    storage: 5Gi 
  accessModes:
    - ReadWriteMany
  storageClassName: nfs         #pv对应的名字
  nfs:
    path: "/web"       #nfs共享的目录
    server: 192.168.2.77   #nfs服务器的ip地址
    readOnly: false   #访问模式
[root@master pv]# 

创建Pod

[root@master pv]# kubectl apply -f pv-nfs.yaml 
persistentvolume/sc-nginx-pv created
[root@master pv]# 

查看效果

[root@master pv]# kubectl get pv
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
sc-nginx-pv      5Gi        RWX            Retain           Available                           nfs                     23s
task-pv-volume   10Gi       RWO            Retain           Bound       default/task-pv-claim   manual                  14h
[root@master pv]# 

5、在master机器上创建pvc使用pv

创建pvc使用pv

[root@master pv]# vim pvc-nfs.yaml
[root@master pv]# cat pvc-nfs.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sc-nginx-pvc
spec:
  accessModes:
  - ReadWriteMany      
  resources:
     requests:
       storage: 1Gi
  storageClassName: nfs #使用nfs类型的pv
[root@master pv]# 

创建Pod使用pvc

[root@master pv]# kubectl apply -f pvc-nfs.yaml 
persistentvolumeclaim/sc-nginx-pvc created
[root@master pv]# 

查看效果

[root@master pv]# kubectl get pvc
NAME            STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
sc-nginx-pvc    Bound    sc-nginx-pv      5Gi        RWX            nfs            57s
task-pv-claim   Bound    task-pv-volume   10Gi       RWO            manual         13h
[root@master pv]# 

6、在master机器上创建pod使用pvc

创建pod使用pvc

[root@master pv]# vim pod-nfs.yaml
[root@master pv]# cat pod-nfs.yaml 
apiVersion: v1
kind: Pod      #这里使用pod方式去部署,下面也会介绍用deployment方式部署
metadata:
  name: sc-pv-pod-nfs
spec:
  volumes:
    - name: sc-pv-storage-nfs
      persistentVolumeClaim:
        claimName: sc-nginx-pvc
  containers:
    - name: sc-pv-container-nfs
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sc-pv-storage-nfs
[root@master pv]# 

应用和验证

[root@master pv]# kubectl apply -f pod-nfs.yaml 
pod/sc-pv-pod-nfs created
[root@master pv]# kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
my-nginx-575db987b-d74hs   1/1     Running   0          12h   10.244.1.8   node1   <none>           <none>
my-nginx-575db987b-rmnvh   1/1     Running   0          16h   10.244.3.5   node3   <none>           <none>
my-nginx-575db987b-w2xvf   1/1     Running   0          16h   10.244.2.5   node2   <none>           <none>
sc-pv-pod-nfs              1/1     Running   0          13s   10.244.1.9   node1   <none>           <none>
test                       1/1     Running   0          13h   10.244.2.7   node2   <none>           <none>
[root@master pv]# 

7、测试去访问它(在node1上去访问)

[root@node1 sanchuang]# curl 10.244.1.12
Welcome tow sanchuang!
[root@node1 sanchuang]# 

在nfs服务器上修改共享目录的内容,然后再重新在node机器上访问,观察是否变化,若跟nfs服务器上的共享目录一样,则证明成功

8、使用deployment方式部署pod

[root@master pv]# cat pod-nfs-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: claylpf-nginx
spec:
  replicas: 5  #创建5个副本
  selector:
    matchLabels:
      app: claylpf-nginx
  template:
    metadata:
      labels:
        app: claylpf-nginx
    spec:
     volumes:
     - name: sc-pv-storage-nfs-2
       persistentVolumeClaim:
          claimName: sc-nginx-pvc
     containers:
     - name: sc-pv-container-nfs-2
       image: nginx
       ports:
        - containerPort: 80
          name: "http-server"
       volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sc-pv-storage-nfs-2
[root@master pv]# 

应用和查看

[root@master pv]# kubectl apply -f pod-nfs-deploy.yaml 
deployment.apps/nginx-deployment created
[root@master pv]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
my-nginx-575db987b-d74hs            1/1     Running   0          13h   10.244.1.8    node1   <none>           <none>
my-nginx-575db987b-rmnvh            1/1     Running   0          17h   10.244.3.5    node3   <none>           <none>
my-nginx-575db987b-w2xvf            1/1     Running   0          17h   10.244.2.5    node2   <none>           <none>
nginx-deployment-849bdd77bb-5p6ms   1/1     Running   0          21s   10.244.1.14   node1   <none>           <none>
nginx-deployment-849bdd77bb-h5vvr   1/1     Running   0          22s   10.244.3.6    node3   <none>           <none>
nginx-deployment-849bdd77bb-r7cdk   1/1     Running   0          21s   10.244.3.7    node3   <none>           <none>
nginx-deployment-849bdd77bb-whcn2   1/1     Running   0          22s   10.244.1.13   node1   <none>           <none>
nginx-deployment-849bdd77bb-z6r52   1/1     Running   0          22s   10.244.2.8    node2   <none>           <none>
test                                1/1     Running   0          14h   10.244.2.7    node2   <none>           <none>

9、创建一个service发布我们的Pod

[root@master pv]# cat pod-nfs-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: my-nginx-nfs
  labels:
    run: my-nginx-nfs
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: claylpf-nginx     #注意这里要用app的形式,跟前面的nfs-pod文件对应,有些使用方法是run,不要搞错了
[root@master pv]# 

应用和查看

[root@master pv]# kubectl apply -f pod-nfs-service.yaml 
[root@master pv]# kubectl get service
NAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes     ClusterIP   10.0.0.1      <none>        443/TCP          18h
my-nginx-nfs   NodePort    10.10.6.200   <none>        8080:31058/TCP   72s
[root@master pv]# 

10、测试访问

随意访问一台主机的ip地址的31058端口,看是否出现画面

kubernetes GitLab + Ingressroot@k8s-m001:~/devops/test-devops/gitlab# ll total 44 drwxr-xr-x 3 root root 4096 Jun 15 18:25 ./ drwxr-xr-x 7 root root 4096 Jun 15 18:21 ../ -rw-r--r-- 1 root root 1337 Jun 15 18:21 gitlab-deployment.yaml -rw-r--r-- 1 root root 520 Jun 15 18:22 gitlab-ingress.yaml -rw-r--r-- 1 root root 723 Jun 15 17:51 gitlab-nfs-pvc-pro.yaml -rw-r--r-- 1 root root 58 Jun 14 21:55 gitlab-ns.yaml -rw-r--r-- 1 root root 293 Jun 15 18:25 gitlab-services.yaml drwxrwxrwx 2 root root 4096 Jun 15 16:31 gitlab.wh02.com_nginx/ -rw-r--r-- 1 root root 9078 Jun 15 16:28 gitlab.wh02.com_nginx.zip root@k8s-m001:~/devops/test-devops/gitlab# cat gitlab-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: gitlab namespace: gitlab spec: selector: matchLabels: app: gitlab replicas: 1 template: metadata: labels: app: gitlab spec: securityContext: fsGroup: 1000 containers: - name: gitlab image: harbor.wh02.com/cicd/gitlab/gitlab-ce:17.11.0-ce.0 imagePullPolicy: Always ports: - containerPort: 80 - containerPort: 22 env: - name: GITLAB_OMNIBUS_CONFIG value: | external_url 'https://gitlab.wh02.com' gitlab_rails['initial_root_password'] = "Aa123123" gitlab_rails['gitlab_default_locale'] = 'zh_CN' gitlab_rails['gitlab_default_locale_in_system'] = true volumeMounts: - name: gitlab-storage mountPath: /var/opt/gitlab subPath: data - name: gitlab-storage mountPath: /var/log/gitlab subPath: logs - name: gitlab-storage mountPath: /etc/gitlab subPath: config resources: requests: cpu: "2" memory: "5Gi" limits: cpu: "2" memory: "6Gi" volumes: - name: gitlab-storage persistentVolumeClaim: claimName: gitlab-pvc root@k8s-m001:~/devops/test-devops/gitlab# cat gitlab-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gitlab-ingress namespace: gitlab annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: ingressClassName: nginx tls: - hosts: - gitlab.wh02.com secretName: gitlab-tls rules: - host: gitlab.wh02.com http: paths: - path: / pathType: Prefix backend: service: name: gitlab-service port: number: 80 root@k8s-m001:~/devops/test-devops/gitlab# cat gitlab-nfs-pvc-pro.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-gitlab-static provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer reclaimPolicy: Retain --- apiVersion: v1 kind: PersistentVolume metadata: name: gitlab-pv spec: capacity: storage: 50Gi accessModes: - ReadWriteMany nfs: server: 192.168.3.101 path: /data/k8sdata/gitlab_data storageClassName: nfs-gitlab-static persistentVolumeReclaimPolicy: Retain --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gitlab-pvc namespace: gitlab spec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi storageClassName: nfs-gitlab-static volumeName: gitlab-pv root@k8s-m001:~/devops/test-devops/gitlab# cat gitlab-ns.yaml apiVersion: v1 kind: Namespace metadata: name: gitlab root@k8s-m001:~/devops/test-devops/gitlab# cat gitlab-services.yaml apiVersion: v1 kind: Service metadata: name: gitlab-service namespace: gitlab spec: selector: app: gitlab type: NodePort ports: - name: http port: 80 targetPort: 80 # nodePort: 30030 - name: ssh port: 22 targetPort: 22 # nodePort: 30022 root@k8s-m001:~/devops/test-devops/gitlab# kubectl get secrets -n gitlab No resources found in gitlab namespace. root@k8s-m001:~/devops/test-devops/gitlab# kubectl get secrets -A NAMESPACE NAME TYPE DATA AGE ingress-nginx ingress-nginx-admission Opaque 3 97m jenkins harbor-pull-secret kubernetes.io/dockerconfigjson 1 7h41m kube-system calico-etcd-secrets Opaque 3 40h kubernetes-dashboard dashboard-admin-user kubernetes.io/service-account-token 3 65d kubernetes-dashboard kubernetes-dashboard-certs Opaque 0 65d kubernetes-dashboard kubernetes-dashboard-csrf Opaque 1 65d kubernetes-dashboard kubernetes-dashboard-key-holder Opaque 2 65d kuboard kuboard-admin-token kubernetes.io/service-account-token 3 40h kuboard kuboard-viewer-token kubernetes.io/service-account-token 3 40h root@k8s-m001:~/devops/test-devops/gitlab# kubectl get pv,pvc -n gitlab NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE persistentvolume/gitlab-pv 50Gi RWX Retain Bound gitlab/gitlab-pvc nfs-gitlab-static <unset> 44m persistentvolume/jenkins-pv 10Gi RWX Retain Released jenkins/jenkins-pvc <unset> 26h persistentvolume/pvc-1464be8d-5bc8-4ba1-8d91-c282167ea4cf 50Gi RWX Delete Bound jenkins/jenkins-pvc nfs-dynamic <unset> 7h41m persistentvolume/pvc-49a9790f-7ebf-43a6-8454-b90cf50d2f3d 50Gi RWX Retain Released jenkins/jenkins-pvc nfs-dynamic <unset> 7h54m persistentvolume/pvc-4ddd9d5b-a734-4889-af64-0c96f340ce11 50Gi RWX Retain Released jenkins/jenkins-pvc nfs-dynamic <unset> 8h NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE persistentvolumeclaim/gitlab-pvc Bound gitlab-pv 50Gi RWX nfs-gitlab-static <unset> 44m
06-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值