闽公网安备 35020302035485号
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: back-daemonset
name: back-daemonset
spec:
selector:
matchLabels:
app: back-app
template:
metadata:
labels:
app: back-app
spec:
containers:
- image: back-test:latest
name: back-test
imagePullPolicy: Never
ports:
- containerPort: 80
可以看到,DaemonSet 与 Deployment 除了 kind 和 spec.replicas 处不同外,没有什么区别。所以我们完全可以通过创建一个 Deployment yaml文件,然后手动修改 kind 和 spec.replicas,以得到一个 DaemonSet 的模板。
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: back-daemonset
name: back-daemonset
spec:
selector:
matchLabels:
app: back-app
template:
metadata:
labels:
app: back-app
spec:
containers:
- image: back-test:latest
name: back-test
imagePullPolicy: Never
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: back-app-svc
name: back-app-svc
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 30002
selector:
app: back-app
type: NodePort
yaml 修改完毕后,通过 kubectl apply 进行应用生效,接下来我们就可以通过本地 30002 端口进行访问了:curl 127.0.0.1:30002/api/guid通过 Rancher Desktop 搭建的本地环境这样使用自然是没有问题的,但是如果是生产环境,你可能会发现 Master 节点并没有这样的一个 Pod 存在,只有 Work 节点存在 DaemonSet 的 Pod。这是因为 K8s 的 Master 节点默认只能运行控制面相关 Pod。为了解决这个问题,我们需要在 DaemonSet 的 spec.template.spec 添加tolerations字段:
apiVersion: apps/v1
kind: DaemonSet
...
spec:
template:
...
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
effect: NoSchedule
operator: Exists
- key: node-role.kubernetes.io/master
effect: NoSchedule
operator: Exists
containers:
...
Taint & Toleration:污点和容忍度NoExecute:类似于NoSchedule,但是如果 Pod 不存在这个容忍度,会被立即驱逐出该节点。当宿主机故障的时候可以使用该效果。
# 添加,指定value kubectl taint nodes NodeName key1=value1:NoSchedule # 添加,不指定value kubectl taint nodes NodeName key1:NoSchedule # 删除 (添加后面多个-) kubectl taint nodes NodeName key1=value1:NoSchedule-添加污点的命令含义是:给NodeName节点添加一个污点,它的键名是 key1,键值是 value1,效果是 NoSchedule。当然,我们可以不指定value。
tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule"而对于 Exists 来说,只要这个污点 key 存在即可进行调度。
tolerations: - key: "key1" operator: "Exists" effect: "NoSchedule"