云端技术驾驭DAY11——资源对象文件、Pod自定义命令、多容器Pod、资源监控工具

本文详细介绍了云端技术中Kubernetes的核心概念,如资源对象管理(包括Pod、命名空间等)、YAML模板、自定义命令、资源指标监控(如Metrics组件)以及多容器Pod的部署和管理。教程涵盖了从基础操作到高级功能的实战指南。
摘要由CSDN通过智能技术生成

往期回顾:
云端技术驾驭DAY01——云计算底层技术奥秘、云服务器磁盘技术、虚拟化管理、公有云概述
云端技术驾驭DAY02——华为云管理、云主机管理、跳板机配置、制作私有镜像模板
云端技术驾驭DAY03——云主机网站部署、web集群部署、Elasticsearch安装
云端技术驾驭DAY04——Logstash安装部署及插件模块
云端技术驾驭DAY06——容器技术概述、镜像与容器管理、定制简单镜像、容器内安装部署服务
云端技术驾驭DAY07——Dockerfile详解、容器镜像制作、私有仓库
云端技术驾驭DAY08——部署容器服务、Compose微服务管理、harbor仓库部署及管理
云端技术驾驭DAY09——k8s集群安装部署、calico插件部署、计算节点配置管理
云端技术驾驭DAY10——kubectl命令详解、Pod创建过程、Pod的生命周期、定制Pod、资源对象文件

K8S资源对象管理

资源对象文件

  • 资源对象优势
    • 命令无法实现高级复杂的功能
    • 某些资源对象使用命令无法创建
    • 方便管理、保存、追溯历史
  • 资源对象文件太长,记不住怎么办?
    • 使用命令创建模板
    • 查询帮助信息
    • 查询官方手册
模板与帮助信息
  • 如何生成资源对象模板
    • 资源对象Pod模板使用run生成
[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 资源对象+层级关系
apiVersion: v1                            // 一级,可以表示为:.kind
kind: Pod                                 // 一级,可以表示为:.apiVersion
metadata:
  name: myweb                             // 二级,可以表示为:.metadata.name
spec:
  restartPolicy: Always
  containers:
  - image: myos:nginx
    name: myweb                           // 三级,可以表示为:.spec.containers.name
status: {}
[root@master ~]# kubectl explain Pod.spec.restartPolicy
KIND:     Pod
VERSION:  v1

FIELD:    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-policy

     Possible enum values:
     - `"Always"`
     - `"Never"`
     - `"OnFailure"`
  • 管理资源对象文件
[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
自定义命令
  • Pod自定义命令
    • 创建Pod时,可以为其设置启动时要执行的自定义命令,如果配置了自定义命令,那么镜像中自带的默认启动命令将不再执行
    • 自定义命令设置再command字段下,如果要命令有参数,就填写在args字段下
kind: Pod
apiVersion: v1
metadata:
  name: mycmd
spec:
  containers:
  - name: linux
    image: myos:8.5
    command: ["sleep"]  // 自定义命令
    args: ["30"]        // 自定义命令参数
  • restartPolicy策略
    • Pod会根据策略决定容器结束后是否重启
    • 重启【Always】,不重启【Never】,失败就重启【OnFailure】
---
kind: Pod
apiVersion: v1
metadata:
  name: mycmd
spec:
  restartpolicy: Nerver
  containers:
  - name: linux
    image: myos:8.5
    command: ["sleep"]
    args: ["30"]
  • terminationGracePeriodSeconds策略
    • 宽限期是为了避免服务突然中断,造成的事务不一致的问题
... ...
spec:
  restartpolicy: Nerver
  terminationGracePeriodSeconds: 0
... ...
  • 循环死锁
    • 如果一个Pod的内部程序在运行时出现循环死锁,那么就会永远不停地重复运行,如何避免这种情况的发生?
  • activeDeadlineSeconds策略
    • 允许Pod运行的最大时长
    • 时间到期后会向Pod发送signal,如果Pod无法结束就把它强制关闭,并且设置为Error状态
... ...
spec:
  restartpolicy: Nerver
  terminationGracePeriodSeconds: 0
  activeDeadlineSeconds: 60
... ...
自定义命令进阶
  • 如何执行复杂命令?
    • Yaml多行表达式
---
string: >                    // 最终结果为 01234 空格 56789
  01234
  56789

---
string: |                    // 最终结果为 01234 换行 56789
  01234
  56789
  • 在Pod中嵌入脚本
[root@master ~]# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: mycmd
spec:
  restartPolicy: Always
  terminationGracePeriodSeconds: 0
  containers:
  - name: linux
    image: myos:8.5
    command: ["/bin/bash"]
    args:
    - -c    
    - |
      while sleep 5;do
        echo "hello world."
      done
[root@master ~]# kubectl apply -f mycmd.yaml 
pod/mycmd created
[root@master ~]# kubectl logs mycmd
hello world.
hello world.
hello world.
hello world.
hello world.
  • 案例:创建一个Pod,完成以下功能
    • 该Pod每隔5秒获取一次当前系统内存使用情况
    • 如果内存使用量小于1000Mi 就输出:“INFO:running normally”
    • 如果内存使用量大于1000Mi 就输出:“WARN:high memory usage”
[root@master ~]# vim memtest.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: mymem
spec:
  containers:
  - name: linux
    image: myos:8.5
    command: ["/bin/bash"]
    args:
    - -c
    - |
      while sleep 5;do
          use=$(free -m |awk '$1=="Mem:"{print $3}')             // 获取free -m命令第三列的值
          if  (( ${use} < 1000 ));then
              echo -e "\x1b[32mINFO:\x1b[39m running normally"
          else
              echo -e "\x1b[31mWARN:\x1b[39m high memory usage"
          fi
      done
[root@master ~]# kubectl apply -f memtest.yaml 
pod/mymem created
多容器Pod
[root@master ~]# vim myweb.yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: myweb
spec:
  containers:
  - name: nginx                                // 容器资源是个数组,可以定义多个Pod
    image: myos:nginx
  - name: php
    image: myos:php-fpm
[root@master ~]# kubectl apply -f myweb.yaml 
pod/myweb created
[root@master ~]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
myweb   2/2     Running   0          66s       // 可以看到这边变成2/2
  • 管理多容器Pod
    • 受多容器配置影响,logs exec cp命令需要使用-c 容器名字
[root@master ~]# kubectl logs myweb -c nginx
[root@master ~]# kubectl logs myweb -c php
[root@master ~]# kubectl exec -it myweb -c nginx -- pstree -p
nginx(1)-+-nginx(6)
         `-nginx(7)
[root@master ~]# kubectl exec -it myweb -c php -- pstree -p
php-fpm(1)

资源指标监控

资源监控工具

资源指标概述
  • 资源指标有什么用?
    • 在安装部署程序后,必须要了解应用程序在部署后的性能以及资源使用情况。你可以通过检测Pod容器或节点来了解整个集群的情况
  • 如何监控资源指标?
    • Kubernetes的Metric-server组件提供有关节点和Pod的资源使用情况的信息,包括CPU和内存的指标。如果将Metrics-server部署到集群中,就可以查询并使用到这些信息管理应用及服务
Metrics组件安装
  • Metric-server是什么?
    • Metric-server是集群核心监控数据的聚合器。通俗的说,它存储了集群中各个节点和Pod的监控数据,并且提供了API以供查询和使用
    • Metric-server通过kubelet获取node和Pod的CPU、内存等监控数据。为调度器、弹性控制器以及Dashboard等UI组件提供数据来源
  • 安装Metric-server条件
    • Kube-apiserver必须启用聚合服务,或使用kube-proxy代理转发
    • 节点必须启用身份验证和授权。Kubelet证书需要由集群证书颁发机构签名
    • Metric-server使用443、4443端口,所有节点上kubelet必须能够访问该端口
  • 启用引导令牌并签发
[root@master ~]# echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml
[root@master ~]# systemctl restart kubelet
[root@master ~]# kubectl get certificatesigningrequests.certificates.k8s.io 
NAME        AGE   SIGNERNAME                      REQUESTOR            REQUESTEDDURATION   CONDITION
csr-cqxwb   12s   kubernetes.io/kubelet-serving   system:node:master   <none>              Pending
[root@master ~]# kubectl certificate approve csr-cqxwb
certificatesigningrequest.certificates.k8s.io/csr-cqxwb approved
[root@master ~]# kubectl get certificatesigningrequests.certificates.k8s.io 
NAME        AGE   SIGNERNAME                      REQUESTOR            REQUESTEDDURATION   CONDITION
csr-cqxwb   71s   kubernetes.io/kubelet-serving   system:node:master   <none>              Approved,Issued
  • 安装metrics插件
[root@master ~]# cd plugins/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
The push refers to repository [harbor:443/plugins/metrics-server]
dc5ecd167a15: Pushed 
9fce6bd02a21: Mounted from k8s/etcd
... ...

[root@master metrics]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' components.yaml
140:     image: harbor:443/plugins/metrics-server:v0.6.2

[root@master metrics]# kubectl apply -f components.yaml
[root@master metrics]# kubectl -n kube-system get pods -l k8s-app=metrics-server
NAME                              READY   STATUS    RESTARTS   AGE
metrics-server-78c894fc74-ztptk   1/1     Running   0          104s
  • 计算节点签发证书
[root@master metrics]# kubectl top nodes                                               // 查看节点资源指标
NAME        CPU(cores)   CPU%        MEMORY(bytes)   MEMORY%     
master      88m          4%          1771Mi          51%         
node-0004   <unknown>    <unknown>   <unknown>       <unknown>   
node-0005   <unknown>    <unknown>   <unknown>       <unknown>   
node-0001   <unknown>    <unknown>   <unknown>       <unknown>   
node-0002   <unknown>    <unknown>   <unknown>       <unknown>   
node-0003   <unknown>    <unknown>   <unknown>       <unknown>
[root@node-0001 ~]# echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml     // 在所有计算节点上配置证书
[root@node-0001 ~]# systemctl restart kubelet.service
[root@master ~]# kubectl certificate approve $(kubectl get csr -o name)                // 在master上签发证书
certificatesigningrequest.certificates.k8s.io/csr-6kmwm approved
certificatesigningrequest.certificates.k8s.io/csr-7ftlc approved
certificatesigningrequest.certificates.k8s.io/csr-82hwq approved
certificatesigningrequest.certificates.k8s.io/csr-cqxwb approved
certificatesigningrequest.certificates.k8s.io/csr-gmfzp approved
certificatesigningrequest.certificates.k8s.io/csr-smxrj approved
[root@master ~]# kubectl get certificatesigningrequests
NAME        AGE     SIGNERNAME                      REQUESTOR               REQUESTEDDURATION   CONDITION
csr-6kmwm   24s     kubernetes.io/kubelet-serving   system:node:node-0005   <none>              Approved,Issued
csr-7ftlc   36s     kubernetes.io/kubelet-serving   system:node:node-0004   <none>              Approved,Issued
csr-82hwq   66s     kubernetes.io/kubelet-serving   system:node:node-0002   <none>              Approved,Issued
csr-cqxwb   48m     kubernetes.io/kubelet-serving   system:node:master      <none>              Approved,Issued
csr-gmfzp   52s     kubernetes.io/kubelet-serving   system:node:node-0003   <none>              Approved,Issued
csr-smxrj   2m55s   kubernetes.io/kubelet-serving   system:node:node-0001   <none>              Approved,Issued
  • 查看节点资源指标
[root@master ~]# kubectl top nodes
NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master      70m          3%     1823Mi          52%       
node-0001   31m          1%     650Mi           18%       
node-0002   28m          1%     596Mi           17%       
node-0003   30m          1%     673Mi           19%       
node-0004   29m          1%     636Mi           18%       
node-0005   33m          1%     701Mi           20%
监控资源指标
  • 资源指标

    • CPU资源指标
    • MEMORY资源指标
  • CPU资源单位

    • CPU资源的约束和请求以毫核(m)为单位。在k8s中1m是最小调度单元,CPU的一个核心可以看作1000m
    • 如果你有2颗CPU,且每CPU为4核心,那么你的CPU资源总量就是8000m
  • 内存资源单位

    • 内存的约束和请求以字节为单位
    • 也可以使用一下单位来表示内存:E、P、T、G、M、k
    • 也可以使用对应的2的幂数:Ei、Pi、Ti、Gi、Mi、ki
    • 1k == 1000 1ki == 1024
  • 创建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资源指标
[root@master ~]# kubectl top pods           // 查看pods资源消耗
NAME      CPU(cores)   MEMORY(bytes)   
mylinux   997m         0Mi
[root@master ~]# vim memtest.py             // 写一个内存测试的脚本
#!/usr/libexec/platform-python
import sys
if len(sys.argv) == 2:
   try:
     n = int(sys.argv[1])
   except ValueError:
     n = 10000
   if n > 9999:
      print("number range 1 ~ 9999")
   else:
      memlist, memstr = [], ' ' * 1024 * 1024
      memlist.append(memstr * n)
      _ = input('use memory success\npress any key to exit : ')
else:
   print("%s number (MB)" % sys.argv[0])
[root@master ~]# chmod +x memtest.py
[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   997m         2509Mi
  • 43
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值