K8s新手系列之DaemonSet资源
<h2 id="概述">概述</h2><p>官网文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/</p>
<p><code>DaemonSet</code>简称<code>ds</code></p>
<p><code>DaemonSet</code> <strong>在不考虑污点的情况下会确保全部(或者某些)节点上运行一个 Pod 的副本</strong>。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 <code>DaemonSet</code> 将会删除它创建的所有 Pod。</p>
<h2 id="使用场景">使用场景:</h2>
<ul>
<li>在每个节点上运行集群守护进程
<ul>
<li>比如:kube-proxy</li>
</ul>
</li>
<li>在每个节点上运行日志收集守护进程
<ul>
<li>比如:filebeat</li>
</ul>
</li>
<li>在每个节点上运行监控守护进程
<ul>
<li>比如:zabbix-agent2</li>
</ul>
</li>
</ul>
<h2 id="资源清单文件详解">资源清单文件详解</h2>
<pre><code>apiVersion: apps/v1 # API 版本,当前稳定版本为 apps/v1
kind: DaemonSet # 资源类型为 DaemonSet
metadata:
name: example-daemonset # DaemonSet 名称,需在命名空间内唯一
namespace: default # 所属命名空间,默认值为 default
labels: # 标签,用于关联 Pod/Selector 等
app: monitoring
spec:
selector: # 标签选择器,用于匹配受控的 Pod
matchLabels:
app: monitoring
template: # Pod 模板,定义 Pod 的具体配置
metadata:
labels:
app: monitoring# 需与 selector.matchLabels 一致
spec:
containers:
- name: agent # 容器名称
image: agent:v1 # 镜像地址
resources: # 资源限制(可选)
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Mi
nodeSelector: # 节点选择器(可选),指定 Pod 调度到符合条件的节点
disk: ssd
tolerations: # 污点容忍(可选),允许 Pod 调度到带有特定污点的节点
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
updateStrategy: # 更新策略(可选,默认 RollingUpdate)
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 滚动更新时允许的最大不可用 Pod 数
minReadySeconds: 30 # 等待 Pod 就绪的最短时间(可选)
</code></pre>
<h2 id="daemonset实战">DaemonSet实战</h2>
<pre><code># 定义资源清单文件
# cat daemonset-nginx.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
hostPort: 30280
# 创建daemonset资源
# kubectl apply -f daemonset-nginx.yaml
daemonset.apps/nginx-daemonset created
</code></pre>
<p>查看daemonset资源</p>
<pre><code># 查看daemonset资源
# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 2 2 0 2 0 <none> 5s
# 查看pod,发现调度到node01和node02节点上
# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-bwgdw 1/1 Running 0 115s 100.95.185.254 node02 <none> <none>
nginx-daemonset-dtpw2 1/1 Running 0 115s 100.117.144.153 node01 <none> <none>
</code></pre>
<h3 id="为什么master节点上没有调度">为什么master节点上没有调度?</h3>
<p>因为master节点上默认存在一个污点,而上面的案例中没有配置污点容忍,所以没有调度过去</p>
<pre><code># 查看污点
# kubectl describe node master01 | grep -i taint
Taints: node-role.kubernetes.io/control-plane:NoSchedule
</code></pre>
<p>如果需要调度到master节点,需要做污点容忍。</p>
<blockquote>
<p>关于污点和污点容忍学习可以阅读这篇文章:K8s中的污点和容忍</p>
</blockquote>
<p>示例:</p>
<pre><code># cat daemonset-nginx.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
# 污点容忍
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: nginx
image: nginx:1.25.3
ports:
- containerPort: 80
hostPort: 30280
# 创建daemonset资源
# kubectl apply -f daemonset-nginx.yaml
daemonset.apps/nginx-daemonset configured
</code></pre>
<p>查看一下</p>
<pre><code># kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-daemonset 3 3 2 1 2 <none> 9m58s
# 查看pod,发现master节点也已经调度上了
# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-2pzdk 1/1 Running 0 102s 100.85.170.132 master01 <none> <none>
nginx-daemonset-dtpw2 1/1 Running 0 11m 100.117.144.153 node01 <none> <none>
nginx-daemonset-fr4dr 0/1 ContainerCreating 0 88s <none> node02 <none> <none>
</code></pre>
<h2 id="daemonset资源的管理">daemonset资源的管理</h2>
<h3 id="查看daemonset">查看DaemonSet</h3>
<p>语法:</p>
<pre><code>kubectl get daemonset <daemonset-name>
</code></pre>
<h3 id="删除daemonset">删除DaemonSet</h3>
<pre><code>kubectl delete daemonset <daemonset-name>
</code></pre>
<h3 id="更新daemonset">更新DaemonSet</h3>
<p>Damonset资源的更新、回滚策略和Deployment是一样的,可以参考这篇文章:K8s进阶之Deployment的更新&回滚</p>
<p>1、使用<code>kubectl edit</code>命令更新<br>
2、使用对应的资源清单文件进行更新</p>
<p>3、快速更新镜像:</p>
<pre><code># 语法
kubectl set image daemonset <daemonset资源> <pod-名称>=<镜像>:<镜像tag>
# 示例
kubectl set image daemonset/example-daemonset agent=agent:v2
</code></pre>
<p>4、快速回滚到上一个版本:</p>
<pre><code>kubectl rollout undo daemonset/example-daemonset
</code></pre>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18871607,微信Vac6666666,欢迎交流</p><br><br>
来源:https://www.cnblogs.com/huangSir-devops/p/18871607
頁:
[1]