容器_Docker ( 06 )

容器_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
  • 受多容器配置影响 , 以下命令需要使用 < -c 容器名字>

  • 受影响命令 : [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容器或节点来了解整个集群的情况
  • KubernetesMetrics-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   <none>              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   <none>    
安装插件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: )(.*/)?(.+),\1harbor:443/plugins/\3,' 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   <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 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 , KEi , 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

相关推荐
SelectDB17 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn866 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker