容器

03-05 9565阅读 0评论

容器_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: {}
            
            资源文件参数查询
            • 使用 “.” 分割层级结构关系

              容器 第1张

              • 是以 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
                                                                

免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,9565人围观)

还没有评论,来说两句吧...

目录[+]