# 最终结果为 [01234空格56789]0123456789---">
当前位置:   article > 正文

k8s-多容器Pod、容器保护策略、宽限期、最大生命周期、嵌入式脚本、多容器Pod、资源监控工具

k8s-多容器Pod、容器保护策略、宽限期、最大生命周期、嵌入式脚本、多容器Pod、资源监控工具

资源对象文件

一、模板与帮助信息

1、资源对象文件优势

  • 命令无法实现高级复杂的功能
  • 某些资源对象使用命令无法创建
  • 方便管理、保存、追溯历史

2、如何生成资源对象模板

资源对象 Pod 模板使用 run 生成
  1. [root@master ~]# kubectl run myweb --image=myos:nginx --dry-run=client -o yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. creationTimestamp: null
  6. labels:
  7. run: myweb
  8. name: myweb
  9. spec:
  10. containers:
  11. - image: myos:nginx
  12. name: myweb
  13. resources: {}
  14. dnsPolicy: ClusterFirst
  15. restartPolicy: Always
  16. status: {}
其它资源对象模板生成

除 Pod 外,其它资源对象模板使用 create 生成

生成模板命令:--dry-run=client -o yaml

  1. [root@master ~]# kubectl create namespace work --dry-run=client -o yaml
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. creationTimestamp: null
  6. name: work
  7. spec: {}
  8. status: {}

3、资源文件参数如何查询

使用 "." 分割层级结构关系
  1. ---
  2. kind: # 一级,可以表示为 .kind
  3. apiVersion: # 一级,可以表示为 .apiVersion
  4. metadata: # 一级,可以表示为 .metadata
  5. name: # 二级,可以表示为 .metadata.name
  6. spec:
  7. researtPolicy: xx
  8. containers:
  9. - name: # 三级,可以表示为 .spec.containers.name
  10. image:
  11. status: {}

4、如何获取帮助信息

是以 explain 资源对象 + 层级关系
  1. spec
  2. restartPolicy: Always # 获取Pod中该参数的帮助信息
  3. containers:
  4. #------------------------------------------------------------------------------
  5. [root@master ~]# kubectl explain Pod.spec.restartPolicy
  6. KIND: Pod
  7. VERSION: v1
  8. FIELD: restartPolicy <string>
  9. DESCRIPTION:
  10. Restart policy for all containers within the pod. One of Always, OnFailure,
  11. Never. Default to Always. More info:
  12. https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy
  13. Possible enum values:
  14. - `"Always"`
  15. - `"Never"`
  16. - `"OnFailure"`

5、如何使用资源对象文件管理

  1. [root@master app]# vim nginx.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6. name: nginx
  7. spec:
  8. containers:
  9. - name: nginx
  10. image: myos:nginx
  11. [root@master app]# vim phpfpm.yaml
  12. ---
  13. kind: Pod
  14. apiVersion: v1
  15. metadata:
  16. name: php
  17. spec:
  18. containers:
  19. - name: php
  20. image: myos:php-fpm
  1. # 使用资源对象文件创建应用
  2. [root@master app]# kubectl apply -f nginx.yaml -f phpfpm.yaml
  3. pod/nginx created
  4. pod/php created
  5. # 删除应用
  6. [root@master app]# kubectl delete -f /root/app/
  7. pod "nginx" deleted
  8. pod "php" deleted
  9. # 合并资源对象文件
  10. [root@master app]# cat nginx.yaml >> app.yaml
  11. [root@master app]# cat phpfpm.yaml >> app.yaml
  12. # 调用合并后的文件
  13. [root@master app]# kubectl apply -f app.yaml
  14. pod/nginx created
  15. pod/php created
  16. # 删除资源对象
  17. [root@master app]# kubectl delete -f app.yaml
  18. pod "nginx" deleted
  19. pod "php" deleted

二、自定义命令

1、Pod自定义命令

  • 创建 Pod 时,可以为其设置启动时要执行的自定义命令,如果配置了自定义命令,那么镜像中自带的默认启动命令将不在执行
  • 自定义命令设置在 command 字段下,如果要命令有参数,就填写在 args 字段下

2、Pod自定义命令样例

例如:执行 sleep 30 的自定义命令
  1. [root@master ~]# vim mycmd.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6. name: mycmd
  7. spec:
  8. containers:
  9. - name: linux
  10. image: myos:8.5
  11. command: ["sleep"] # 自定义命令
  12. args: ["30"] # 命令参数

三、restartPolicy(容器保护)策略

Pod 会根据策略决定容器结束后是否重启

  1. [root@master ~]# kubectl apply -f mycmd.yaml
  2. pod/mycmd created
  3. [root@master ~]# kubectl get pods -w
  4. NAME READY STATUS RESTARTS AGE
  5. mycmd 1/1 Running 0 10s
  6. mycmd 0/1 Completed 0 31s
  7. mycmd 1/1 Running 1 (1s ago) 32s
  8. -w:实时监视资源的状态变化

选项:重启(Always)、不重启(Never)、失败就重启(OnFailure)

  1. [root@master ~]# vim mycmd.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6. name: mycmd
  7. spec:
  8. restartPolicy: Never # 配置保护策略
  9. containers:
  10. - name: linux
  11. image: myos:8.5
  12. command: ["sleep"]
  13. args: ["10"]
  14. [root@master ~]# kubectl apply -f mycmd.yaml
  15. pod/mycmd created
  16. [root@master ~]# kubectl get pods -w
  17. NAME READY STATUS RESTARTS AGE
  18. mycmd 1/1 Running 0 4s
  19. mycmd 0/1 Completed 0 12s
  20. mycmd 0/1 Completed 0 13s

四、terminationGracePeriodSeconds(宽限期)策略

宽限期是为了避免服务突然中断,造成的事务不一致的问题

  1. [root@master ~]# kubectl delete -f mycmd.yaml
  2. [root@master ~]# kubectl apply -f mycmd.yaml
  3. # 为什么删除要等一会
  4. [root@master ~]# kubectl delete -f mycmd.yaml
  5. # 等待 .
  6. # 等待 ..
  7. # 等待 ...
  8. pod "mycmd" deleted

宽限期默认30s,不等待设置为0 

  1. [root@master ~]# vim mycmd.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6. name: mycmd
  7. spec:
  8. terminationGracePeriodSeconds: 0 # 设置宽限期
  9. restartPolicy: Never
  10. containers:
  11. - name: linux
  12. image: myos:8.5
  13. command: ["sleep"]
  14. args: ["30"]
  15. [root@master ~]# kubectl apply -f mycmd.yaml
  16. pod/mycmd created
  17. [root@master ~]# kubectl delete -f mycmd.yaml
  18. pod "mycmd" deleted

五、activeDeadlineSeconds策略

1、循环死锁

如果一个Pod的内部程序在运行时出现循环死锁,那么就会永远不停的重复执行,如何避免这种情况发生

2、activeDeadlineSeconds策略

允许Pod运行的最大时长

时间到期后会向Pod发送singal,如果Pod无法结束就把它强制关闭,并且设置为Error状态

  1. [root@master ~]# vim mycmd.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6. name: mycmd
  7. spec:
  8. terminationGracePeriodSeconds: 0
  9. activeDeadlineSeconds: 60 # 可以执行的最大时长
  10. restartPolicy: Never
  11. containers:
  12. - name: linux
  13. image: myos:8.5
  14. command: ["sleep"]
  15. args: ["300"]
  16. [root@master ~]# kubectl delete -f mycmd.yaml
  17. pod "mycmd" deleted
  18. [root@master ~]# kubectl apply -f mycmd.yaml
  19. pod/mycmd created
  20. [root@master ~]# kubectl get pods -w
  21. mycmd 1/1 Running 0 1s
  22. mycmd 1/1 Running 0 60s
  23. mycmd 0/1 Error 0 64s

六、自定义命令进阶

1、如何执行复杂命令

Yaml多行表达式
  1. ---
  2. string: > # 最终结果为 [01234空格56789]
  3. 01234
  4. 56789
  5. ---
  6. string2: | # 最终结果为 [01234换行56789]
  7. 01234
  8. 56789

2、在Pod中嵌入脚本

  1. [root@master ~]# vim mycmd.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6. name: mycmd
  7. spec:
  8. terminationGracePeriodSeconds: 0
  9. restartPolicy: Always
  10. containers:
  11. - name: linux
  12. image: myos:8.5
  13. command: ["/bin/bash"] # 调用bash命令
  14. args: # 设置命令的参数
  15. - -c # 从字符串中读取命令
  16. - | # 以下多行字符串保留原格式
  17. while sleep 5;do # 脚本指令,注意缩进对齐
  18. echo "hello world."
  19. done
  20. [root@master ~]# kubectl apply -f mycmd.yaml
  21. pod/mycmd created
  22. [root@master ~]# kubectl get pods
  23. NAME READY STATUS RESTARTS AGE
  24. mycmd 1/1 Running 0 3s
  25. [root@master ~]# kubectl logs mycmd
  26. hello world.
  27. hello world.
  28. hello world.

七、多容器Pod

1、创建多容器Pod

  1. [root@master ~]# vim mynginx.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6. name: mynginx
  7. spec:
  8. terminationGracePeriodSeconds: 0
  9. restartPolicy: Always
  10. containers:
  11. - name: nginx
  12. image: myos:nginx
  13. - name: php
  14. image: myos:php-fpm
  15. [root@master ~]# kubectl apply -f mynginx.yaml
  16. pod/mynginx created
  17. [root@master ~]# kubectl get pods
  18. NAME READY STATUS RESTARTS AGE
  19. mynginx 2/2 Running 0 3s

2、管理多容器Pod

受多容器配置影响,以下命令需要使用<-c 容器名字>

受影响命令:[logs,exec,cp]

  1. [root@master ~]# echo "hello world" >hello.html
  2. [root@master ~]# kubectl cp hello.html mynginx:/usr/local/nginx/html/ -c nginx
  3. [root@master ~]# kubectl exec mynginx -c php -- ps
  4. PID TTY TIME CMD
  5. 1 ? 00:00:00 php-fpm
  6. 7 ? 00:00:00 ps
  7. [root@master ~]# kubectl logs mynginx -c nginx
  8. [root@master ~]#

资源指标监控

一、资源指标有什么用

在安装部署程序之后,必须要了解应用程序在部署后的性能以及资源使用情况。你可以通过检测Pod容器或节点来了解整个集群的情况

二、如何监控资源指标

Kubernetes的Metrics-server组件提供有关节点和Pod的资源使用情况的信息,包括CPU和内存的指标。如果将Metrics-server部署到集群中,就可以查询并使用到这些信息管理应用及服务

三、Metrics-server

1、概述

Metrics-Server是集群核心监控数据的聚合器。通俗的说,它存储了集群中各节点和Pod的监控数据,并且提供了API以供查询和使用

Metrics-Server通过kubelet获取node和Pod的CPU,内存等监控数据。为调度器、弹性控制器、以及Dashboard等UI组件提供数据来源

2、安装

kube-apiserver必须启用聚合服务,或使用kube-proxy代理转发

节点必须启用身份验证和授权。kubelet证书需要由集群证书颁发机构签名

Metrics-Server使用443、4443端口,所有节点上kubelet必须能够访问该端口

启用引导令牌,并签发

  1. # 追加配置参数并重启服务
  2. [root@master ~]# echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml
  3. [root@master ~]# systemctl restart kubelet
  4. # 获取证书名称,并签发
  5. [root@master ~]# kubectl get certificatesigningrequests
  6. NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
  7. csr-2hg42 14s kubernetes.io/kubelet-serving system:node:master <none> Pending
  8. [root@master ~]# kubectl certificate approve csr-2hg42
  9. certificatesigningrequest.certificates.k8s.io/csr-2hg42 approved
  10. [root@master ~]# kubectl get certificatesigningrequests
  11. NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
  12. csr-2hg42 28s kubernetes.io/kubelet-serving system:node:master <none> Approved,Issued

导入镜像,并上传到私有仓库

将镜像导入到私有仓库plugins目录下

  1. # 导入镜像
  2. [root@master metrics]# docker load -i metrics-server.tar.xz
  3. # 上传镜像到私有仓库
  4. [root@master metrics]# docker images|while read i t _;do
  5. [[ "${t}" == "TAG" ]] && continue
  6. [[ "${i}" =~ ^"harbor:443/".+ ]] && continue
  7. docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}
  8. docker push harbor:443/plugins/${i##*/}:${t}
  9. docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}
  10. done

安装metrics组件 

  1. # 修改镜像地址
  2. [root@master metrics]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' components.yaml
  3. 140: image: harbor:443/plugins/metrics-server:v0.6.2
  4. # 安装插件服务
  5. [root@master metrics]# kubectl apply -f components.yaml
  6. # 验证插件 Pod 状态
  7. [root@master metrics]# kubectl -n kube-system get pods -l k8s-app=metrics-server
  8. NAME READY STATUS RESTARTS AGE
  9. metrics-server-ddb449849-c6lkc 1/1 Running 0 64s

获取监控指标

  1. [root@master metrics]# kubectl top nodes
  2. NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
  3. master 99m 4% 1005Mi 27%
  4. node-0001 <unknown> <unknown> <unknown> <unknown>
  5. node-0002 <unknown> <unknown> <unknown> <unknown>
  6. node-0003 <unknown> <unknown> <unknown> <unknown>
  7. node-0004 <unknown> <unknown> <unknown> <unknown>
  8. node-0005 <unknown> <unknown> <unknown> <unknown>

获取node节点监控指标

为所有node节点启用引导令牌

  1. #--------------- 在所有计算节点配置证书 -----------------
  2. [root@node ~]# echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml
  3. [root@node ~]# systemctl restart kubelet

签发所有令牌

  1. [root@master ~]# kubectl certificate approve $(kubectl get csr -o name)
  2. certificatesigningrequest.certificates.k8s.io/csr-2hg42 approved
  3. certificatesigningrequest.certificates.k8s.io/csr-9gu29 approved
  4. ......
  5. [root@master ~]# kubectl get certificatesigningrequests
  6. NAME AGE SIGNERNAME REQUESTOR CONDITION
  7. csr-2hg42 14m kubernetes.io/kubelet-serving master Approved,Issued
  8. csr-9gu29 28s kubernetes.io/kubelet-serving node-0001 Approved,Issued
  9. csr-xhp83 21s kubernetes.io/kubelet-serving node-0002 Approved,Issued
  10. csr-69qhz 15s kubernetes.io/kubelet-serving node-0003 Approved,Issued
  11. csr-t8799 15s kubernetes.io/kubelet-serving node-0004 Approved,Issued
  12. csr-8k69w 15s kubernetes.io/kubelet-serving node-0005 Approved,Issued

获取node监控指标

  1. # 获取资源指标有延时,等待 15s 即可查看
  2. [root@master ~]# kubectl top nodes
  3. NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
  4. master 83m 4% 1789Mi 50%
  5. node-0001 34m 1% 747Mi 20%
  6. node-0002 30m 1% 894Mi 24%
  7. node-0003 39m 1% 930Mi 25%
  8. node-0004 45m 2% 896Mi 24%
  9. node-0005 40m 2% 1079Mi 29%

四、资源指标

1、CPU资源指标

CPU资源的约束和请求以毫核(m)为单位。在k8s中1m是最小的调度单元,CPU的一个核心可以看作1000m

如果你有2颗CPU,且每CPU为4核心,那么你的CPU资源总量就是8000m

2、MEMORY资源指标

memory的约束和请求以字节为单位

可以使用以下单位来表示内存:E、P、T、G、M、K

也可以使用对应的2的幂数:Ei、Pi、Ti、Gi、Mi、Ki

五、创建Pod并获取监控指标

  1. [root@master ~]# vim mylinux.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6. name: mylinux
  7. spec:
  8. containers:
  9. - name: linux
  10. image: myos:8.5
  11. command: ["awk", "BEGIN{while(1){}}"]
  12. [root@master ~]# kubectl apply -f mylinux.yaml
  13. pod/mylinux created
  1. # 查看 CPU 资源消耗
  2. [root@master ~]# kubectl top pods
  3. NAME CPU(cores) MEMORY(bytes)
  4. mylinux 999m 6Mi
  5. # 测试消耗内存资源
  6. [root@master ~]# kubectl cp memtest.py mylinux:/usr/bin/
  7. [root@master ~]# kubectl exec -it mylinux -- memtest.py 2500
  8. use memory success
  9. press any key to exit :
  10. #--------------- 在另一个终端查看------------------------
  11. [root@master ~]# kubectl top pods
  12. NAME CPU(cores) MEMORY(bytes)
  13. mylinux 1001m 2503Mi

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/296061
推荐阅读
相关标签
  

闽ICP备14008679号