练习题-4
# 课后练习题-4
# 理论练习(开放性试题)
涵盖第 6 章的内容。
- 什么是延迟删除期(宽限期)?
- Pod 钩子是什么?
- 为什么需要资源限制?
- 如果在编写 yaml 文件的过程中,忘记了某个字段如何编写,怎么快速查看字段信息?
答案
- 在删除 Pod 的时候给予它一点时间,等待 Pod 将手头上的任务处理完成,以实现优雅地关闭 Pod。
- 钩子可以在容器启动之后,或在容器被删除之前,执行一些特定的任务。
- 防止 Pod/容器 占用过多计算机资源,导致物理机出现卡顿、宕机等情况。
- 通过
kubectl explain
命令,查询格式为kubectl explain <资源类型>.<字段>
# 实操练习
涵盖第 5 章和第 6 章的内容。
- 创建一个 ResourceQuota,要求如下:
- ResourceQuota 名称为
my-quota
- 限制命名空间
default
中最多只能存在3
个 Pod
- ResourceQuota 名称为
- 创建一个 Pod,要求如下:
- Pod 名称为
pod-stop
- 命名空间为
default
- 容器镜像为
nginx
,镜像下载策略为IfNotPresent
- 宽限期设置为
120
秒 - 配置一个结束钩子,在删除 Pod 的时候使用命令
/usr/sbin/nginx -s quit
优雅地关闭 nginx 进程
- Pod 名称为
- 创建一个 Pod,要求如下:
- Pod 名称为
pod-start
- 命名空间为
default
- 容器镜像为
nginx
,镜像下载策略为IfNotPresent
- 配置一个启动钩子,在创建 Pod 之后修改 nginx 默认的首页内容为
Hello nginx!
(首页文件位于/usr/share/nginx/html/index.html
) - 对该 Pod 施加资源限制策略,CPU 使用上限为
1.2
个核心,内存使用上限为1.5
GiB
- Pod 名称为
- 创建一个 LimitRange,要求如下:
- LimitRange 名称为
my-limit
- 命名空间为
default
- 设置 CPU 使用上限为
0.8
个核心,内存使用上限为400
MiB - 限制对象为 “容器”
- LimitRange 名称为
- 创建一个 Pod,要求如下:
- Pod 名称为
pod-memload
- 命名空间为
default
- 容器镜像为
centos
,镜像下载策略为IfNotPresent
- Pod 名称为
- 将内存压力测试工具
memload
的安装包拷贝到 Podpod-memload
中,在容器中安装工具并运行:- 运行
memload
并申请800
M 的内存,然后查看 Pod 负载信息 - 如果无法申请到 800M 的内存,则改为申请
350
M 的内存,然后查看 Pod 负载信息
- 运行
- 通过命令行在命名空间
default
创建一个 Pod,看看能否创建成功。 - 在命名空间
ns1
创建一个 Pod,看看能否创建成功。 - 查看
pod-start
的 IP 地址,然后通过curl
请求网站首页,看看内容是否为Hello nginx!
- 删除
my-quota
、my-limit
和所有 Pod
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
# 实操练习答案
# 0. 切换集群命名空间为default
不是必须步骤,选做。
kubectl config set-context --current --namespace default
# 1. 创建 ResourceQuota
创建一个 ResourceQuota,要求如下:
* ResourceQuota 名称为my-quota
* 限制命名空间default
中最多只能存在3
个 Pod
apiVersion: v1
kind: ResourceQuota
metadata:
name: my-quota
namespace: default
spec:
hard:
pods: 3
2
3
4
5
6
7
8
# 2. 创建第一个Pod
创建一个 Pod,要求如下:
* Pod 名称为pod-stop
* 命名空间为default
* 容器镜像为nginx
,镜像下载策略为IfNotPresent
* 宽限期设置为120
秒
* 配置一个结束钩子,在删除 Pod 的时候使用命令/usr/sbin/nginx -s quit
优雅地关闭 nginx 进程
apiVersion: v1
kind: Pod
metadata:
name: pod-stop
namespace: default
spec:
terminationGracePeriodSeconds: 120
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod-stop
lifecycle:
preStop:
exec:
command: ['sh', '-c', '/usr/sbin/nginx -s quit']
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 3. 创建第二个Pod
创建一个 Pod,要求如下:
* Pod 名称为pod-start
* 命名空间为default
* 容器镜像为nginx
,镜像下载策略为IfNotPresent
* 配置一个启动钩子,在创建 Pod 之后修改 nginx 默认的首页内容为Hello nginx!
(首页文件位于/usr/share/nginx/html/index.html
)
* 对该 Pod 施加资源限制策略,CPU 使用上限为1.2
个核心,内存使用上限为1.5
GiB
注,resources.limits.cpu
设置为1.2
或1200m
都对,resources.limits.memory
设置为1.5Gi
或1536Mi
都对。
apiVersion: v1
kind: Pod
metadata:
name: pod-start
namespace: default
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod-start
lifecycle:
postStart:
exec:
command: ['sh', '-c', 'echo "Hello nginx!" > /usr/share/nginx/html/index.html']
resources:
limits:
cpu: 1200m
memory: 1.5Gi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 4. 创建LimitRange
创建一个 LimitRange,要求如下:
* LimitRange 名称为my-limit
* 命名空间为default
* 设置 CPU 使用上限为0.8
个核心,内存使用上限为400
MiB
* 限制对象为 “容器”
注,spec.limits.max.cpu
设置为0.8
或800m
都对。
apiVersion: v1
kind: LimitRange
metadata:
name: my-limit
namespace: default
spec:
limits:
- max:
cpu: 800m
memory: 400Mi
type: Container
2
3
4
5
6
7
8
9
10
11
# 5. 创建第三个Pod
创建一个 Pod,要求如下:
* Pod 名称为pod-memload
* 命名空间为default
* 容器镜像为centos
,镜像下载策略为IfNotPresent
* 创建 Pod 的时候执行命令sleep 99999999
apiVersion: v1
kind: Pod
metadata:
name: pod-memload
namespace: default
spec:
containers:
- image: centos
imagePullPolicy: IfNotPresent
name: pod-memload
command: ['sh', '-c', 'sleep 99999999']
2
3
4
5
6
7
8
9
10
11
# 6. 内存压力测试
将内存压力测试工具memload
的安装包拷贝到 Pod pod-memload
中,在容器中安装工具并运行:
* 运行memload
并申请800
M 的内存,然后查看 Pod 负载信息
* 如果无法申请到 800M 的内存,则改为申请350
M 的内存,然后查看 Pod 负载信息
kubectl cp ./memload-7.0-1.r29766.x86_64.rpm pod-memload:/opt
kubectl exec -it pod-memload -- bash
cd /opt
rpm -ivh ./memload-7.0-1.r29766.x86_64.rpm
memload 800
memload 350
2
3
4
5
6
7
8
# master
kubectl top pods
2
# 7. 在命名空间default
创建一个Pod
通过命令行在命名空间default
创建一个 Pod,看看能否创建成功。
kubectl run pod-default --image nginx --image-pull-policy=IfNotPresent
创建失败,Pod 配额达到上限。
# 8. 在命名空间ns1
创建一个Pod
在命名空间ns1
创建一个 Pod,看看能否创建成功。
kubectl run pod-ns1 --image nginx --image-pull-policy=IfNotPresent -n ns1
创建成功,Pod 正常运行。
# 9. 查看pod-start
的 IP 地址,然后通过curl
请求网站首页,看看内容是否为Hello nginx!
kubectl get pods -o wide
curl -i <IP地址>
2
3
# 10. 删除my-quota
、my-limit
和所有 Pod
删除方式一,依次删除。
# ResourceQuota
kubectl delete resourcequota my-quota
# LimitRange
kubectl delete limitrange my-limit
# Pod
kubectl delete pods pod-stop pod-start pod-memload
kubectl delete pods -n ns1 pod-ns1
2
3
4
5
6
7
8
9
10
删除方式二,通过 yaml 文件批量删除。
kubectl delete -f . --force