容器
容器_Docker ( 05 )
Kubernetes 资源对象管理
资源对象文件
模板与帮助信息
- 资源对象文件优势
- 命令无法实现高级复杂的功能
- 某些资源对象使用命令无法创建
- 方便管理 , 保存 , 追溯历史
- 资源对象文件太长 , 记不住怎么办
- 使用命令创建模板
- 查询帮助信息
- 查询官方手册
生成资源对象模板
- 资源对象 Pod 模板使用 run 生成
# 获取 Pod 模板 [root@master ~]# kubectl run myweb --image=myos:nginx --dry-run=client -o yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: myweb name: myweb spec: containers: - image: myos:nginx name: myweb resources: {} dnsPolicy: ClusterFirst restartPolicy: Always status: {}
创建资源对象模板
- 除了Pod外 , 其他资源对象模板使用 create 生成
- 生成模板命令 : -dry-run=client -o yaml
# 获取资源对象模板 [root@master ~]# kubectl create namespace work --dry-run=client -o yaml apiVersion: v1 kind: Namespace metadata: creationTimestamp: null name: work spec: {} status: {}
资源文件参数查询
- 使用 “.” 分割层级结构关系
- 是以 explain 资源对象 + 层级关系
# 查询帮助信息 [root@master ~]# kubectl explain Pod.spec.restartPolicy KIND: Pod VERSION: v1 FIELD: restartPolicy 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-policy Possible enum values: - `"Always"` - `"Never"` - `"OnFailure"`
资源对象文件
[root@master ~]# mkdir app [root@master ~]# cd app [root@master app]# vim nginx.yaml --- kind: Pod apiVersion: v1 metadata: name: nginx spec: containers: - name: nginx image: myos:nginx [root@master app]# vim phpfpm.yaml --- kind: Pod apiVersion: v1 metadata: name: php spec: containers: - name: php image: myos:php-fpm
使用资源对象文件管理
- 多个文件可以使用 --作为分隔符 , 合并管理
[root@master app]# ls nginx.yaml phpfpm.yaml # 使用资源对象文件创建应用 [root@master app]# kubectl apply -f nginx.yaml -f phpfpm.yaml pod/nginx created pod/php created # 删除应用 [root@master app]# kubectl delete -f /root/app/ pod "nginx" deleted pod "php" deleted # 合并资源对象文件 [root@master app]# cat nginx.yaml >>app.yaml [root@master app]# cat phpfpm.yaml >>app.yaml # 创建资源对象 [root@master ~]# kubectl apply -f app.yaml pod/nginx created pod/php created # 删除资源对象 [root@master ~]# kubectl delete -f app.yaml pod "nginx" deleted pod "php" deleted
自定义命令
- Pod自定义命令
- 创建 Pod时 , 可以为其设置启动时要执行的自定义命令 , 如果配置了自定义命令 , 那么镜像中自带的默认启动命令不再执行
- 自定义命令设置在 command 字段下 , 如果要命令有参数 , 就填写在 args下
- 例 : 执行sleep 30的自定义命令
[root@master ~]# vim mycmd.yaml --- kind: Pod apiVersion: v1 metadata: name: mycmd spec: containers: - name: linux image: myos:8.5 command: ["sleep"] # 自定义命令 args: ["30"] # 自定义命令参数
容器保护策略
- restarPolicy 策略
- Pod会根据策略决定容器结束后是否重启
- Always | Never | OnFailure
[root@master ~]# vim mycmd.yaml --- kind: Pod apiVersion: v1 metadata: name: mycmd spec: restartPolicy: Never # 配置保护策略 containers: - name: linux image: myos:8.5 command: ["sleep"] args: ["30"]
宽限期策略
- terminationGracePeriodSeconds 策略
- 宽限期是为了避免服务突然中断 , 造成的事务不一致的问题
- 宽限期默认 30s , 不等待设置为 0
[root@master ~]# kubectl delete -f mycmd.yaml pod "mycmd" deleted [root@master ~]# kubectl apply -f mycmd.yaml pod/mycmd created [root@master ~]# kubectl delete -f mycmd.yaml pod "mycmd" deleted [root@master ~]# vim mycmd.yaml --- kind: Pod apiVersion: v1 metadata: name: mycmd spec: terminationGracePeriodSeconds: 0 # 设置宽限期 restartPolicy: Never containers: - name: linux image: myos:8.5 command: ["sleep"] args: ["30"]
最大生命周期
- activeDeadlineSeconds 策略
- 循环死锁
- 如果一个 Pod内部程序在运行时出现循环死锁 , 那么就会永远不停的重复执行
- activeDeadlineSeconds 策略
- 允许 Pod 运行的最大时长
- 时间到期后会向 Pod 发送 signal , 如果 Pod无法结束就强制关闭 , 并设置为 Error 状态
[root@master ~]# vim mycmd.yaml --- kind: Pod apiVersion: v1 metadata: name: mycmd spec: terminationGracePeriodSeconds: 0 activeDeadlineSeconds: 60 # 可以执行的最大时长 restartPolicy: Never containers: - name: linux image: myos:8.5 command: ["sleep"] args: ["300"]
自定义命令进阶
yaml 多行表达式
# 最终结果为 [01234 空格 56789] --- string1: > 01234 56789 # 最终结果为 [01234 换行 56789] --- string1: | 01234 56789
在Pod中嵌入脚本
[root@master ~]# vim mycmd.yaml --- kind: Pod apiVersion: v1 metadata: name: mycmd spec: terminationGracePeriodSeconds: 0 restartPolicy: Always containers: - name: linux image: myos:8.5 command: ["/bin/bash"] # 调用bash命令 args: # 设置命令参数 - -c # 从字符串中读取命令 - | # 以下多行字符串保留原格式 while sleep 5;do # 脚本指令 , 注意缩进对齐 echo "hello world." done
- 脚本在标准输出写入的数据可以使用log查看
mycmd 1/1 Running 0 3s [root@master ~]# kubectl logs mycmd hello world. hello world. hello world.
多容器Pod
创建多wrongdoingPod
[root@master ~]# vim mynginx.yaml --- kind: Pod apiVersion: v1 metadata: name: mynginx spec: terminationGracePeriodSeconds: 0 restartPolicy: Always containers: # 容器资源是个数组 , 可以定义多个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 pods
管理多容器 Pod
- 受多容器配置影响 , 以下命令需要使用
- 受影响命令 : [logs , exec , cp]
[root@master ~]# echo "hello world" >hello.html [root@master ~]# kubectl cp hello.html mynginx:/usr/local/nginx/html/ -c nginx [root@master ~]# kubectl exec mynginx -c php -- ps PID TTY TIME CMD 1 ? 00:00:00 php-fpm 7 ? 00:00:00 ps [root@master ~]# kubectl logs mynginx -c nginx
资源监控工具
资源指标概述
- 在安装部署程序之后 , 必须要了解应用程序在部署后的性能以及资源使用情况 , 可以通过检测 Pod容器或节点来了解整个集群的情况
- Kubernetes的Metrics-server组件提供有关节点和 Pod的资源使用情况的信息 , 包括 CPU和内存的指标 . 如果将Metrics-server部署到集群中 , 就可以查询并使用到这些信息管理应用及服务
Metrics组件安装
- Metrics-server是什么
- Metrics-server是集群核心监控数据的聚合器
- 通过 kublete 获取 node 和 Pod 的CPU , 内存等监控数据 , 为调度器 , 弹性控制器 , 以及 Dashboard等UI组件提供数据来源
- 安装条件
- kube-apiserver 必须启用聚合服务 , 或使用 kube-proxy代理转发
- 节点必须启用身份验证和授权 , kubelet证书需要由集群证书颁发机构签名
- 使用 443端口 , 4443端口 , 所有节点上的 kubelet 必须能够访问该端口
配置授权令牌
[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 CONDITION csr-2hg42 14s kubernetes.io/kubelet-serving system:node:master Pending [root@master ~]# kubectl certificate approve csr-2hg42 certificatesigningrequest.certificates.k8s.io/csr-2hg42 approved [root@master ~]# kubectl get certificatesigningrequests NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION csr-2hg42 28s kubernetes.io/kubelet-serving system:node:master
安装插件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/".+ ]] && continue docker 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: )(.*/)?(.+),harbor:443/plugins/,' components.yaml 140: 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-server NAME READY STATUS RESTARTS AGE metrics-server-ddb449849-c6lkc 1/1 Running 0 64s
计算节点签发证书
# 查看节点资源指标 [root@master metrics]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master 99m 4% 1005Mi 27% node-0001 node-0002 node-0003 node-0004 node-0005 #--------------- 在所有计算节点配置证书 ----------------- [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 approved certificatesigningrequest.certificates.k8s.io/csr-9gu29 approved certificatesigningrequest.certificates.k8s.io/csr-xhp83 approved certificatesigningrequest.certificates.k8s.io/csr-8k69w approved certificatesigningrequest.certificates.k8s.io/csr-t8799 approved certificatesigningrequest.certificates.k8s.io/csr-69qhz approved [root@master ~]# kubectl get certificatesigningrequests NAME AGE SIGNERNAME REQUESTOR CONDITION csr-2hg42 14m kubernetes.io/kubelet-serving master Approved,Issued csr-9gu29 28s kubernetes.io/kubelet-serving node-0001 Approved,Issued csr-xhp83 21s kubernetes.io/kubelet-serving node-0002 Approved,Issued csr-69qhz 15s kubernetes.io/kubelet-serving node-0003 Approved,Issued csr-t8799 15s kubernetes.io/kubelet-serving node-0004 Approved,Issued csr-8k69w 15s kubernetes.io/kubelet-serving node-0005 Approved,Issued
查看节点资源指标
# 获取资源指标有延时,等待 15s 即可查看 [root@master ~]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master 83m 4% 1789Mi 50% node-0001 34m 1% 747Mi 20% node-0002 30m 1% 894Mi 24% node-0003 39m 1% 930Mi 25% node-0004 45m 2% 896Mi 24% node-0005 40m 2% 1079Mi 29%
监控资源指标
- 资源指标
- CPU 资源指标
- MEMORY 资源指标
- CPU资源单位
- CPU资源的约束和请求以豪核(m)为单位 . 在 k8s 中 1m 是最小的调度单元 , CPU的一个核心可以看作1000m
- 内存资源类型
- memory的约束和请求以字节为单位
- 可以使用 E , P , T , G , M , K 或 Ei , Pi , Ti , Gi , Mi , Ki
创建Pod并获取监控指标
- 拷贝 memtest.py 到 master
[root@ecs-proxy s4]# rsync -av public/memtest.py 192.168.1.50:./ #-------------------- 增加执行权限 -------------------- [root@master ~]# vim memtest.py 1: #!/usr/libexec/platform-python [root@master ~]# chmod 0755 memtest.py
- 创建 Pod 对象
[root@master ~]# vim mylinux.yaml --- kind: Pod apiVersion: v1 metadata: name: mylinux spec: containers: - name: linux image: myos:8.5 command: ["awk", "BEGIN{while(1){}}"] [root@master ~]# kubectl apply -f mylinux.yaml pod/mylinux created
- 查看 Pod 资源指标
# 查看 CPU 资源消耗 [root@master ~]# kubectl top pods NAME CPU(cores) MEMORY(bytes) mylinux 999m 6Mi # 测试消耗内存资源 [root@master ~]# kubectl cp memtest.py mylinux:/usr/bin/ [root@master ~]# kubectl exec -it mylinux -- memtest.py 2500 use memory success press any key to exit : #--------------- 在另一个终端查看------------------------ [root@master ~]# kubectl top pods NAME CPU(cores) MEMORY(bytes) mylinux 1001m 2503Mi # 实验完成以后清空所有容器 [root@master ~]# kubectl delete pods --all
- 查看 Pod 资源指标
- 创建 Pod 对象
- 拷贝 memtest.py 到 master
- 资源指标
- Metrics-server是什么
- 脚本在标准输出写入的数据可以使用log查看
- 循环死锁
- activeDeadlineSeconds 策略
- terminationGracePeriodSeconds 策略
- restarPolicy 策略
- Pod自定义命令
- 多个文件可以使用 --作为分隔符 , 合并管理
- 是以 explain 资源对象 + 层级关系
- 使用 “.” 分割层级结构关系
- 资源对象 Pod 模板使用 run 生成
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...