Docker(二十一)--Docker k8s--Kubernetes存储--kubernetes监控

1. kubernetes容器资源限制

1.1 简介

  • Kubernetes采用request和limit两种限制类型来对资源进行分配。
    request(资源需求):即运行Pod的节点必须满足运行Pod的最基本需求才能运行Pod。
    limit(资源限额):即运行Pod期间,可能内存使用量会增加,那最多能使用多少内存,这就是资源限额。

  • 资源类型:
    CPU 的单位是核心数,内存的单位是字节。
    一个容器申请0.5个CPU,就相当于申请1个CPU的一半,你也可以加个后缀m 表示千分之一的概念。比如说100m的CPU,100豪的CPU和0.1个CPU都是一样的。
    内存单位:
    K、M、G、T、P、E #通常是以1000为换算标准的。
    Ki、Mi、Gi、Ti、Pi、Ei #通常是以1024为换算标准的。

1.2 kubernetes容器资源限制操作

1.2.1 内存限制示例

[root@server1 harbor]# docker tag  progrium/stress reg.westos.org/library/stress  ##下载镜像
[root@server1 harbor]# docker push reg.westos.org/library/stress

[root@server2 limit]# vim pod.yml
[root@server2 limit]# cat pod.yml 
apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
spec:
  containers:
  - name: memory-demo
    image: stress   ##这个镜像可以直接模拟资源的使用
    args:  
    - --vm
    - "1"
    - --vm-bytes
    - 200M            ##使用200M
    resources:
      requests:
        memory: 50Mi
      limits:
        memory: 100Mi   ##限制200M 
[root@server2 limit]# kubectl apply  -f pod.yml 
pod/memory-demo created
[root@server2 limit]# kubectl get pod
NAME          READY   STATUS      RESTARTS   AGE
memory-demo   0/1     OOMKilled   3          53s

##解释
#如果容器超过其内存限制,则会被终止。如果可重新启动,则与所有其他类型的运行时故障一样,kubelet 将重新启动它。
#如果一个容器超过其内存请求,那么当节点内存不足时,它的 Pod 可能被逐出。

在这里插入图片描述
在这里插入图片描述

1.2.2 CPU限制


## 调度失败是因为申请的CPU资源超出集群节点所能提供的资源,但CPU 使用率过高,不会被杀死
[root@server2 limit]# vim pod1.yaml 
[root@server2 limit]# cat pod1.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
spec:
  containers:
  - name: cpu-demo
    image: stress
    resources:
      limits:
        cpu: "10"
      requests:
        cpu: "5"
    args:
    - -c
    - "2"

[root@server2 limit]# kubectl apply -f pod1.yaml 
pod/cpu-demo created
[root@server2 limit]# kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE
cpu-demo   0/1     Pending   0          5s

在这里插入图片描述

在这里插入图片描述

1.2.3 为namespace设置资源限制

默认资源限制

##LimitRange 在 namespace 中施加的最小和最大内存限制只有在创建和更新 Pod 时才会被应用。改变 LimitRange 不会对之前创建的 Pod 造成影响。   
     
[root@server2 limit]# vim ns-limit.yaml
[root@server2 limit]# cat ns-limit.yaml 
apiVersion: v1
kind: LimitRange         ##limit限制
metadata:
  name: limitrange-demo
spec:
  limits:
  - default:
      cpu: 0.5
      memory: 512Mi
    defaultRequest:
      cpu: 0.1
      memory: 256Mi
    max:
      cpu: 2
      memory: 1Gi
    min:
      cpu: 0.1
      memory: 100Mi
    type: Container

[root@server2 limit]# kubectl apply -f ns-limit.yaml 
[root@server2 limit]# kubectl get limitranges 
[root@server2 limit]# kubectl describe limitranges limitrange-demo 
Name:       limitrange-demo
Namespace:  default
Type        Resource  Min    Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---    ---  ---------------  -------------  -----------------------
Container   memory    100Mi  1Gi  256Mi            512Mi          -
Container   cpu       100m   2    100m             500m           -

[root@server2 limit]# kubectl run demo --image=myapp:v1
[root@server2 limit]# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          5s
[root@server2 limit]# kubectl describe pod demo   ##查看默认分配的资源限制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

为namespace设置资源限制

  • 创建的ResourceQuota对象将在default名字空间中添加以下限制:
    每个容器必须设置内存请求(memory request),内存限额(memory limit),cpu请求(cpu request)和cpu限额(cpu limit)。
    所有容器的内存请求总额不得超过1 GiB。
    所有容器的内存限额总额不得超过2 GiB。
    所有容器的CPU请求总额不得超过1 CPU。
    所有容器的CPU限额总额不得超过2 CPU。
[root@server2 limit]# vim quota.yaml
[root@server2 limit]# cat quota.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
spec:
  hard:
    requests.cpu: "0.5"
    requests.memory: 512Mi
    limits.cpu: "2"
    limits.memory: 2Gi

[root@server2 limit]# kubectl apply -f quota.yaml 
[root@server2 limit]# kubectl get resourcequotas   ##查看状态
NAME           AGE   REQUEST                                                 LIMIT
mem-cpu-demo   10s   requests.cpu: 100m/500m, requests.memory: 256Mi/512Mi   limits.cpu: 500m/2, limits.memory: 512Mi/2Gi
[root@server2 limit]# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   1          137m
[root@server2 limit]# kubectl describe resourcequotas mem-cpu-demo   ##查看使用信息
Name:            mem-cpu-demo
Namespace:       default
Resource         Used   Hard
--------         ----   ----
limits.cpu       500m   2
limits.memory    512Mi  2Gi
requests.cpu     100m   500m
requests.memory  256Mi  512Mi


在这里插入图片描述
在这里插入图片描述

为 Namespace 配置Pod配额

[root@server2 limit]# vim quota.yaml 
[root@server2 limit]# cat quota.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
spec:
  hard:
    requests.cpu: "0.5"
    requests.memory: 512Mi
    limits.cpu: "2"
    limits.memory: 2Gi
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: pod-demo
spec:
  hard: 
    pods: "2"    ##限制2个pod
[root@server2 limit]# kubectl apply -f quota.yaml   
[root@server2 limit]# kubectl run nginx --image=myapp:v1
pod/nginx created
[root@server2 limit]# kubectl run nginx1 --image=myapp:v1   ##第三个出错
Error from server (Forbidden): pods "nginx1" is forbidden: exceeded quota: mem-cpu-demo, requested: requests.memory=256Mi, used: requests.memory=512Mi, limited: requests.memory=512Mi
[root@server2 limit]# kubectl get pod  
NAME    READY   STATUS    RESTARTS   AGE
demo    1/1     Running   1          144m
nginx   1/1     Running   0          10s


在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Docker Compose和Kubernetes(简称k8s)都是容器编排工具,但它们有以下区别: 1. 功能复杂度不同:Kubernetes是一种强大的容器编排工具,它提供了高可用性、自动伸缩、服务发现、负载均衡、存储管理等丰富的功能,可以部署大规模的容器化应用程序。而Docker Compose则更加简单,它只能用于在单个主机上定义和运行多个容器应用。 2. 部署对象不同:Docker Compose只能部署单个主机上的多个容器应用,而Kubernetes可以部署跨多个主机的容器应用,实现更大规模的应用程序。 3. 部署方式不同:Docker Compose使用的是“声明式”方式定义和运行多个容器应用,它通过编写docker-compose.yml文件来定义容器应用之间的依赖关系和启动顺序。而Kubernetes则采用“控制器”和“副本集”来管理容器应用,可以自动监控和维护应用程序的状态。 4. 社区支持不同:Kubernetes是由Google开源并维护的,得到了广泛的社区支持和贡献,其生态系统也相对成熟。而Docker Compose则由Docker公司维护,社区支持相对较少,但因为其简单易用而被广泛使用。 总之,Docker Compose适用于简单的单机容器应用场景,而Kubernetes则适用于复杂的分布式容器应用场景。 ### 回答2: Docker Compose和Kubernetes(简称为K8s)是用于管理容器化应用程序的工具。尽管它们都用于容器编排,但它们在设计目标、架构和使用方式上有一些区别。 Docker Compose是一个用于定义和运行多个Docker容器的工具。它通过一个YAML文件来描述应用程序的服务、网络和存储等组件。使用Docker Compose可以方便地在单个主机上定义和处理容器之间的关系。它适用于本地开发环境和小型应用场景,简化了本地开发和测试过程。然而,Docker Compose对于处理大型分布式系统以及容器的自动伸缩和动态调度方面的支持相对较弱。 Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。它使用类似于Docker Compose的YAML文件来定义应用程序的组件,但其范围更广,可以管理多个主机上的容器。Kubernetes具有强大的容器编排和管理功能,可以自动分配资源、实现服务发现和负载均衡,保证应用程序的高可用性和容错性。它适用于大规模、复杂的微服务架构和容器化应用程序。 总结而言,Docker Compose适合本地开发和简单应用场景,而Kubernetes适合大规模部署和复杂应用场景。Docker Compose更加轻量简单,而Kubernetes更强大而复杂,具有更多的自动化和可扩展性。选择哪个工具取决于应用的规模和要求。有时候,这两个工具也可以结合使用,使用Docker Compose来开发和测试,然后将其转换为Kubernetes部署。 ### 回答3: Docker Compose和Kubernetes(简称k8s)是两种不同的容器编排工具,用于管理和部署容器化应用程序。以下是它们之间的区别: 1. 范围和复杂性:Docker Compose是一个单主机编排工具,适用于小型和中型应用程序的单节点部署。它使用YAML文件定义应用程序服务和它们的配置,并通过命令行工具实现应用程序的构建和管理。相比之下,Kubernetes是一个集群管理系统,用于部署和管理多个容器化应用程序。它具有更高的可扩展性和容错性,并具备自我修复和自动伸缩的特性。 2. 网络和存储Docker Compose提供了简便的网络和存储配置选项,适用于单主机部署。它使用Docker网络和卷来实现应用程序内的通信和持久化存储。而Kubernetes则提供了更高级的网络和存储功能,支持负载均衡、服务发现和动态卷分配等特性,适用于多主机集群环境。 3. 自动化和管理:Kubernetes具有更高级的自动化管理功能,包括自动故障恢复和自动扩展等特性。它可以根据容器的资源需求和负载情况进行自动伸缩,并自动重新启动失败的容器。而Docker Compose则需要手动管理应用程序的生命周期和故障恢复。 4. 生态系统和集成:Kubernetes作为一个完整的容器编排平台,拥有庞大的生态系统和广泛的集成支持。它具备与各种云提供商、监控工具、日志记录系统等集成的能力。对于需要在多云环境上部署应用程序的企业来说,Kubernetes是一个更加强大和灵活的解决方案。相比之下,Docker Compose的集成选项较少,更适用于简单的本地开发和测试环境。 综上所述,Docker Compose适用于单主机环境下的简单应用程序部署,而Kubernetes则适用于复杂的多主机集群环境,具备更高级的自动化和管理功能。选择使用哪个工具取决于应用程序的规模和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Studying!!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值