• 容器_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: {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    创建资源对象模板
    • 除了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: {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    资源文件参数查询
    • 使用 “.” 分割层级结构关系

    请添加图片描述

    • 是以 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"`
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    资源对象文件
    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    使用资源对象文件管理
    • 多个文件可以使用 --作为分隔符 , 合并管理
    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    自定义命令
    • 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"]        # 自定义命令参数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    容器保护策略
    • 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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    宽限期策略
    • 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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    最大生命周期
    • 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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    自定义命令进阶
    yaml 多行表达式
    # 最终结果为 [01234 空格 56789]
    ---
    string1: >
    	01234
    	56789
    
    # 最终结果为 [01234 换行 56789]
    ---
    string1: |
    	01234
    	56789
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 脚本在标准输出写入的数据可以使用log查看
    mycmd   1/1     Running   0          3s
    [root@master ~]# kubectl logs mycmd 
    hello world.
    hello world.
    hello world.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    多容器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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    管理多容器 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    资源监控工具

    资源指标概述
    • 在安装部署程序之后 , 必须要了解应用程序在部署后的性能以及资源使用情况 , 可以通过检测 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                 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       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    安装插件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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    计算节点签发证书
    # 查看节点资源指标
    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    查看节点资源指标
    # 获取资源指标有延时,等待 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%
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    监控资源指标
    • 资源指标
      • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 创建 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 查看 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    【C++】C++基础知识(五)---数组
    登录框Tricks
    CF821 A. Consecutive Sum
    Python双人五子棋
    macOS 和 Linux 有什么区别?
    Peer Dependency 一些使用场景的归纳总结
    photoshop如何使用PS中的吸管工具吸取软件外部的颜色?
    【力扣】27. 移除元素
    SpringMVC跳转
    【springboot】自定义starter(学习笔记)
  • 原文地址:https://blog.csdn.net/2401_82773077/article/details/136271302