图片

在上一篇中经过多次测试cpu和内存的结果,我脑海中有了一个想法,到底cpu和内存有没有什么关系呢?在哪种情况下他是最稳定的服务呢?在资源发生抢占的时候,会优先kill掉哪些服务?心里有这些疑惑的我,继续研究下。

图片

服务的“可靠性”

图片

这个最好还是设置下,因为万一某些本该特别稳固的服务,因为没有配置而被down了,就得不偿失了。

limit-range

设想一下,当我们有服务器只有10个G的内存,但是有个人他创建了一个pod,配置的request为8G,但是实际上他运行的pod只占用了1个G的内存,我们有没有什么方式避免这种情况呢?还是说我们只能画个圈圈诅咒他?

亦或者他的requests配置的1G,limit配置的10G,这种情况是不是也不是很合适,而且光从配置上看,你无法确认这个服务到底要占用多少的资源。

所以k8s引入了一个概念,就叫做limitrange,资源范围限制。

[root@node1 ~]# cd namespace/
[root@node1 namespace]# mkdir limitrange
[root@node1 namespace]# cd limitrange/
[root@node1 limitrange]# vim limits-test.yaml 
apiVersion: v1
kind: LimitRange
metadata:
  name: test-limits
spec:
  limits:
  - max:
      cpu: 2000m
      memory: 1Gi
    min:
      cpu: 100m
      memory: 100Mi
    maxLimitRequestRatio:
      cpu: 3
      memory: 2
    type: Pod
  - default:
      cpu: 300m
      memory: 200Mi
    defaultRequest:
      cpu: 200m
      memory: 100Mi
    max:
      cpu: 2000m
      memory: 700Mi
    min:
      cpu: 100m
      memory: 100Mi
    maxLimitRequestRatio:
      cpu: 5
      memory: 4
    type: Container
[root@node1 limitrange]# kubectl create ns test  # 新建一个命名空间
namespace/test created
[root@node1 limitrange]# kubectl apply -f limits-test.yaml -n test
limitrange/test-limits created
[root@node1 limitrange]# kubectl describe limits -n test
Name:       test-limits
Namespace:  test
Type        Resource  Min    Max    Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---    ---    ---------------  -------------  -----------------------
Pod         cpu       100m   2      -                -              3
Pod         memory    100Mi  1Gi    -                -              2
Container   cpu       100m   2      200m             300m           5
Container   memory    100Mi  700Mi  100Mi            200Mi          4
[root@node1 limitrange]# 

从上面可以看到我们对于这个命名空间的限制时生效了,那么接下来我们做个测试看看呢。

1、创建一个不设置资源限额的服务。

[root@node1 limitrange]# vim web-test.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: test
spec:
  selector:
    matchLabels:
      app: web-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
      - name: web-demo
        image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
        ports:
        - containerPort: 8080
[root@node1 limitrange]# kubectl apply -f web-test.yaml 
[root@node1 limitrange]# kubectl get pod web-demo-774f645c57-fn45g -n test -o yaml
# 省略部分信息输出
containers:
  - image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
    imagePullPolicy: IfNotPresent
    name: web-demo
    ports:
    - containerPort: 8080
      protocol: TCP
    resources:
      limits:
        cpu: 300m
        memory: 200Mi
      requests:
        cpu: 200m
        memory: 100Mi
[root@node1 limitrange]# 
# 可以看到就算不配置内存和cpu,也会按照我们默认的来配置
# 且这个配置是针对的pod,并不是deployment

2、创建下超过我们限制的内存和cpu比例的看看呢。

[root@node1 limitrange]# vim web-test.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: test
spec:
  selector:
    matchLabels:
      app: web-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
      - name: web-demo
        image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: 100Mi
            cpu: 100m
          limits:
            memory: 1000Mi
            cpu: 2000m
[root@node1 limitrange]# 
[root@node1 limitrange]# kubectl apply -f web-test.yaml 
deployment.apps/web-demo configured
[root@node1 limitrange]# 
[root@node1 limitrange]# kubectl get deploy -n test
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
web-demo   1/1     0            1           20m
[root@node1 limitrange]# # 可以看到他的状态不对哈,我们看下他的yaml
[root@node1 limitrange]# kubectl get deploy -n test -o yaml
# 省略部分信息
      message: 'pods "web-demo-75d76bbf6f-zv9kp" is forbidden: [cpu max limit to request
        ratio per Pod is 3, but provided ratio is 20.000000, memory max limit to request
        ratio per Pod is 2, but provided ratio is 10.000000, maximum memory usage
        per Container is 700Mi, but limit is 1000Mi, cpu max limit to request ratio
        per Container is 5, but provided ratio is 20.000000, memory max limit to request
        ratio per Container is 4, but provided ratio is 10.000000]'
      reason: FailedCreate
# 可以看到有个message,提示我们比例不符合,说明比例也是验证过了。

3、测试一下配置超限。

[root@node1 limitrange]# vim web-test.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: test
spec:
  selector:
    matchLabels:
      app: web-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
      - name: web-demo
        image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: 1000Mi
            cpu: 2000m
          limits:
            memory: 1000Mi
            cpu: 2000m
[root@node1 limitrange]# kubectl apply -f web-test.yaml 
deployment.apps/web-demo configured
[root@node1 limitrange]# 
[root@node1 limitrange]# kubectl get deploy -n test
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
web-demo   1/1     0            1           27m
[root@node1 limitrange]# 
[root@node1 limitrange]# kubectl get deploy -n test -o yaml
message: 'pods "web-demo-7f68c7bd89-2hf9z" is forbidden: maximum memory usage
        per Container is 700Mi, but limit is 1000Mi'
      reason: FailedCreate
# 提示我们允许的最大是700M,但是我们创建了1000M,就不合适
[root@node1 limitrange]#

总结下对于limitrange验证结果。

图片

ResourceQuota

还有一种情况是这个集群被很多team所使用,但是有一个team不讲武德,运行了很多服务,这个时候会不会把其他team的资源占用完了呢,这个时候k8s就引入了一个ResourceQuota(资源配额)的概念来避免这种情况
剩余内容请转至VX公众号 “运维家” ,回复 “140” 查看。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐