练习题-5
# 课后练习题-5
# 理论练习(开放性试题)
涵盖第 7 章的内容。
- 通过
kubectl get nodes
查看节点信息时,列 “ROLES” 的内容是空的,如何设置? - 一个 Pod 通过
spec.nodeSelector
字段指定了运行位置,但是没有节点满足条件,那么这个 Pod 的创建是否能成功? - 一个 Pod 通过
spec.nodeSelector
字段指定了运行位置,但此时有多个节点满足条件,那么这个 Pod 会被调度到哪个节点上运行呢? - 集群资源的标签和注释有什么区别?
- 污点和容忍污点是什么?
答案
- 为相应的节点添加一个特殊的角色标签
node-role.kubernetes.io/<名称>
,只需要键名,不需要值。例如:kubectl label nodes www.k11.com node-role.kubernetes.io/worker1=
- 不会,这个 Pod 的状态会一直停留在 “Pending”(等待),直到出现一个符合条件的节点,或直到用户主动删除它
- 由控制平面 在满足条件的节点中 自动选择一个最合适的(随机)
- 标签可以参与到资源对象的操作中,例如 “列出具有特定标签的所有 Pod”。而注释只是为了提高可读性,不会参与到资源对象的运行中
- 一栋房子有污点(凶宅),一般人绕道走,但如果有人可以容忍污点(不怕凶宅),则可以买房住。一个节点有污点,一般的 Pod 绕道走,但如果有 Pod 可以容忍污点,则可以在这个节点上面运行
# 实操练习
涵盖第 5/6/7 章的内容。
提示
在开始实操练习之前,请先将工作节点(worker)上的污点删除,这些污点可能是你在第 7 章的学习过程中设置的。
- 为 worker01 和 worker02 节点都设置标签
look=good
。 - 为 worker01 节点设置标签
inside=bad
,为 worker02 节点设置标签inside=good
。 - 列出具有标签
look=good
的节点。 - 为 worker02 添加注释信息
this-is=Good
,然后列出其注释信息。 - 创建一个 Pod,要求如下:
- 名称为
pod-good
- 镜像为
nginx
,镜像下载策略为IfNotPresent
- 该 Pod 必须运行在 worker02 节点上
- 实施资源限制策略,限制 CPU 资源使用上限为
0.4
个核心,限制内存资源使用上限为512
MiB
- 名称为
- 为 worker01 节点设置污点
this-is=Bad
,效果为禁止调度。 - 找出拥有污点的所有主机。
- 创建一个 Pod,要求如下:
- 名称为
pod-bad
- 镜像为
centos
,镜像下载策略为IfNotPresent
- 该 Pod 必须运行在 worker01 节点上
- 启动 Pod 时运行的命令为
sleep 9999999
- 名称为
- 查看
pod-good
的 IP 地址,切换至 worker02 的终端窗口并使用curl
命令请求http://<IP地址>/I-am-hacker
。 - 查看
pod-good
的命令行输出,是否有来自 worker02 的 HTTP 请求。 - 找出内存消耗最低的节点。
- 删除
pod-good
和pod-bad
。
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
# 实操练习答案
# 1. 为 worker01 和 worker02 节点都设置标签look=good
。
kubectl label nodes www.k11.com www.k12.com look=good
1
# 2. 为 worker01 节点设置标签inside=bad
,为 worker02 节点设置标签inside=good
。
kubectl label nodes www.k11.com inside=bad
kubectl label nodes www.k12.com inside=good
1
2
2
# 3. 列出具有标签look=good
的节点。
kubectl get nodes -l look=good
1
# 4. 为 worker02 添加注释信息this-is=Good
,然后列出其注释信息。
kubectl annotate nodes www.k12.com this-is=Good
kubectl describe nodes www.k12.com | awk '/tations/,/C/'
1
2
3
2
3
# 5. 创建pod-good
创建一个 Pod,要求如下:
+ 名称为pod-good
+ 镜像为nginx
,镜像下载策略为IfNotPresent
+ 该 Pod 必须运行在 worker02 节点上
+ 实施资源限制策略,限制 CPU 资源使用上限为0.4
个核心,限制内存资源使用上限为512
MiB
# pod-good.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-good
spec:
nodeSelector:
inside: good
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod-good
resources:
limits:
cpu: 400m
memory: 512Mi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
对于资源限制,你也可以使用 LimitRange 来完成:
apiVersion: v1
kind: LimitRange
metadata:
name: good-limit
spec:
limits:
- max:
cpu: 400m
memory: 512Mi
type: Container
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 6. 为 worker01 节点设置污点this-is=Bad
,效果为禁止调度。
kubectl taint nodes www.k11.com this-is=Bad:NoSchedule
1
# 7. 找出拥有污点的所有主机。
kubectl describe nodes | awk '/Taint/,/Ho/' | sed 's/Taints/-------------------------\nTaints/g'
1
列出节点名称以及对应的污点。
awk '/Taint/,/Ho/'
匹配 “Taint” 到 “Ho...” 之间的所有字符sed '...'
将字符 “Taints” 替换为 “-----\nTaints”
以下是一些统计污点主机数量的方法。
# grep -c统计没有污点的主机数量
kubectl describe nodes | awk '/Taint/,/Ho/' | sed 's/Taints/-------------------------\nTaints/g' | grep -c '<none>'
1
2
2
一个比较流行的统计方法:
$(kubectl get nodes | grep Ready | awk '{print $1}')
:列出所有状态为 “Ready” 的节点,并通过awk
打印它们的主机名称kubectl describe nodes
:依次接收主机名称,列出每个节点的详细信息grep -i Taint
:查找污点grep -c NoSchedule
:统计污点主机的数量
kubectl describe nodes $(kubectl get nodes | grep Ready | awk '{print $1}') | grep -i Taint | grep -c NoSchedule
1
# 8. 创建pod-bad
创建一个 Pod,要求如下:
+ 名称为pod-bad
+ 镜像为centos
,镜像下载策略为IfNotPresent
+ 该 Pod 必须运行在 worker01 节点上
+ 启动 Pod 时运行的命令为sleep 9999999
# pod-bad.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-bad
spec:
nodeSelector:
inside: bad
tolerations:
- operator: "Equal"
key: "this-is"
value: "Bad"
effect: "NoSchedule"
containers:
- image: centos
imagePullPolicy: IfNotPresent
name: pod-bad
command: ['sh', '-c', 'sleep 9999999']
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 9. 查看pod-good
的 IP 地址,切换至 worker02 的终端窗口并使用curl
命令请求http://<IP地址>/I-am-hacker
。
# master
kubectl get pods -o wide
1
2
2
10.244.173.96
# worker02
curl http://10.244.173.96/I-am-hacker
1
2
2
# 10. 查看pod-good
的命令行输出,是否有来自 worker02 的 HTTP 请求。
kubectl logs pod-good
1
# 11. 找出内存消耗最低的节点。
kubectl top nodes --sort-by=memory
1
# 12. 删除pod-good
和pod-bad
。
kubectl delete pods pod-good pod-bad --force
1
编辑 (opens new window)