IT 铁人赛 k8s 入门30天 -- day18 Task Configure Default Memory Requests and Limits for a Namespace

前言

今天要完成的项目 k8s Task: Memory-default-namesapce 这个 Task

布署目标

1 建立一个 namespace

2 给这个 namespace 设定一个预设 Memory 设定值

3 布署一个 Pod 不给定预设 Memory, 察看 Pod 启动状态确认是否设定成功

4 布署一个 Pod 只给定 Memory Limit 不设定预设 Memory 值

5 布署一个 Pod 只给定 Memory 需求, 不设定 Limit

建立一个 namespace

kubectl create namespace default-mem-example

建立一个名称为 default-mem-example 的 Namespace

给这个 namespace 设定一个预设 Memory 设定值

建一个设定档 memory-defaults.yaml

apiVersion: v1
kind: LimitRange
metadata:
  namespace: default-mem-example
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

建立一个对 Container 的记忆体限制

并且套用在 Namespace default-mem-example

每个 Container 限制内容为上限 512Mi

每个 Container 预设给定的 256Mi

布署指令如下:

kubectl apply -f memory-defaults.yaml

布署一个 Pod 不给定预设 Memory, 察看 Pod 启动状态确认是否设定成功

建立设定 memory-defaults-pod.yaml 如下:

apiVersion: v1
kind: Pod
metadata:
  namespace: default-mem-example
  name: default-mem-demo
spec:
  containers:
  - name: default-mem-demo-ctr
    image: nginx

在 Namespace default-mem-example 建立一个 Pod

名称设定为 default-mem-demo

使用 nginx 为 image

记忆体不做设定, 测试刚刚 LimitRange 是否会自动套用上设定值

建立指令如下:

kubectl apply -f memory-defaults-pod.yaml

查询 Pod 布署结果, 验证预设定有效

kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example

结果如下:

Memory 预设配置有设定成功

清除布署过的 Pod

kubectl delete -f memory-defaults-pod.yaml

布署一个 Pod 只给定 Memory Limit 不设定预设 Memory 值

建立 memory-defaults-pod2.yaml 如下

apiVersion: v1
kind: Pod
metadata:
  namespace: default-mem-example
  name: default-mem-demo-2
spec:
  containers:
  - name: default-mem-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "1Gi"

在 Namespace default-mem-example 建立一个 Pod

名称设定为 default-mem-demo-2

使用 nginx 为 image

记忆体只设定了 Limit 值

建立指令如下:

kubectl apply -f memory-defaults-pod2.yaml

透过查询指令

kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example

结果如下:

发现由於有设定 Memory Limit 值, 所以不会套用 LimitRange 内的设定值

而是使用在 Pod 的布署档 Limit 值, 而因为 request 没设定所以直接套用 Limit 值为 Request

清除布署过的 Pod

kubectl delete -f memory-defaults-pod2.yaml

布署一个 Pod 只给定 Memory 需求, 不设定 Limit

建立 memory-defaults-pod3.yaml 如下:

apiVersion: v1
kind: Pod
metadata:
  namespace: default-mem-example
  name: default-mem-demo-3
spec:
  containers:
  - name: default-mem-demo-3-ctr
    image: nginx
    resources:
      requests:
        memory: "128Mi"

在 Namespace default-mem-example 建立一个 Pod

名称设定为 default-mem-demo-3

使用 nginx 为 image

记忆体只设定了 Request 值

建立指令如下:

kubectl apply -f memory-defaults-pod3.yaml

透过查询指令

kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example

结果如下:

发现由於有设定 Memory Request 值, 所以使用在 Pod 的布署档 Memory Request 值

没有设定 Memory Limit 值, 所以套用了 LimitRange 设定的 Limit 值

清除布署过的 Pod

kubectl delete -f memory-defaults-pod3.yaml

清除使用的 namespace

kubectl delete namespace default-mem-example

後记

在 Namespace 设定预设值可以让 Namespace 记忆体管理更方便

首先是限制了每个 Container 必须有自己的 Memory 上限

并且控制了所有 Container 使用的 Memory 用量不会超过某个特定的值

前面布署章节有讲到, 设定档的 apiVersion 会被 cluster 执行的 kubernetes version 影响

minikube 有个可以设定执行在 cluster 的 kubernetes version 的指令如下

minikube start --kubernetes-version=$specified_version

这样一来就可以透过 minikube 执行所想测试 apiVersion 的设定档布署了

其他设定可以查询minikube 官方指令文件参考


<<:  18 程序竞赛前中後准备实例 (NCPC 2021)

>>:  Day17 探访 mmap( )

[Lesson21] Kotlin - 宣告变数

Kotlin 的基本资料型态与 Java 相同,包括:Byte、Short、Int、Long、Flo...

[Day05] CH03:各式运算子(下)

接续昨天的运算子(Operator): 等值运算子 Java操作 运算子 等於 == 不等於 != ...

Day 5 学习前人的隐私条款设计

Day 4提到过往我们如何拟出一份适用符合内部及市场的隐私条款,今天还是以隐私条款为主要探讨方向,在...

DAY28 mongodb aggregate(2)

上次我们在mongo shell里使用mongodb aggregate 不过 我们需要在程序里面去...

Day16. Service, Strategy and Singleton Pattern

设计流程的出现,让我们可以写出一套好的流程,并且帮助团队少写多余的程序码。由於Ruby不像Javas...