练习题-8
# 课后练习题-8
# 理论练习(开放性试题)
涵盖第 10 章的内容。
- 控制器 Deployment 和 DaemonSet 之间的区别?
- 控制器 ReplicaSet(RS)的作用?
答案
- Deployment 创建并运行多个 Pod,这些 Pod 被调度至不同的工作节点上运行,通常用于部署业务。DaemonSet 在每个节点上分别创建一个 Pod,通常用于集群自身的监控、通信和日志收集等工作。
- RS 可以维持 Pod 数量,提供 Pod 副本数扩缩特性。RS 被作为 Deployment 的底层组件之一。
# 实操练习
涵盖第 10 章的内容。
- 创建一个 DaemonSet 控制器,要求如下:
- 名称为
ds-ten
- 通过标签表达式(选择算符)来追踪 Pod,要求匹配
look=good
或look=bang
标签 - 添加一个标签表达式,拒绝标签键名为
bad
的任意 Pod - Pod 模板的标签为
look=good
- 容器使用的镜像为
nginx
,镜像下载策略为IfNotPresent
,容器名称为c1
- 名称为
- 解释此 DaemonSet 为什么没有在 master 上创建 Pod?
- 将此 DaemonSet 的镜像变更为
nginx:1.9
。 - 控制器 DaemonSet 是否支持镜像的历史变更记录?
- 将其中一个 Pod 的标签
look=good
修改为look=bang
,观察 DaemonSet 是否有动作。 - 为其中一个 Pod 添加标签
bad=
,观察 DaemonSet 是否有动作。 - 删除这个 DaemonSet.
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
答案分隔线
# 实操练习答案
# 1. 控制器ds-ten
创建一个 DaemonSet 控制器,要求如下:
+ 名称为ds-ten
+ 通过标签表达式(选择算符)来追踪 Pod,要求匹配look=good
或look=bang
标签
+ 添加一个标签表达式,拒绝标签键名为bad
的任意 Pod
+ Pod 模板的标签为look=good
+ 容器使用的镜像为nginx
,镜像下载策略为IfNotPresent
,容器名称为c1
编写以下 yaml 文件:
# ds-ten.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-ten
spec:
selector:
matchExpressions:
- { key: look, operator: In, values: [good, bang] }
- { key: bad, operator: DoesNotExist}
template:
metadata:
labels:
look: good
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: c1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
创建这个控制器
kubectl apply -f ds-ten.yaml
kubectl get daemonsets -o wide
kubectl get pods --show-labels
1
2
3
4
2
3
4
# 2. 解释此 DaemonSet 为什么没有在 master 上创建 Pod?
因为 master 节点默认具有污点,而此 DaemonSet 没有在 Pod 模板中配置容忍污点,所以 DaemonSet 不会在具有污点的 master 上创建 Pod。
kubectl describe nodes www.k10.com | grep Taint
1
# 3. 将此 DaemonSet 的镜像变更为nginx:1.9
。
kubectl set image daemonset ds-ten c1=nginx:1.9
1
# 4. 控制器 DaemonSet 是否支持镜像的历史变更记录?
kubectl rollout history daemonset ds-ten
# 可以设置注释信息,但内容不会同步到历史记录中
kubectl annotate daemonset ds-ten kubernetes.io/change-cause=<变更原因>
1
2
3
4
2
3
4
支持历史记录,但不能像 Deployment 一样自定义变更信息。
# 5. 将其中一个 Pod 的标签look=good
修改为look=bang
,观察 DaemonSet 是否有动作。
kubectl label pods <Pod名称> look=bang --overwrite=true
kubectl get pods --show-labels
1
2
3
2
3
DaemonSet 没有任何动作。因为它可以追踪标签look=good
和look=bang
中的任意一个。
# 6. 为其中一个 Pod 添加标签bad=
,观察 DaemonSet 是否有动作。
# bad 标签的值为空
kubectl label pods <Pod名称> bad=
kubectl get pods --show-labels
1
2
3
4
2
3
4
由于 “拒绝” 的优先级大于 “允许”,所以 DaemonSet 丢弃了这个 Pod,另外创建了一个新的 Pod。
# 7. 删除这个 DaemonSet。
kubectl delete daemonsets ds-ten
# 或
kubectl delete -f ds-ten.yaml
1
2
3
4
2
3
4
编辑 (opens new window)