失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 容器编排学习(五)资源对象文件

容器编排学习(五)资源对象文件

时间:2020-06-08 16:07:40

相关推荐

容器编排学习(五)资源对象文件

一 资源对象文件

1 模板与帮助信息

资源对象文件优势 命令无法实现高级复杂的功能某些资源对象使用命令无法创建方便管理、保存、追湖历史资源 对象文件太长,记不住怎么办? 使用命令创建模板查询帮助信息查询官方手册

2 生成资源对象模板

资源对象 Pod 模板使用 run 生成

# 获取 Pod 模板[root@master ~]# kubectl run myweb --image=myos:nginx --dry-run=client -o yamlapiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: mywebname: mywebspec:containers:- image: myos:nginxname: mywebresources: {}dnsPolicy: ClusterFirstrestartPolicy: Alwaysstatus: {}

除 Pod 外,其他资源对象模板使用 create 生成生成模板命令:[--dry-run=client -o yaml]

# 获取资源对象模板[root@master ~]# kubectl create namespace work --dry-run=client -o yamlapiVersion: v1kind: Namespacemetadata:creationTimestamp: nullname: workspec: {}status: {}

以 explain 资源对象 +层级关系获取帮助信息

# 查询帮助信息[root@master ~]# kubectl explain Pod.spec.restartPolicyKIND:PodVERSION: v1FIELD: restartPolicy <string>DESCRIPTION:Restart policy for all containers within the pod. One of Always, OnFailure,Never. Default to Always. More info:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policyPossible enum values:- `"Always"`- `"Never"`- `"OnFailure"`

资源对象文件

[root@master ~]# mkdir app[root@master ~]# cd app[root@master app]# vim nginx.yaml ---kind: PodapiVersion: v1metadata:name: nginxspec:containers:- name: nginximage: myos:nginx[root@master app]# vim phpfpm.yaml---kind: PodapiVersion: v1metadata:name: phpspec:containers:- name: phpimage: myos:php-fpm

3 管理资源对象文件

使用资源对象文件创建应用

[root@master app]# lsnginx.yaml phpfpm.yaml# 使用资源对象文件创建应用[root@master app]# kubectl apply -f nginx.yaml -f phpfpm.yamlpod/nginx createdpod/php created# 删除应用[root@master app]# kubectl delete -f /root/app/pod "nginx" deletedpod "php" deleted

合并资源对象文件 多个资源文件可以使用作为分隔符,合并管理

# 合并资源对象文件[root@master app]# cat nginx.yaml >>app.yaml[root@master app]# cat phpfpm.yaml >>app.yaml# 创建资源对象[root@master ~]# kubectl apply -f app.yamlpod/nginx createdpod/php created# 删除资源对象[root@master ~]# kubectl delete -f app.yamlpod "nginx" deletedpod "php" deleted

二 自定义命令

1 Pod自定义命令

创建 Pod 时,可以为其设置启动时要执行的自定义命令如果配置了自定义命令,那么镜像中自带的默认启动命令将不再执行

自定义命令设置在 command 字段下,如果要命令有参数就填写在 args 字段下

[root@master ~]# vim mycmd.yaml---kind: PodapiVersion: v1metadata:name: mycmdspec:containers:- name: linuximage: myos:8.5command: ["sleep"] # 自定义命令args: ["30"] # 自定义命令参数[root@master ~]# kubectl apply -f mycmd.yamlpod/mycmd created[root@master ~]# kubectl get pods -wNAME READY STATUSRESTARTSAGEmycmd 1/1Running0 4smycmd 0/1Completed 0 31smycmd 1/1Running1 (2s ago) 32s

2 容器保护策略(restartPolicy策略)

Pod 会根据策略决定容器结束后是否重启重启[Always],不重启[Never],失败就重启[OnFailure]

[root@master ~]# vim mycmd.yaml---kind: PodapiVersion: v1metadata:name: mycmdspec:restartPolicy: Never # 配置保护策略containers:- name: linuximage: myos:8.5command: ["sleep"]args: ["30"][root@master ~]# kubectl delete -f mycmd.yamlpod "mycmd" deleted[root@master ~]# kubectl apply -f mycmd.yamlpod/mycmd created[root@master ~]# kubectl get pods -wNAME READY STATUSRESTARTSAGEmycmd 1/1Running0 4smycmd 0/1Completed 0 31s

3 宽限期策略(terminationGracePeriodSeconds策略)

宽限期是为了避免服务突然中断,造成的事务不一致的问题宽限期默认 30s,不等待设置为 0

[root@master ~]# kubectl delete -f mycmd.yamlpod "mycmd" deleted[root@master ~]# kubectl apply -f mycmd.yamlpod/mycmd created[root@master ~]# kubectl delete -f mycmd.yamlpod "mycmd" deleted[root@master ~]# vim mycmd.yaml---kind: PodapiVersion: v1metadata:name: mycmdspec:terminationGracePeriodSeconds: 0 # 设置宽限期restartPolicy: Nevercontainers:- name: linuximage: myos:8.5command: ["sleep"]args: ["30"][root@master ~]# kubectl apply -f mycmd.yamlpod/mycmd created[root@master ~]# kubectl delete -f mycmd.yamlpod "mycmd" deleted

4 最大生命周期(activeDeadlineSeconds策略)

循环死锁如果一个 Pod的内部程序在运行时出现循环死锁,那么就会永远不停的重复执行,如何避免这种情况发生?activeDeadlineSeconds 策略允许 Pod 运行的最大时长时间到期后会向 Pod 发送 signal,如果 Pod 无法结束就把他强制关闭,并且设置为 Error 状态

[root@master ~]# vim mycmd.yaml---kind: PodapiVersion: v1metadata:name: mycmdspec:terminationGracePeriodSeconds: 0activeDeadlineSeconds: 60 # 可以执行的最大时长restartPolicy: Nevercontainers:- name: linuximage: myos:8.5command: ["sleep"]args: ["300"][root@master ~]# kubectl delete -f mycmd.yamlpod "mycmd" deleted[root@master ~]# kubectl apply -f mycmd.yamlpod/mycmd created[root@master ~]# kubectl get pods -wmycmd 1/1Running 01smycmd 1/1Running 060smycmd 0/1Error064s

5 在Pod嵌入脚本

[root@master ~]# vim mycmd.yaml---kind: PodapiVersion: v1metadata:name: mycmdspec:terminationGracePeriodSeconds: 0restartPolicy: Alwayscontainers:- name: linuximage: myos:8.5command: ["/bin/bash"] # 调用bash函数args: # 设置命令参数- -c# 从字符串中读取命令- |# 以下多行字符串保留原格式while sleep 5;do # 脚本指令,注意缩进对齐echo "hello world."# 脚本指令,注意缩进对齐done # 脚本指令,注意缩进对齐[root@master ~]# kubectl apply -f mycmd.yaml pod/mycmd created[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmycmd 1/1Running 03s查看执行结果脚本在标准输出写入的数据可以使用 logs 查看[root@master ~]# kubectl logs mycmd hello world.hello world.hello world.

案例:自定义Pod脚本,创建一个Pod,完成以下功能
该 Pod 每隔5秒获取一次当前系统内存使用情况如果内存使用量小于1000Mi 就输出:INFO: running normally如果内存使用量大于1000Mi 就输出: WARN: high memory usage

提示:

可以使用/public/memtest.py 脚本协助完成测试

---kind: PodapiVersion: v1metadata:name: mymemspec:containers:- name: linuximage: myos:8.5command: ["/bin/bash"]args:- -c- |while sleep 5;douse=$(free -m |awk '$1=="Mem:"{print $3}')if (( ${use} < 1000 ));thenecho -e "\x1b[32mINFO:\x1b[39m running normally"elseecho -e "\x1b[31mWARN:\x1b[39m high memory usage"fidone

三 多容器 Pod

Pod 就像是豌豆英一样,它由一个或者多个容器组成Pod 是一个服务的多个进程的聚合单位同一个 Pod 共享网络IP及权限同一个 Pod 共享主机名称同一个 Pod 共享存储设备

1 创建多容器Pod

[root@master ~]# vim mynginx.yaml---kind: PodapiVersion: v1metadata:name: mynginxspec:terminationGracePeriodSeconds: 0restartPolicy: Alwayscontainers:# 容器资源是个数组,可以定义多个pod- name: nginx # 容器的名称image: myos:nginx # 启动容器使用的镜像- name: php# 容器的名称image: myos:php-fpm# 启动容器使用的镜像[root@master ~]# kubectl apply -f mynginx.yaml pod/mynginx created[root@master ~]# kubectl get podsNAMEREADY STATUS RESTARTS AGEmynginx 2/2Running 03s

2 管理多容器 Pod

受多容器配置影响,以下命令需要使用 <-c 容器名字>受到多容器影响的命令:["cp", "logs", "exec"]

# 拷贝文件到 nginx 容器[root@master ~]# echo "hello world" >hello.html[root@master ~]# kubectl cp hello.html mynginx:/usr/local/nginx/html/ -c nginx# 在php中执行命令[root@master ~]# kubectl exec mynginx -c php -- psPID TTYTIME CMD1 ? 00:00:00 php-fpm7 ? 00:00:00 ps# 查看nginx的容器日志[root@master ~]# kubectl logs mynginx -c nginx[root@master ~]#

3 排错案例

[root@master ~]# vim web2.yaml---kind: PodapiVersion: v1metadata:name: web2spec:containers:- name: httpdimage: myos:httpd- name: nginximage: myos:nginx[root@master ~]# kubectl apply -f web2.yaml pod/web2 created[root@master ~]# kubectl get pods web2NAME READY STATUS RESTARTSAGEweb2 1/2Error1 (4s ago) 8s

四 Metrics-server资源监控组件

1 概述

资源指标

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

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

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

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

2 安装

安装 Metrics-server 条件 kube-apiserver 必须启用聚合服务,或使用 kube-proxy代理转发。节点必须启用身份验证和授权。kubelet 证书需要由集群证书颁发机构签名。Metrics Server使用443、4443端口,所有节点上 kubelet必须能够访问该端口。

3 配置授权令牌并签发

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

4 安装插件 metrics

# 上传镜像到私有仓库[root@master metrics]# docker load -i metrics-server.tar.xz[root@master metrics]# docker images|while read i t _;do[[ "${t}" == "TAG" ]] && continue[[ "${i}" =~ ^"harbor:443/".+ ]] && continuedocker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}docker push harbor:443/plugins/${i##*/}:${t}docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}done# 使用资源对象文件创建服务# 修改镜像地址[root@master metrics]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' components.yaml140:image: harbor:443/plugins/metrics-server:v0.6.2# 安装插件服务[root@master metrics]# kubectl apply -f components.yaml# 验证插件 Pod 状态[root@master metrics]# kubectl -n kube-system get pods -l k8s-app=metrics-serverNAME READY STATUS RESTARTS AGEmetrics-server-ddb449849-c6lkc 1/1Running 064s

5 计算节点签发证书

# 查看节点资源指标[root@master metrics]# kubectl top nodesNAME CPU(cores) CPU% MEMORY(bytes)MEMORY%master99m 4% 1005Mi 27% node-0001 <unknown><unknown> <unknown> <unknown>node-0002 <unknown><unknown> <unknown> <unknown>node-0003 <unknown><unknown> <unknown> <unknown>node-0004 <unknown><unknown> <unknown> <unknown>node-0005 <unknown><unknown> <unknown> <unknown>#--------------- 在所有计算节点配置证书 -----------------[root@node ~]# echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml[root@node ~]# systemctl restart kubelet#--------------- 在 master 签发证书 -------------------[root@master ~]# kubectl certificate approve $(kubectl get csr -o name)certificatesigningrequest.certificates.k8s.io/csr-2hg42 approvedcertificatesigningrequest.certificates.k8s.io/csr-9gu29 approvedcertificatesigningrequest.certificates.k8s.io/csr-xhp83 approvedcertificatesigningrequest.certificates.k8s.io/csr-8k69w approvedcertificatesigningrequest.certificates.k8s.io/csr-t8799 approvedcertificatesigningrequest.certificates.k8s.io/csr-69qhz approved[root@master ~]# kubectl get certificatesigningrequests NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITIONcsr-2hg42 14m kubernetes.io/kubelet-serving master <none> Approved,Issuedcsr-9gu29 28s kubernetes.io/kubelet-serving node-0001 <none> Approved,Issuedcsr-xhp83 21s kubernetes.io/kubelet-serving node-0002 <none> Approved,Issuedcsr-69qhz 15s kubernetes.io/kubelet-serving node-0003 <none> Approved,Issuedcsr-t8799 15s kubernetes.io/kubelet-serving node-0004 <none> Approved,Issuedcsr-8k69w 15s kubernetes.io/kubelet-serving node-0005 <none> Approved,Issued

6 查看节点资源指标

资源指标 CPU资源指标MEMORY资源指标 CPU资源单位 CPU 资源的约束和请求以毫核 (m)为单位。在 k8s 中 1m是最小的调度单元,CPU 的一个核心可以看作1000m如果你有2颗 CPU,且每 CPU为4核心,那么你的 CPU资源总量就是8000m 内存资源类型 memory的约束和请求以字节为单位你可以使用以下单位来表示内存: E、P、T、G、M、k你也可以使用对应的 2的幂数: Ei、Pi、Ti、Gi、Mi、Ki例如,以下表达式所代表的是相同的值!

1k == 1000 / 1Ki == 1024

# 获取资源指标有延时,等待 15s 即可查看[root@master ~]# kubectl top nodesNAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master83m4%1789Mi50% node-0001 34m1%747Mi 20% node-0002 30m1%894Mi 24% node-0003 39m1%930Mi 25% node-0004 45m2%896Mi 24% node-0005 40m2%1079Mi29%

7 监控Pod资源指标

拷贝 memtest.py 到 master

[root@ecs-proxy s4]# rsync -av public/memtest.py 192.168.1.50:./#----- 增加执行权限 -----[root@master ~]# vim memtest.py1: #!/usr/libexec/platform-python[root@master ~]# chmod 0755 memtest.py

创建 Pod 对象

[root@master ~]# vim mylinux.yaml---kind: PodapiVersion: v1metadata:name: mylinuxspec:containers:- name: linuximage: myos:8.5command: ["awk", "BEGIN{while(1){}}"][root@master ~]# kubectl apply -f mylinux.yamlpod/mylinux created

查看 Pod 资源指标

# 查看 CPU 资源消耗[root@master ~]# kubectl top podsNAMECPU(cores) MEMORY(bytes) mylinux 999m 6Mi # 测试消耗内存资源[root@master ~]# kubectl cp memtest.py mylinux:/usr/bin/[root@master ~]# kubectl exec -it mylinux -- memtest.py 2500use memory successpress any key to exit :#--------------- 在另一个终端查看------------------------[root@master ~]# kubectl top podsNAMECPU(cores) MEMORY(bytes) mylinux 1001m 2503Mi# 实验完成以后清空所有容器[root@master ~]# kubectl delete pods --all

如果觉得《容器编排学习(五)资源对象文件》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。