Linux云盘算 |【第五阶段】CLOUD-DAY9

张春  金牌会员 | 2024-12-1 12:21:10 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 838|帖子 838|积分 2514

主要内容:

Metrics资源使用率监控、存储卷管理(临时卷ConfitMap、EmptyDir、长期卷HostPath、NFS(PV/PVC))

一、Metrics介绍

metrics是一个监控体系资源使用的插件,可以监控Node节点上的CPU、内存的使用率,或Pod对资源的占用率,通过对资源占用的了解,可以更加合理的部署容器应用;
   补充:metrics从Kubernetes 1.8开始,资源使用情况的监控可以通过Metrics API的情势获取,具体的组件为Metrics Server,用来更换之前的heapster插件,所以heapster从1.11开始逐渐被放弃;
  报错说明:没有http:heapster插件,该插件已被Metrics Server更换,需安装Metrics插件;
  1. [root@master ~]# kubectl top node    //查看资源占用情况
  2. Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)
复制代码

部署metrics-server服务示例:

① 开启聚合服务参数
② 签发Kubelet证书
③ 安装metrics-server插件
④ 执行所有资源文件
   - apiservice.yaml    //注册集群API的资源文件
  - deployment.yaml   //主进程metrics的资源文件
  - metrisc-server.tar.gz   //metrisc-server插件镜像压缩包
  - pdb.yaml     //中断控制器
  - rbac.yaml      //授权控制器
  - service.yaml   //后端是metrics主进程的服务
  
1)开启聚合服务

Metrics-server是扩展的Apiserver,依赖于kube-aggregator,因此需要在Apiserver中开启聚合API相关参数(-- enable-aggregator-routing=true)
修改Api-server启动参数流程:
   ① 配置文件:/etc/kubernetes/manifests/kube-apiserver.yaml
  

  • - 配置spec.containers.command添加:- -- enable-aggregator-routing=true
  ② 重启服务:systemctl restart kubelet
  ③ 验证配置:kubectl -n kube-system get pod 容器名 -o yaml | grep enable-aggregator-routing
  步骤1:开启apiserver聚合服务参数
① 备份配置文件(强烈建议备份)
  1. [root@master ~]# cd /etc/kubernetes/manifests/
  2. [root@master manifests]# cp kube-apiserver.yaml kube-apiserver.yaml.bak   //备份文件
  3. [root@master manifests]# mv kube-apiserver.yaml.bak /root/
复制代码
注意:K8S默认会载入所有配置文件,该目次下的两个文件即使修改差一个参数不同,也会一并载入可能导致覆盖,所以必须将备份文件放在其它目次,制止干扰;
② 修改配置文件,并重启验证服务
# 在spec.containers.command 最下面手动添加如下一行
  1. [root@master manifests]# vim kube-apiserver.yaml
  2.     - --enable-aggregator-routing=true
  3. [root@master manifests]# systemctl restart kubelet    //重启服务
  4. [root@master manifests]# kubectl -n kube-system get pod kube-apiserver-master -o yaml | grep enable-aggregator-routing     //验证服务
  5. - --enable-aggregator-routing=true
复制代码
常见报错:配置文件修改错误,会导致Apiserver无法使用,需备份文件还原

修改配置示例:


2)kubelet证书

metrics插件需使用kubelet证书,需手动为kubelet签发证书;
证书的申请与签发流程:
   ① 配置文件:/var/lib/kubelet/config.yaml
  

  • - 配置:serverTLSBootstrap: true    //文件的最后一行添加
  ② 重启服务:systemctl restart kubelet
  ③ 签发证书:
  查看证书
  

  • - 格式:kubectl get certificatesigningrequests
  签发证书
  

  • - 格式:kubectl certificate approve 证书名称
  删除证书(多余证书)
  

  • - 格式:kubectl delete certificatesigningrequests 证书名称
  
步骤2:证书的申请与签发(master,node-0001,node-0002,node-0003操作)
   补充:证书在签发过程中是偶然效性的,当证书申请后一直未签发,kubelet会以为证书失效或丢弃,重新创建带Pending的证书,只要将该些证书签发即可,申请多余证书可删除;
  ① 修改配置文件,并重启服务(以master为例)
  1. [root@master ~]# vim /var/lib/kubelet/config.yaml
  2. serverTLSBootstrap: true     //在文件的最后一行添加(申请证书参数开启)
  3. [root@master ~]# systemctl restart kubelet    //重启服务
复制代码
② 签发证书(必须在 master 上执行)
  1. [root@master ~]# kubectl get certificatesigningrequests    //查看证书
  2. NAME        AGE   REQUESTOR            CONDITION
  3. csr-5zbkt   13m     system:node:node-0001   Pending
  4. csr-7g67s   13m     system:node:node-0002   Pending
  5. csr-bqzjk   14m     system:node:master      Pending
  6. csr-cw9dz   12m     system:node:node-0003   Pending
复制代码
# 在Master上,为每个节点的证书进行签发
  1. [root@master ~]# kubectl certificate approve csr-bqzjk
  2. certificatesigningrequest.certificates.k8s.io/csr-bqzjk approved
  3. [root@master ~]# kubectl certificate approve csr-5zbkt
  4. certificatesigningrequest.certificates.k8s.io/csr-5zbkt approved
  5. [root@master ~]# kubectl certificate approve csr-7g67s
  6. certificatesigningrequest.certificates.k8s.io/csr-7g67s approved
  7. [root@master ~]# kubectl certificate approve csr-cw9dz
  8. certificatesigningrequest.certificates.k8s.io/csr-cw9dz approved
  9. [root@master ~]# kubectl get certificatesigningrequests   //查看证书
  10. NAME        AGE   REQUESTOR               CONDITION
  11. csr-5zbkt   11m   system:node:node-0001   Approved,Issued
  12. csr-7g67s   10m   system:node:node-0002   Approved,Issued
  13. csr-bqzjk   11m   system:node:master      Approved,Issued
  14. csr-cw9dz   10m   system:node:node-0003   Approved,Issued
复制代码

3)安装Metrics-server插件

方法1:官网https://github.com/kubernetes-sigs/metrics-server
方法2:下载镜像和资源文件,并导入私有堆栈


  • - 格式:kubectl top node   //查询节点的资源占用率(CPU、内存的占用情况)

步骤3:安装mertics插件
# 拷贝云盘的kubernetes/v1.17.6/metrics 目次到 master 上
  1. [root@ecs-proxy v1.17.6]# rsync -av metrics/ 192.168.1.21:/root
  2. [root@master ~]# tree metrics/
  3. metrics/
  4. ├── apiservice.yaml         //注册集群API的资源文件
  5. ├── deployment.yaml         //主进程metrics的资源文件
  6. ├── metrisc-server.tar.gz   //metrisc-server插件镜像压缩包
  7. ├── pdb.yaml                //中断控制器
  8. ├── rbac.yaml               //授权控制器
  9. └── service.yaml            //后端是metrics主进程的服务
  10. 0 directories, 6 files
复制代码
① 导入mertics插件镜像,并上传私有镜像堆栈
  1. [root@master ~]# cd metrics/
  2. [root@master metrics]# docker load -i metrisc-server.tar.gz
  3. [root@master metrics]# docker tag gcr.io/k8s-staging-metrics-server/metrics-server:master 192.168.1.100:5000/metrics-server:master
  4. [root@master metrics]# docker push 192.168.1.100:5000/metrics-server:master
复制代码
② 修改deployment资源文件
  1. [root@master metrics]# vim deployment.yaml
  2. 29: image: 192.168.1.100:5000/metrics-server:master    //修改镜像地址
复制代码
③ 执行资源文件(按照顺序依次创建)
  1. [root@master metrics]# kubectl apply -f rbac.yaml    //授权控制器
  2. [root@master metrics]# kubectl apply -f pdb.yaml    //中断控制器
  3. [root@master metrics]# kubectl apply -f deployment.yaml   //主进程metrics
  4. [root@master metrics]# kubectl apply -f service.yaml   //后端是metrics主进程的服务
  5. [root@master metrics]# kubectl apply -f apiservice.yaml   //注册集群API
复制代码
④ 查询验证
# Metrics插件默认将pod、service、apiservices放在kube-system体系命名空间
  1. [root@master metrics]# kubectl -n kube-system get pod    //查看Pod资源
  2. metrics-server-67fbd5bb7b-qbgkx   1/1     Running   0          2m2s
  3. [root@master metrics]# kubectl -n kube-system get service  //查看service资源
  4. NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
  5. kube-dns         ClusterIP   10.254.0.10     <none>        53/UDP,53/TCP,9153/TCP   4d22h
  6. metrics-server   ClusterIP   10.254.60.149   <none>        443/TCP                  2m28s
  7. [root@master metrics]# kubectl -n kube-system get apiservices   //查看apiservices资源
复制代码

注意:当kube-system/metrics-server的状态为True,部署Metrics插件才完成;
⑤ 验证:查询节点的资源占用率(CPU、内存的占用情况)
  1. [root@master metrics]# kubectl top node
  2. NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
  3. master      79m          3%     2322Mi          62%
  4. node-0001   23m          1%     938Mi           25%
  5. node-0002   20m          1%     943Mi           25%
  6. node-0003   20m          1%     1150Mi          31%
复制代码
  扩展:CPU毫核:CPU的计量单位叫毫核。集群中的每一个节点可以通过操作体系确认本节点的CPU内核数量,将这个数量乘以1000,得到的就是节点总的CPU总数量。
  ⑥ 验证:监控POD容器资源使用率
  1. [root@master ~]# kubectl apply -f myapache.yaml
  2. deployment.apps/myapache configured
  3. [root@master ~]# watch -n 1 'kubectl top pod'    //使用watch实时监控(每秒)
复制代码

# 打开另个终端测试nodePort访问
  1. [root@master ~]# kubectl apply -f mynodeport.yaml
  2. service/mynodeport created
  3. [root@master ~]# kubectl get service
复制代码

  1. [root@master ~]# curl http://192.168.1.31:30625
  2. this is apache
复制代码
# 循环访问测试
  1. [root@master ~]# while true; do curl 192.168.1.31:30625; done
复制代码
# 查看CPU监控状态

常见题目:Metrics-server服务启动后,需要等候大约 30 秒的时间用来监测资源使用率,正常现象
  1. [root@master ~]# kubectl top pod
  2. error: metrics not available yet
复制代码

二、存储卷管理

1、ConfigMap(临时卷)

ConfigMap是在Pod中映射(文件/目次)的一种方式,答应将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性;
场景:在日常工作中经常要修改各种配置文件的参数,数据库的地址、用户名密码等,这些操作在容器内非常麻烦,POD在重启大概迁移时候又会恢复到初始的状态,使用ConfigMa[就可以办理这样的题目;
常见ConfigMap案例:web集群(nginx+php),nginx需修改配置文件才气支持PHP,例如:

定义ConfigMap
   ConfigMap可以映射单一文件,也可以映射一个目次
  创建ConfigMap卷


  • - 格式:kubectl create configmap 名称 --from-file=文件路径
查看ConfigMap卷


  • - 格式:kubectl get configmaps
   补充:创建完ConfigMap之后,要在资源文件中引用ConfigMap才气生效
  资源文件引用ConfigMap模板:



示例:创建ConfigMap存储卷

步骤1:修改Nginx配置文件,并创建ConfigMap
① 扫除所有POD(由于apache与nginx都使用 80 端口,需把实行容器全部删除)
  1. [root@master ~]# kubectl delete -f myapache.yaml
  2. [root@master ~]# kubectl delete -f mypod.yaml
  3. [root@master ~]# kubectl get pod
  4. No resources found in default namespace.
复制代码
② 拷贝myos:nginx容器的Nginx配置文件,并完成修改
  1. [root@master ~]# mkdir /var/webconf
  2. [root@master ~]# docker run -itd --name mynginx 192.168.1.100:5000/myos:nginx     //启动容器
  3. [root@master ~]# docker ps
  4. CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS               NAMES
  5. b24b9f2e5f34        192.168.1.100:5000/myos:nginx   "/usr/local/nginx/sb…"   28 seconds ago      Up 27 seconds       80/tcp              mynginx
  6. [root@master ~]# docker cp mynginx:/usr/local/nginx/conf/nginx.conf /var/webconf/   //拷贝容器目录
  7. [root@master ~]# docker rm -f mynginx
  8. mynginx
  9. [root@master ~]# ls -l /var/webconf/nginx.conf
  10. -rw-r--r-- 1 root root 2656 Jul 25  2020 /var/webconf/nginx.conf
  11. [root@master ~]# vim /var/webconf/nginx.conf     //修改配置文件
  12. ...
  13.         location ~ \.php$ {
  14.             root           html;
  15.             fastcgi_pass   127.0.0.1:9000;
  16.             fastcgi_index  index.php;
  17.             include        fastcgi.conf;
  18.         }
  19. ...
复制代码
③ 创建ConfigMap卷


  • 格式:kubectl create configmap 名称 --from-file=文件路径
  1. [root@master ~]# kubectl create configmap nginx-conf --from-file=/var/webconf/nginx.conf
  2. configmap/nginx-conf created
  3. [root@master ~]# kubectl get configmaps    //查看ConfigMap卷
  4. NAME         DATA   AGE
  5. nginx-conf   1      6s
复制代码

步骤2:在webnginx.yaml资源文件中,引用Configmap存储卷定义
  1. [root@master ~]# vim webnginx.yaml
  2. ---
  3. kind: Deployment       //定义资源的类型
  4. apiVersion: apps/v1
  5. metadata:
  6.   name: webnginx       //资源类型的名称
  7. spec:
  8.   selector:            //标签选择器
  9.     matchLabels:
  10.       myapp: nginx
  11.   replicas: 1         //副本数为1
  12.   template:           //POD资源模板
  13.     metadata:
  14.       labels:
  15.         myapp: nginx
  16.     spec:             //POD资源的详细定义
  17.       volumes:                //卷的定义,映射存储卷
  18.       - name: nginx-php       //卷的名称(标记1)
  19.         configMap:            //定义ConfigMap卷(加载的卷可以写多个)
  20.           name: nginx-conf    //加载的configmap,必须与create configmap命令创建的卷名称相同
  21.       containers:     //容器的定义
  22.       - name: nginx
  23.         image: 192.168.1.100:5000/myos:nginx
  24.         volumeMounts:           //挂载存储卷
  25.         - name: nginx-php       //指定卷的名称,必须与(标记1)名称相同
  26.           subPath: nginx.conf   //指定映射单一文件路径(映射哪一个存储卷)
  27.           mountPath: /usr/local/nginx/conf/nginx.conf    //存储卷加载在容器的路径
  28.         ports:
  29.         - protocol: TCP
  30.           containerPort: 80
  31.       restartPolicy: Always
  32. [root@master ~]# kubectl apply -f webnginx.yaml
  33. deployment.apps/webnginx created
  34. [root@master ~]# kubectl get pod     //查询POD资源
  35. NAME                        READY   STATUS    RESTARTS   AGE
  36. webnginx-6fdf585d7d-lptqb   1/1     Running   0          7s
复制代码
# 验证服务,进入容器查看配置文件是否改变
  1. [root@master ~]# kubectl exec -it webnginx-6fdf585d7d-lptqb -- /bin/bash
  2. [root@webnginx-6fdf585d7d-lptqb html]# cat /usr/local/nginx/conf/nginx.conf
复制代码

  1. [root@webnginx-6fdf585d7d-lptqb html]# ss -ltun
复制代码

  1. [root@webnginx-6fdf585d7d-lptqb html]# exit
  2. Exit
  3. [root@master ~]# kubectl delete -f webnginx.yaml
  4. deployment.apps "webnginx" deleted
复制代码
  补充:以上步骤只完成了ConfigMap卷的创建、存储卷的映射,但由于PHP文件需要后端PHP程序剖析,还需添加PHP容器;其次两个容器通信需要共享网卡,最简单的方法即将两个容器写在同一个资源文件中;
  
步骤3:在webnginx.yaml资源文件的基础上,添加 php 容器
① 在资源文件template.spec.containers添加PHP容器
  1. [root@master ~]# vim webnginx.yaml
  2.  
  3. ---
  4. kind: Deployment
  5. apiVersion: apps/v1
  6. metadata:
  7.   name: webnginx
  8. spec:
  9.   selector:
  10.     matchLabels:
  11.       myapp: nginx
  12.   replicas: 1
  13.   template:
  14.     metadata:
  15.       labels:
  16.         myapp: nginx
  17.     spec:
  18.       volumes:
  19.       - name: nginx-php
  20.         configMap:
  21.           name: nginx-conf
  22.       containers:
  23.       - name: nginx
  24.         image: 192.168.1.100:5000/myos:nginx
  25.         volumeMounts:
  26.         - name: nginx-php
  27.           subPath: nginx.conf
  28.           mountPath: /usr/local/nginx/conf/nginx.conf
  29.         ports:
  30.         - protocol: TCP
  31.           containerPort: 80
  32.       - name: php-backend                       //添加PHP容器
  33.         image: 192.168.1.100:5000/myos:php-fpm  //指定私有仓库PHP的镜像
  34.       restartPolicy: Always
复制代码
② 执行资源文件,创建资源对象
  1. [root@master ~]# kubectl apply -f webnginx.yaml
  2. deployment.apps/webnginx created
  3. [root@master ~]# kubectl get pod -o wide
复制代码

③ 进入容器验证服务(1个POD有2个容器,需使用-c 指定容器)
  1. [root@master ~]# kubectl exec -it webnginx-6c9f6fd675-hkqth -c nginx -- /bin/bash  
  2. [root@webnginx-6c9f6fd675-hkqth html]# ss -ltun
复制代码

  1. [root@webnginx-6c9f6fd675-hkqth html]# exit
  2. exit
  3. [root@master ~]# curl http://10.244.2.22/info.php    //访问POD容器IP
  4. <pre>
  5. Array
  6. (
  7.     [REMOTE_ADDR] => 10.244.0.0
  8.     [REQUEST_METHOD] => GET
  9.     [HTTP_USER_AGENT] => curl/7.29.0
  10.     [REQUEST_URI] => /info.php
  11. )
  12. php_host:       webnginx-6c9f6fd675-hkqth
  13. 1229
复制代码
  补充:在同一个POD中,两个容器共享了主机名、信号向量、网卡、进程等,但没有文件体系,需要通过长期卷的加持,才气完成nginx+php方案
  
2、临时卷

用途:有些应用程序需要额外的存储,但并不关心数据在重启后仍然可用,即数据是否被长期地保存;例如:缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢、但对总体性能的影响很小的存储中;
常见的临时卷:emptyDir、configMap、downwardAPI、secret
2.1 emptyDir卷

emptyDir是最基础的Volume类型(存储卷),用于存储临时数据的简单空目次,当Pod设置了emptyDir类型存储卷,Pod被分配到Node上时候会创建emptyDir;只要运行在Node上,emptyDir都会存在(容器挂掉不会导致emptyDir丢失数据),但是如果Pod从Node上被删除(Pod被删除,大概Pod产生迁移,emptyDir也会被删除,并且永久丢失)
   emptyDir可以实现同一个Pod中数据的共享;
  资源文件引用emptyDir模板:


示例:创建emptydir存储卷

① 编写资源文件,引用emptydir定义
  1. [root@master ~]# vim webcache.yaml
  2. ---
  3. kind: Deployment           //定义资源的类型
  4. apiVersion: apps/v1
  5. metadata:
  6.   name: webcache           //定义资源的名称
  7. spec:
  8.   selector:
  9.     matchLabels:
  10.       myapp: cache
  11.   replicas: 1
  12.   template:
  13.     metadata:
  14.       labels:
  15.         myapp: cache
  16.     spec:
  17.       volumes:                //卷的定义,映射存储卷
  18.       - name: empty-data      //卷的名称(标记1)
  19.         emptyDir: {}          //定义存储临时数据空目录(卷类型)
  20.       containers:
  21.       - name: apache
  22.         image: 192.168.1.100:5000/myos:httpd
  23.         stdin: false
  24.         tty: false
  25.         volumeMounts:              //挂载存储卷
  26.         - name: empty-data         //指定卷的名称,必须与(标记1)名称相同
  27.           mountPath: /var/cache    //存储卷加载在容器的路径
  28.         ports:
  29.         - protocol: TCP
  30.           containerPort: 80
  31.       restartPolicy: Always
复制代码
② 执行资源文件
  1. [root@master ~]# kubectl apply -f webcache.yaml
  2. deployment.apps/webcache created
  3. [root@master ~]# kubectl get pod     //查看POD资源
  4. NAME                        READY   STATUS    RESTARTS   AGE
  5. webcache-6444646d9d-4nwkc   1/1     Running   0          11s
复制代码
③ 进入容器,验证测试
  1. [root@master ~]# kubectl exec -it webcache-6444646d9d-4nwkc -- /bin/bash
  2. [root@webcache-6444646d9d-4nwkc html]# df -h
复制代码


3、长期卷

用途:容器磁盘上的文件的生命周期是短暂的(容器本质是进程),这就使得在容器中运行重要应用时会出现一些题目。起首,当容器崩溃时,Kubelet会重启容器,但是容器中的文件将丢失,容器以干净的状态(镜像最初的状态)重新启动,其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件,而Kubernetes中的Volume抽象就很好的办理这些题目;
目前K8S支持的Volume存储卷类型:


3.1 HostPath卷

HostPath类型则是映射node文件体系中的文件大概目次到Pod里(类似Dokcer -v),在使用hostPath类型的存储卷时,也可以设置type字段,支持的类型有文件、目次、Socket、CharDevice和BlockDevice。
注意:配置雷同Pod,可能在不同的Node上体现不同,因为不同节点上映射的文件内容不同;
   hostPath里面的数据不会随着Pod的结束而消散;
  资源文件引用hostPath模板


示例:创建hostpath存储卷

① 映射当地目次/var/weblog到容器中
  1. [root@master ~]# vim webcache.yaml
  2. ---
  3. kind: Deployment
  4. apiVersion: apps/v1
  5. metadata:
  6.   name: webcache
  7. spec:
  8.   selector:
  9.     matchLabels:
  10.       myapp: cache
  11.   replicas: 1
  12.   template:
  13.     metadata:
  14.       labels:
  15.         myapp: cache
  16.     spec:
  17.       volumes:                       //卷的定义,映射存储卷
  18.       - name: empty-data
  19.         emptyDir: {}
  20.       - name: log-data               //卷的名称(标记1)
  21.         hostPath:                    //定义HostPath卷
  22.           path: /var/weblog          //Node节点加载路径
  23.           type: DirectoryOrCreate    //当目录不存在,则创建
  24.       containers:
  25.       - name: apache
  26.         image: 192.168.1.100:5000/myos:httpd
  27.         stdin: false
  28.         tty: false
  29.         volumeMounts:               //挂载存储卷
  30.         - name: empty-data
  31.           mountPath: /var/cache
  32.         - name: log-data            //指定卷的名称,必须与(标记1)名称相同
  33.           mountPath: /var/log/httpd   //存储卷映射在容器的路径
  34.         ports:
  35.         - protocol: TCP
  36.           containerPort: 80
  37.       restartPolicy: Always
复制代码
② 执行资源文件
  1. [root@master ~]# kubectl apply -f webcache.yaml
  2. deployment.apps/webcache configured
  3. [root@master ~]# kubectl get pod -o wide
复制代码

  1. [root@master ~]# curl http://10.244.1.17    //测试访问容器IP地址
  2. this is apache
复制代码
③ 登录Node节点上,查看挂载的目次是否有文件
  1. [root@master ~]# ssh 192.168.1.31
  2. [root@node-0001 ~]# ls -l /var/weblog/
  3. total 8
  4. -rw-r--r-- 1 root root  86 Jul  6 16:42 access_log
  5. -rw-r--r-- 1 root root 489 Jul  6 16:41 error_log
  6. [root@node-0001 ~]# cat /var/weblog/access_log
  7. 10.244.0.0 - - [06/Jul/2021:08:42:12 +0000] "GET / HTTP/1.1" 200 15 "-" "curl/7.29.0"
复制代码
④ 删除POD资源,查看挂载的目次中,文件是否保留
  1. [root@master ~]# kubectl delete -f webcache.yamldeployment.apps "webcache" deleted[root@master ~]# ssh 192.168.1.31
  2. [root@node-0001 ~]# ls -l /var/weblog/
  3. total 8
  4. -rw-r--r-- 1 root root  86 Jul  6 16:42 access_log
  5. -rw-r--r-- 1 root root 489 Jul  6 16:41 error_log
  6. [root@node-0001 ~]# cat /var/weblog/access_log
  7. 10.244.0.0 - - [06/Jul/2021:08:42:12 +0000] "GET / HTTP/1.1" 200 15 "-" "curl/7.29.0"
复制代码

3.2 NFS共享卷

在生产环境中经常需要多个Pod或多个APP应用中共享数据,而这些应用又在不同的机器的不同Pod里面,网络文件体系经常用来办理这一题目;Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持并发写操作,当然cephfs、glusterfs等都能很好的办理这个题目;
   PV、PVC配置
  ① PersistentVolume(长期卷,PV)
  PV是资源的提供者,根据集群的基础办法变化而变化,由K8S集群管理员配置;
  

  • - 格式:kubectl get pv
  ② Persistent VolumeClaim(长期卷声明,PVC)
  PVC是资源的使用者,根据业务服务的需求变化来配置;
  

  • - 格式:kubectl get pvc
  (PC/PVC的引入,是K8S集群具备了存储的逻辑抽象本事)
  配置PV(NFS资源)模板:

配置PVC(使用PV资源)模板:

引用配置文件模板:


示例:创建NFS长期卷

步骤1:搭建NFS服务器(registry操作)
  1. [root@registry ~]# yum install -y nfs-utils
  2. [root@registry ~]# mkdir -m 777 /var/webroot     //创建共享目录
  3. [root@registry ~]# ls -ld /var/webroot/
  4. drwxrwxrwx 2 root root 4096 Jul  6 16:58 /var/webroot/
  5. [root@registry ~]# vim /etc/exports
  6. /var/webroot *(rw)
  7. [root@registry ~]# systemctl enable --now nfs
复制代码
# 所有节点都需要nfs软件包(master,node-0001,node-0002,node-0003)
  1. [root@ecs-proxy node-install]# ansible nodes --list-hosts
  2.   hosts (3):
  3.     192.168.1.31
  4.     192.168.1.33
  5.     192.168.1.32
  6. [root@ecs-proxy ~]# cd node-install/
  7. [root@ecs-proxy node-install]# ansible nodes -m yum -a 'name="nfs-utils" state=present'
复制代码
# 在任意其他节点测试NFS
  1. [root@master ~]# yum install -y nfs-utils
  2. [root@master ~]# showmount -e 192.168.1.100
  3. Export list for 192.168.1.100:
  4. /var/webroot *
复制代码

步骤2:创建 PV长期卷
   官网:长期卷 | Kubernetes
  1. [root@master ~]# vim mypv.yaml
  2. ---
  3. kind: PersistentVolume      //定义PV持久卷类型
  4. apiVersion: v1
  5. metadata:
  6.   name: pv-nfs              //类型的名称
  7. spec:                       //PV类型的详细定义
  8.   volumeMode: Filesystem    //Volume模型(支持Filesystem文件系统、Block块设备)
  9.   capacity:                //定义卷的容量
  10.     storage: 30Gi         //提供卷的大小
  11.   accessModes:            //支持的模式(RWO、ROX,RWX,查看官网查询)
  12.   - ReadWriteOnce         //卷可以被一个节点以读写方式挂载;
  13.   - ReadOnlyMany          //卷可以被多个节点以只读方式挂载;
  14.   - ReadWriteMany         //卷可以被多个节点以读写方式挂载
  15.   persistentVolumeReclaimPolicy: Retain   //卷资源回收方式Retain自动删除,Delete手动删除
  16.   nfs:            //指定NFS共享
  17.     server: 192.168.1.100    //指定NFS服务器地址
  18.     path: /var/webroot       //指定共享目录
  19. [root@master ~]# kubectl apply -f mypv.yaml
  20. persistentvolume/pv-nfs created
  21. [root@master ~]# kubectl get pv
  22. NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
  23. pv-nfs   30Gi       RWO,ROX,RWX    Retain           Available                                   8s
复制代码

步骤3:创建PVC长期卷声明
  1. [root@master ~]# vim mypvc.yaml
  2. ---
  3. kind: PersistentVolumeClaim   //定义PVC持久卷声明类型
  4. apiVersion: v1
  5. metadata:
  6.   name: pvc-nfs             //类型的名称
  7. spec:                       //PVC类型的详细定义
  8.   volumeMode: Filesystem    //需要Volume模型(Filesystem文件系统、Block块设备)
  9.   accessModes:              //需要支持的模式
  10.   - ReadWriteMany          //卷可以被多个节点以读写方式挂载
  11.   resources:               //计算所需的资源
  12.     requests:              //描述所需的最小计算资源量
  13.       storage: 25Gi        //需要提供卷的空间
  14. [root@master ~]# kubectl apply -f mypvc.yaml
  15. persistentvolumeclaim/pvc-nfs created
复制代码
# 查看PV和PVC服务的状态
  1. [root@master ~]# kubectl get pv
复制代码

  1. [root@master ~]#  kubectl get pvc
复制代码

   补充:当PV长期卷被Bound绑定后,就不能同时被其它服务绑定;
  
步骤4:在webnginx.yaml资源文件中,引用长期卷
  1. [root@master ~]# vim webnginx.yaml---kind: DeploymentapiVersion: apps/v1metadata:  name: webnginxspec:  selector:    matchLabels:      myapp: nginx  replicas: 1  template:    metadata:      labels:        myapp: nginx    spec:      volumes:                       //卷的定义      - name: nginx-php        configMap:          name: nginx-conf      - name: website                //卷的名称(标签1)        persistentVolumeClaim:       //定义PVC卷类型          claimName: pvc-nfs         //PVC的名称      containers:          //容器的定义      - name: nginx        image: 192.168.1.100:5000/myos:nginx        volumeMounts:                //挂载存储卷        - name: nginx-php          subPath: nginx.conf          mountPath: /usr/local/nginx/conf/nginx.conf        - name: website               //指定卷的名称(标签1)          mountPath: /usr/local/nginx/html   //存储卷映射在容器的路径        ports:        - protocol: TCP          containerPort: 80      - name: php-backend   //PHP容器定义        image: 192.168.1.100:5000/myos:php-fpm        volumeMounts:                 //挂载存储卷        - name: website               //指定卷的名称(标签1)          mountPath: /usr/local/nginx/html   //存储卷映射在容器的路径      restartPolicy: Always[root@master ~]# kubectl delete -f webnginx.yamldeployment.apps "webnginx" deleted[root@master ~]# kubectl apply -f webnginx.yaml
  2. deployment.apps/webnginx created
  3. [root@master ~]# kubectl get pod -o wide
复制代码

# 拷贝网页文件到NFS服务器上,然后在容器端访问测试
  1. [root@ecs-proxy ~]# scp kubernetes/docker-images/info.* 192.168.1.100:/var/webroot/
  2. [root@master ~]# kubectl exec -it webnginx-d488b9447-ddfr4 -- /bin/bash
  3. [root@webnginx-d488b9447-ddfr4 html]# ls
  4. info.html  info.php
  5. [root@master ~]# curl http://10.244.2.23/info.html
  6. <html>
  7.   <marquee  behavior="alternate">
  8.       <font size="12px" color=#00ff00>Hello World</font>
  9.   </marquee>
  10. </html>
  11. [root@master ~]# curl http://10.244.2.23/info.php
  12. <pre>
  13. Array
  14. (
  15.     [REMOTE_ADDR] => 10.244.0.0
  16.     [REQUEST_METHOD] => GET
  17.     [HTTP_USER_AGENT] => curl/7.29.0
  18.     [REQUEST_URI] => /info.php
  19. )
  20. php_host:       webnginx-d488b9447-ddfr4
  21. 1229
复制代码

综合案例:

完整Nginx+php部署案例


  • ① 集群可以或许剖析静态html页面和动态PHP页面(ConfigMap)
  • ② 访问日记,存放到当地Node的/var/weblog中(HostPath)
  • ③ 网页内容,存储到NFS服务器(PC、PVC)
  • ④ 集群至少三节点,发布到互联网(Service\Ingress\nodePort\ELB+VIP)
实行架构图:

  1. [root@master ~]# cat webcluster.yaml
  2. ---
  3. kind: PersistentVolume
  4. apiVersion: v1
  5. metadata:
  6.   name: pv-nfs
  7. spec:
  8.   volumeMode: Filesystem
  9.   capacity:
  10.     storage: 30Gi
  11.   accessModes:
  12.   - ReadWriteOnce
  13.   - ReadOnlyMany
  14.   - ReadWriteMany
  15.   persistentVolumeReclaimPolicy: Retain
  16.   nfs:
  17.     server: 192.168.1.100
  18.     path: /var/webroot
  19.  
  20. ---
  21. kind: PersistentVolumeClaim
  22. apiVersion: v1
  23. metadata:
  24.   name: pvc-nfs
  25. spec:
  26.   volumeMode: Filesystem
  27.   accessModes:
  28.   - ReadWriteMany
  29.   resources:
  30.     requests:
  31.       storage: 25Gi
  32.  
  33. ---
  34. kind: ConfigMap
  35. apiVersion: v1
  36. metadata:
  37.   name: nginx-conf
  38. data:
  39.   nginx.conf: |2
  40.  
  41.     #user  nobody;
  42.     worker_processes  1;
  43.  
  44.     #error_log  logs/error.log;
  45.     #error_log  logs/error.log  notice;
  46.     #error_log  logs/error.log  info;
  47.  
  48.     #pid        logs/nginx.pid;
  49.  
  50.  
  51.     events {
  52.         worker_connections  1024;
  53.     }
  54.  
  55.  
  56.     http {
  57.         include       mime.types;
  58.         default_type  application/octet-stream;
  59.  
  60.         #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  61.         #                  '$status $body_bytes_sent "$http_referer" '
  62.         #                  '"$http_user_agent" "$http_x_forwarded_for"';
  63.  
  64.         #access_log  logs/access.log  main;
  65.  
  66.         sendfile        on;
  67.         #tcp_nopush     on;
  68.  
  69.         #keepalive_timeout  0;
  70.         keepalive_timeout  65;
  71.  
  72.         #gzip  on;
  73.  
  74.         server {
  75.             listen       80;
  76.             server_name  localhost;
  77.  
  78.             #charset koi8-r;
  79.  
  80.             #access_log  logs/host.access.log  main;
  81.  
  82.             location / {
  83.                 root   html;
  84.                 index  index.html index.htm;
  85.             }
  86.  
  87.             #error_page  404              /404.html;
  88.  
  89.             # redirect server error pages to the static page /50x.html
  90.             #
  91.             error_page   500 502 503 504  /50x.html;
  92.             location = /50x.html {
  93.                 root   html;
  94.             }
  95.  
  96.             # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  97.             #
  98.             #location ~ \.php$ {
  99.             #    proxy_pass   http://127.0.0.1;
  100.             #}
  101.  
  102.             # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  103.             #
  104.             location ~ \.php$ {
  105.                 root           html;
  106.                 fastcgi_pass   127.0.0.1:9000;
  107.                 fastcgi_index  index.php;
  108.                 include        fastcgi.conf;
  109.             }
  110.  
  111.             # deny access to .htaccess files, if Apache's document root
  112.             # concurs with nginx's one
  113.             #
  114.             #location ~ /\.ht {
  115.             #    deny  all;
  116.             #}
  117.         }
  118.  
  119.  
  120.         # another virtual host using mix of IP-, name-, and port-based configuration
  121.         #
  122.         #server {
  123.         #    listen       8000;
  124.         #    listen       somename:8080;
  125.         #    server_name  somename  alias  another.alias;
  126.  
  127.         #    location / {
  128.         #        root   html;
  129.         #        index  index.html index.htm;
  130.         #    }
  131.         #}
  132.  
  133.  
  134.         # HTTPS server
  135.         #
  136.         #server {
  137.         #    listen       443 ssl;
  138.         #    server_name  localhost;
  139.  
  140.         #    ssl_certificate      cert.pem;
  141.         #    ssl_certificate_key  cert.key;
  142.  
  143.         #    ssl_session_cache    shared:SSL:1m;
  144.         #    ssl_session_timeout  5m;
  145.  
  146.         #    ssl_ciphers  HIGH:!aNULL:!MD5;
  147.         #    ssl_prefer_server_ciphers  on;
  148.  
  149.         #    location / {
  150.         #        root   html;
  151.         #        index  index.html index.htm;
  152.         #    }
  153.         #}
  154.  
  155.     }
  156.  
  157. ---
  158. kind: Deployment
  159. apiVersion: apps/v1
  160. metadata:
  161.   name: webnginx
  162. spec:
  163.   selector:
  164.     matchLabels:
  165.       myapp: nginx
  166.   replicas: 3
  167.   template:
  168.     metadata:
  169.       labels:
  170.         myapp: nginx
  171.     spec:
  172.       volumes:
  173.       - name: nginx-php
  174.         configMap:
  175.           name: nginx-conf
  176.       - name: log-data
  177.         hostPath:
  178.           path: /var/log/weblog
  179.           type: DirectoryOrCreate
  180.       - name: website
  181.         persistentVolumeClaim:
  182.           claimName: pvc-nfs
  183.       containers:
  184.       - name: nginx
  185.         image: 192.168.1.100:5000/myos:nginx
  186.         volumeMounts:
  187.         - name: nginx-php
  188.           subPath: nginx.conf
  189.           mountPath: /usr/local/nginx/conf/nginx.conf
  190.         - name: log-data
  191.           mountPath: /usr/local/nginx/logs
  192.         - name: website
  193.           mountPath: /usr/local/nginx/html
  194.         ports:
  195.         - protocol: TCP
  196.           containerPort: 80
  197.       - name: php-backend
  198.         image: 192.168.1.100:5000/myos:php-fpm
  199.         volumeMounts:
  200.         - name: website
  201.           mountPath: /usr/local/nginx/html
  202.       restartPolicy: Always
  203.  
  204. ---
  205. kind: Service
  206. apiVersion: v1
  207. metadata:
  208.   name: webcluster
  209. spec:
  210.   ports:
  211.   - protocol: TCP
  212.     port: 80
  213.     targetPort: 80
  214.   selector:
  215.     myapp: nginx
  216.   type: ClusterIP
  217.  
  218. ---
  219. apiVersion: extensions/v1beta1
  220. kind: Ingress
  221. metadata:
  222.   name: myweb
  223.   annotations:
  224.     kubernetes.io/ingress.class: "nginx"
  225. spec:
  226.   backend:
  227.     serviceName: webcluster
  228.     servicePort: 80
  229.  
  230. [root@master ~]# kubectl apply -f webcluster.yaml
  231. persistentvolume/pv-nfs created
  232. persistentvolumeclaim/pvc-nfs created
  233. configmap/nginx-conf created
  234. deployment.apps/webnginx created
  235. service/webcluster created
  236. ingress.extensions/myweb created
  237. [root@master ~]# kubectl get pod
  238. NAME                       READY   STATUS    RESTARTS   AGE
  239. webnginx-647877b59-hdb64   2/2     Running   0          11s
  240. webnginx-647877b59-ljb6g   2/2     Running   0          11s
  241. webnginx-647877b59-rqmdr   2/2     Running   0          11s
  242. [root@master ~]# kubectl get ingresses
  243. NAME    HOSTS   ADDRESS        PORTS   AGE
  244. myweb   *       192.168.1.31   80      17s
复制代码
  # 给 node-0001 绑定弹性公网IP,或使用 ELB 发布到互联网即可验证
  
小结:

本篇章节为【第五阶段】CLOUD-DAY9 的学习条记,这篇条记可以开端了解到 Metrics资源使用率监控、存储卷管理(临时卷ConfitMap、EmptyDir、长期卷HostPath、NFS(PV/PVC))。

Tip:究竟两个人的智慧大于一个人的智慧,如果你不明白本章节的内容或需要相关条记、视频,可私信小安,请不关键羞和回避,可以向他人请教,花点时间直到你真正的明白。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表