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: NodePortyaml 修改完毕后,通过 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"