Top

NSD CLOUD DAY09

  1. 案例1:安装部署metrics-server
  2. 案例2:容器资源利用率监控
  3. 案例3:configMap练习
  4. 案例4:网络存储卷应用案例
  5. emptydir案例
  6. hostpath案例
  7. pv/pvc案例
  8. 案例5:课外实验(微服务web集群实战)

1 案例1:安装部署metrics-server

1.1 问题

本案例要求安装部署metrics-server,具体要求如下:

  1. 修改 apiserver 的启动参数,添加聚合API
  2. 配置文件路径 /etc/kubernetes/manifests/kube-apiserver.yaml
  3. - --enable-aggregator-routing=true
  4. 重启 kubelet 服务
  5. 导入镜像,部署metrics-server
  6. pdb.yaml, rbac.yaml
  7. deployment.yaml, service.yaml,apiservice.yaml
  8. 验证 kubectl top node

1.2 方案

metrics是一个监控系统资源使用的插件,可以监控node节点上的cpu、内存的使用率,或pod对资源的占用率,通过对资源占用的了解,可以更加合理的部署容器应用

1.3 步骤

实现此案例需要按照如下步骤进行。

没有安装部署metrics之前查看node节点信息会失败。

  1. [root@master ~]# kubectl top node
  2. Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)

步骤一:修改kube-apiserver配置文件(在master主机操作)

1)开启聚合服务

默认K8S不支持聚合服务就没法用metrics,这里首先需要修改配置文件开启该功能。

  1. [root@master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
  2. #在该文件中找spec.containers.command ,在它的最下面手动添加如下一行内容:
  3. - --enable-aggregator-routing=true
  4.  
  5. [root@master ~]# systemctl restart kubelet #重启服务
  6.  
  7. [root@master ~]# kubectl -n kube-system get pod \
  8. kube-apiserver-master -o yaml |grep enable-aggregator-routing
  9. #修改完成后,将kube-apiserver的配置导出查看是否有刚刚添加的参数,有就代表成功了
  10. #这一步是验证的操作

2)设置kubelet证书

  1. [root@master ~]# vim /var/lib/kubelet/config.yaml #在文件末尾手动添加如下一行
  2. serverTLSBootstrap: true
  3.  
  4. [root@master ~]# systemctl restart kubelet #重启服务
  5. # 等待几分钟后就能看到了
  6.  
  7. [root@master ~]# kubectl get certificatesigningrequests
  8. NAME        AGE    REQUESTOR        CONDITION
  9. csr-nvd65        8m     system:node:master     Pending
  10. csr-6qz7b        4m34s     system:node:node-0003     Pending
  11. csr-rft2l        4m46s     system:node:node-0002 Pending
  12. csr-t5fvc        5m2s     system:node:node-0001 Pending
  13. #这里查看到所有的主机都在等待证书的签发
  14. #master主机的证书目前状态为Pending,代表正在等待证书的签发
  15. #node-0003主机的证书目前状态为Pending,代表正在等待证书的签发
  16. #node-0002主机的证书目前状态为Pending,代表正在等待证书的签发
  17. #node-0001主机的证书目前状态为Pending,代表正在等待证书的签发

重要:修改配置文件开启证书后,所有主机的证书都没有签发,下面需要给所有主机都签发证书(等于是给证书签个名才能用)

注意:是所有主机的证书都需要签发,如何签发呢?具体语法格式如下:

kubectl certificate approve 名称

这里最后的名称就是上面kubectl get certificatesigningrequests命令查看到的名称

  1. [root@master ~]# kubectl certificate approve csr-nvd65    # 签发证书
  2. [root@master ~]# kubectl certificate approve csr-6qz7b    # 签发证书
  3. [root@master ~]# kubectl certificate approve csr-rft2l    # 签发证书
  4. [root@master ~]# kubectl certificate approve csr-t5fvc    # 签发证书
  5. #注意:最后的名称不能照抄,一定要自己通过kubectl get certificatesigningrequests查看

再次查看证书状态

  1. [root@master ~]# kubectl get certificatesigningrequests
  2. NAME        AGE    REQUESTOR        CONDITION
  3. csr-nvd65        16m     system:node:master     Approved,Issued
  4. csr-t5fvc        13m     system:node:node-0001 Approved,Issued
  5. csr-rft2l        13m     system:node:node-0002 Approved,Issued
  6. csr-6qz7b        13m     system:node:node-0003 Approved,Issued
  7. #所有证书状态都是Approved(已经被签发了)

步骤二:安装metrics-server(在master主机操作)

1)导入镜像到私有镜像仓库(192.168.1.100服务器)

镜像及资源文件在云盘第四阶段kubernetes/v1.17.6/metrics/目录下,各位同学需要提前下载。

  1. [root@master ~]# docker load -i metrics-server.tar.gz
  2. [root@master ~]# docker images            #查看metrics-server镜像的名称
  3. [root@master ~]# docker tag 旧名称 192.168.1.100:5000/metrics-server:master
  4. [root@master ~]# docker push 192.168.1.100:5000/metrics-server:master

2)修改资源文件

所有资源文件在云盘第四阶段kubernetes/v1.17.6/metrics/目录下,各位同学需要提前下载。

  1. [root@master metrics]# vim deployment.yaml
  2. 29: image: 192.168.1.100:5000/metrics-server:master
  3. # 该行原文指向官网地址,我们需要修改为自己的私有镜像仓库
  4. # 启动metrics-server容器时就从私有仓库下载镜像然后再启动容器,否则默认是连接官网找镜像

3)依次创建所有资源

  1. [root@master metrics]# kubectl apply -f rbac.yaml
  2. [root@master metrics]# kubectl apply -f pdb.yaml
  3. [root@master metrics]# kubectl create -f deployment.yaml
  4. [root@master metrics]# kubectl apply -f service.yaml
  5. [root@master metrics]# kubectl apply -f apiservice.yaml

4)验证

  1. [root@master metrics]# kubectl -n kube-system get pod         # 验证POD
  2. NAME      READY     STATUS     RESTARTS AGE
  3. metrics-server-xxx     1/1     Running      0 9m15s
  4. ... ...
  5.  
  6. [root@master metrics]# kubectl -n kube-system get apiservices     # 验证API
  7. NAME          SERVICE     AVAILABLE AGE
  8. v1beta1.metrics.k8s.io     kube-system/metrics-server     True      15m
  9.  
  10.  
  11. [root@master metrics]# kubectl top node
  12. error: metrics not available yet    # 你需要等几分钟,还没有收集数据
  13.  
  14. [root@master metrics]# kubectl top node
  15. NAME         CPU(cores)    CPU%     MEMORY(bytes)     MEMORY%
  16. master        73m         3%     1196Mi          68%
  17. node-0001     20m     1% 729Mi 41%
  18. ... ...

2 案例2:容器资源利用率监控

  1. [root@master ~]# kubectl apply -f myapache.yaml
  2. deployment.apps/myapache created
  3. [root@master ~]# kubectl top pod
  4. error: metrics not available yet
  5. # 等待大约 30
  6. [root@master ~]# kubectl top pod
  7. NAME CPU(cores) MEMORY(bytes)
  8. myapache-7d689bf8f-lfr5h 0m 0Mi
  9. [root@master ~]# curl http://10.244.2.17/info.php?id=5000000
  10. <pre>
  11. Array
  12. (
  13. [REMOTE_ADDR] => 10.244.0.0
  14. [REQUEST_METHOD] => GET
  15. [HTTP_USER_AGENT] => curl/7.29.0
  16. [REQUEST_URI] => /info.php?id=5000000
  17. [id] => 5000000
  18. )
  19. php_host:     myapache-7d689bf8f-lfr5h
  20. [root@master ~]# kubectl top pod
  21. NAME CPU(cores) MEMORY(bytes)
  22. myapache-7d689bf8f-w4rtt 1000m 8Mi
  23. [root@master ~]#

3 案例3:configMap练习

3.1 问题

本案例主要做configMap练习,具体要求如下:

  1. 通过configMap修改nginx的配置文件
  2. 让nginx支持php

3.2 方案

ConfigMap是在Pod中映射(文件/目录)的一种方式,允许你将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。

通过ConfigMap我们可以把真机的目录或文件映射到容器中。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建configMap资源(在master主机操作)

1)准备一个nginx的配置文件。

启动一个容器,从容器中将nginx.conf文件拷贝到真机。

  1. [root@master ~]# mkdir /var/webconf
  2. [root@master ~]# docker run -itd --name mynginx 192.168.1.100:5000/myos:nginx
  3. 9f719d0e797f81887b21985a31f426c1f2c48efd24a2c6666ecf41396fb99e93
  4. [root@master ~]# docker cp mynginx:/usr/local/nginx/conf/nginx.conf /var/webconf/
  5. [root@master ~]# docker rm -f mynginx
  6. mynginx
  7. [root@master ~]# ls -l /var/webconf/
  8. total 4
  9. -rw-r--r-- 1 root root 2656 Jul 25 2020 nginx.conf
  10. [root@master ~]# vim /var/webconf/nginx.conf
  11. ... ...
  12. location ~ \.php$ {
  13. root html;
  14. fastcgi_pass 127.0.0.1:9000;
  15. fastcgi_index index.php;
  16. include fastcgi.conf;
  17. }
  18. ... ...
  19. [root@master ~]# kubectl create configmap nginx-conf --from-file=/var/webconf/nginx.conf
  20. configmap/nginx-conf created
  21. [root@master ~]# kubectl get configmaps
  22. NAME DATA AGE
  23. nginx-conf 1 8s
  24. [root@master ~]#

2)定义configMap

configMap可以映射单一文件,也可以映射一个目录。

语法格式:kubectl create configmap 名称 --from-file=文件路径

  1. [root@master ~]# kubectl create configmap nginx-conf --from-file=nginx.conf
  2. configmap "nginx-conf" created
  3. # 创建一个名称为nginx-conf的configMap,对应的是真机的nginx.conf文件
  4.  
  5. [root@master ~]# kubectl get configmap nginx-conf #查看configMap
  6. NAME     DATA     AGE
  7. nginx-conf     1     10s

3)使用资源文件启动容器调用前面定义的configMap

资源文件已经工作在云盘第四阶段kubernetes/v1.17.6/config/目录下。

  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
  12. template:
  13. metadata:
  14. labels:
  15. myapp: nginx
  16. spec:
  17. volumes: # 新添加
  18. - name: nginx-php # 新添加(标记1
  19. configMap: # 新添加
  20. name: nginx-conf # 新添加,必须与 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.  
  33. [root@master ~]# kubectl apply -f webnginx.yaml
  34. deployment.apps/webnginx created
  35. [root@master ~]# kubectl get pod
  36. NAME READY STATUS RESTARTS AGE
  37. webnginx-844859695b-5s7m7 1/1 Running 0 10s
  38. [root@master ~]# kubectl exec -it webnginx-844859695b-5s7m7 -- /bin/bash
  39. [root@webnginx-844859695b-5s7m7 html]# cat /usr/local/nginx/conf/nginx.conf
  40. # 查看配置文件是否改变了
  41. [root@webnginx-844859695b-kmwwh html]# ss -ltun
  42. Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
  43. tcp LISTEN 0 128 *:80 *:*
  44. [root@webnginx-844859695b-kmwwh html]# exit
  45. [root@master ~]# kubectl delete -f webnginx.yaml
  46. deployment.apps "webnginx" deleted
  47. [root@master ~]#

4)添加PHP容器,测试网页

  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
  12. template:
  13. metadata:
  14. labels:
  15. myapp: nginx
  16. spec:
  17. volumes:
  18. - name: nginx-php
  19. configMap:
  20. name: nginx-conf
  21. containers:
  22. - name: nginx
  23. image: 192.168.1.100:5000/myos:nginx
  24. volumeMounts:
  25. - name: nginx-php
  26. subPath: nginx.conf
  27. mountPath: /usr/local/nginx/conf/nginx.conf
  28. ports:
  29. - protocol: TCP
  30. containerPort: 80
  31. - name: php-backend # 新添加
  32. image: 192.168.1.100:5000/myos:php-fpm # 新添加
  33. restartPolicy: Always
  34.  
  35. [root@master ~]# kubectl apply -f config/webnginx.yaml
  36. deployment.apps/webnginx created
  37. [root@master ~]# kubectl get pod -o wide
  38. NAME READY STATUS RESTARTS AGE    IP NODE
  39. webnginx-6c9f6fd675-7rmzk 2/2 Running 0 5s        10.244.2.25 node-0002
  40. [root@master ~]# kubectl exec -it webnginx-6c9f6fd675-7rmzk -c nginx -- /bin/bash
  41. [root@webnginx-6c9f6fd675-7rmzk html]# ss -ltun
  42. Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
  43. tcp LISTEN 0 128 *:80 *:*
  44. tcp LISTEN 0 128 *:9000 *:*
  45. [root@webnginx-6c9f6fd675-7rmzk html]# exit
  46. [root@master ~]# curl http://10.244.2.25/info.php
  47. <pre>
  48. Array
  49. (
  50. [REMOTE_ADDR] => 10.244.0.0
  51. [REQUEST_METHOD] => GET
  52. [HTTP_USER_AGENT] => curl/7.29.0
  53. [REQUEST_URI] => /info.php
  54. )
  55. php_host:     webnginx-6c9f6fd675-7rmzk
  56. 1229
  57. [root@master ~]#

4 案例4:网络存储卷应用案例

5 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 # 新添加
  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 # 新添加
  27. mountPath: /var/cache # 新添加
  28. ports:
  29. - protocol: TCP
  30. containerPort: 80
  31. restartPolicy: Always
  32.  
  33. [root@master ~]# kubectl apply -f webcache.yaml
  34. deployment.apps/webcache created
  35. [root@master ~]# kubectl exec -it webcache-c58847c54-qw9lh -- /bin/bash
  36. [root@webcache-c58847c54-qw9lh html]# df -h
  37. Filesystem Size Used Avail Use% Mounted on
  38. /dev/vda1 40G 2.9G 35G 8% /var/cache
  39. ... ...
  40. [root@webcache-c58847c54-qw9lh html]# exit
  41. [root@master ~]#

6 hostpath案例

  1. [root@master ~]# cat 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 # 新添加
  21. hostPath: # 新添加
  22. path: /var/weblog # 新添加
  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 # 新添加
  33. mountPath: /var/log/httpd # 新添加
  34. ports:
  35. - protocol: TCP
  36. containerPort: 80
  37. restartPolicy: Always
  38. [root@master ~]# kubectl apply -f webcache.yaml
  39. deployment.apps/webcache created
  40. [root@master ~]# kubectl get pod -o wide
  41. NAME READY STATUS RESTARTS AGE IP NODE
  42. webcache-75588b9cc5-xzkvc 1/1 Running 0 4s 10.244.2.30 node-0002
  43. [root@master ~]# curl http://10.244.2.30/
  44. this is apache
  45. [root@master ~]# ssh 192.168.1.32
  46. root@192.168.1.32's password:
  47. Last login: Mon Apr 26 10:41:58 2021 from 192.168.1.252
  48. Welcome to Huawei Cloud Service
  49.  
  50. [root@node-0002 ~]# ls -l /var/weblog/
  51. total 16
  52. -rw-r--r-- 1 root root 86 Apr 26 13:12 access_log
  53. -rw-r--r-- 1 root root 489 Apr 26 13:12 error_log
  54. [root@node-0002 ~]# cat /var/weblog/access_log
  55. 10.244.0.0 - - [26/Apr/2021:05:12:59 +0000] "GET / HTTP/1.1" 200 15 "-" "curl/7.29.0"
  56. [root@node-0002 ~]#

7 pv/pvc案例

7.1 问题

本案例练习练习使用网络存储卷,具体要求如下。

  1. 安装 NFS服务
  2. 定义 PV,PVC
  3. 在K8S集群中挂载NFS存储卷

7.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:部署NFS服务器(在192.168.1.100主机操作)

1)部署服务器

  1. [root@registry ~]# yum install -y nfs-utils
  2. [root@registry ~]# mkdir -m 777 /var/webroot
  3. [root@registry ~]# vim /etc/exports
  4. /var/webroot    *(rw)
  5. [root@registry ~]# systemctl enable --now nfs

2)任意其他主机做客户端测试

  1. [root@localhost ~]# yum install -y nfs-utils
  2. [root@localhost ~]# showmount -e 192.168.1.100
  3. Export list for 192.168.1.100:
  4. /var/webroot *

步骤二:创建PV/PVC资源(在master主机操作)

对应的资源文件在云盘第四阶段kubernetes/v1.17.6/config/目录。

1)创建PV资源

  1. [root@master ~]# vim mypv.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. [root@master ~]# kubectl apply -f mypv.yaml
  21. persistentvolume/pv-nfs created
  22. [root@master ~]# kubectl get pv
  23. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS AGE
  24. pv-nfs 30Gi RWO,ROX,RWX Retain Available 3s

2)创建PVC资源(默认情况下PVC与PV会自动匹配容量大小、自动映射)

  1. [root@master configmap]# vim mypvc.yaml
  2. ---
  3. kind: PersistentVolumeClaim
  4. apiVersion: v1
  5. metadata:
  6. name: pvc-nfs
  7. spec:
  8. volumeMode: Filesystem
  9. accessModes:
  10. - ReadWriteMany
  11. resources:
  12. requests:
  13. storage: 25Gi
  14.  
  15. [root@master configmap]# kubectl apply -f mypvc.yaml
  16. [root@master configmap]# kubectl get pv
  17. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM
  18. pv-nfs 30Gi RWX Retain Bound default/pvc-nfs
  19. [root@master configmap]# kubectl get pvc
  20. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  21. pvc-nfs Bound pv-nfs 30Gi RWO,ROX,RWX 27s

3)创建容器资源,调用PVC

  1. [root@master ~]# cat 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
  12. template:
  13. metadata:
  14. labels:
  15. myapp: nginx
  16. spec:
  17. volumes:
  18. - name: nginx-php
  19. configMap:
  20. name: nginx-conf
  21. - name: website # 新添加
  22. persistentVolumeClaim: # 新添加
  23. claimName: pvc-nfs # 新添加
  24. containers:
  25. - name: nginx
  26. image: 192.168.1.100:5000/myos:nginx
  27. volumeMounts:
  28. - name: nginx-php
  29. subPath: nginx.conf
  30. mountPath: /usr/local/nginx/conf/nginx.conf
  31. - name: website # 新添加
  32. mountPath: /usr/local/nginx/html # 新添加
  33. ports:
  34. - protocol: TCP
  35. containerPort: 80
  36. - name: php-backend
  37. image: 192.168.1.100:5000/myos:php-fpm
  38. volumeMounts: # 新添加
  39. - name: website # 新添加
  40. mountPath: /usr/local/nginx/html # 新添加
  41. restartPolicy: Always
  42.  
  43. [root@master ~]# kubectl delete -f webnginx.yaml
  44. deployment.apps "webnginx" deleted
  45. [root@master ~]# kubectl apply -f webnginx.yaml
  46. deployment.apps/webnginx created
  47. [root@master ~]# kubectl get pod -o wide
  48. NAME READY STATUS RESTARTS AGE IP NODE
  49. webnginx-d488b9447-t62cl 2/2 Running 0 7s 10.244.2.32 node-0002
  50. [root@master ~]# curl http://10.244.2.32/
  51. # 在 nfs 上创建修改页面,然后在容器端访问测试

8 案例5:课外实验(微服务web集群实战)

8.1 问题

本案例结合前面的实验步骤做一个综合的微服务课外练习,具体要求如下。

  1. 使用myos:php-fpm 创建后端应用php-app
  2. 创建php-service,为后端应用提供内部clusterIP和负载均衡
  3. 使用myos:nginx创建应用,并使用php-service解析php文件
  4. 创建web-service,发布nginx应用到nodePort
  5. 使用Ingress对外发布服务nginx应用

8.2 步骤

实现此案例需要参考前面的案例1至案例5的内容自行完成。