Kubernetes教程FG054-Kubernetes DaemonSet与Static Pod实战解析
目录大纲
Part01-基础概念与理论知识
1.1 DaemonSet概念
DaemonSet是Kubernetes中的一种控制器,用于确保集群中的每个节点(或符合条件的节点)都运行一个Pod的副本。当节点加入集群时,DaemonSet会自动在该节点上创建Pod;当节点从集群中移除时,DaemonSet会自动删除该节点上的Pod。
1.2 DaemonSet工作原理
DaemonSet通过监听节点变化事件,确保每个符合条件的节点上都有且只有一个Pod运行。它使用节点选择器(nodeSelector)或节点亲和性(nodeAffinity)来选择要运行Pod的节点。
1.3 Static Pod概念
Static Pod是由kubelet直接管理的Pod,不需要API服务器的介入。它们存储在节点的特定目录中,kubelet会定期扫描这些目录并创建或删除相应的Pod。
1.4 Static Pod工作原理
kubelet在启动时会检查配置的Static Pod目录(默认为/etc/kubernetes/manifests),并为该目录中的每个YAML或JSON文件创建一个Pod。当文件被修改时,kubelet会更新相应的Pod;当文件被删除时,kubelet会删除相应的Pod。,风哥提示:。
,风哥提示:。
Part02-生产环境规划与建议
2.1 DaemonSet应用场景
DaemonSet适用于以下场景:
- 日志收集:在每个节点上运行日志收集器,如Fluentd、Filebeat
- 监控:在每个节点上运行监控代理,如Prometheus Node Exporter
- 网络插件:在每个节点上运行网络插件,如Calico、Flannel
- 存储插件:在每个节点上运行存储插件,如Rook、Ceph
2.2 Static Pod应用场景
Static Pod适用于以下场景:
- 控制平面组件:在主节点上运行etcd、kube-apiserver、kube-controller-manager、kube-scheduler等控制平面组件
- 节点级服务:在节点上运行需要在kubelet启动前就运行的服务
- 测试和调试:用于快速测试Pod配置,无需通过API服务器
2.3 资源规划
在规划DaemonSet和Static Pod时,需要考虑以下资源因素:
- CPU和内存:确保每个节点有足够的资源运行DaemonSet或Static Pod
- 存储:对于需要持久化的DaemonSet或Static Pod,需要规划存储资源
- 网络:确保网络配置能够支持DaemonSet或Static Pod的网络需求
Part03-生产环境项目实施方案
3.1 DaemonSet部署方案
部署DaemonSet的步骤如下。
3.1.1 创建DaemonSet YAML文件
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
selector:
matchLabels:
app: fluentd,学习交流加群风哥微信: itpux-com。
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluentd:v1.14
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
3.1.2 部署DaemonSet
# kubectl apply -f fluentd-daemonset.yaml
执行 →
daemonset.apps/fluentd created
3.2 Static Pod部署方案
部署Static Pod的步骤如下。。。
3.2.1 创建Static Pod YAML文件
apiVersion: v1
kind: Pod
metadata:
name: static-nginx,学习交流加群风哥QQ113257174。
labels:
app: static-nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources:
limits:
memory: 256Mi
requests:
cpu: 100m
memory: 256Mi
3.2.2 将YAML文件复制到Static Pod目录
# cp static-nginx.yaml /etc/kubernetes/manifests/
Part04-生产案例与实战讲解
4.1 DaemonSet实战案例:部署Prometheus Node Exporter
4.1.1 创建Node Exporter DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: prometheus-node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: prometheus-node-exporter
template:
metadata:
labels:
app: prometheus-node-exporter
spec:
containers:
- name: prometheus-node-exporter
image: prom/node-exporter:v1.3.1,更多视频教程www.fgedu.net.cn。
ports:
- containerPort: 9100
hostPort: 9100
resources:
limits:
memory: 100Mi
requests:
cpu: 100m
memory: 100Mi
4.1.2 部署Node Exporter
# kubectl create namespace monitoring # kubectl apply -f node-exporter-daemonset.yaml
执行 →
namespace/monitoring created daemonset.apps/prometheus-node-exporter created
4.1.3 验证Node Exporter部署
# kubectl get daemonset -n monitoring
执行 →
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE prometheus-node-exporter 3 3 3 3 31m
4.2 Static Pod实战案例:部署etcd
4.2.1 创建etcd Static Pod YAML文件
apiVersion: v1
kind: Pod
metadata:
name: etcd
namespace: kube-system
spec:
containers:
- name: etcd
image: k8s.gcr.io/etcd:3.5.0
command:
- etcd
- --advertise-client-urls=https://192.168.1.10:2379
- --listen-client-urls=https://192.168.1.10:2379,更多学习教程公众号风哥教程itpux_com。
- --listen-peer-urls=https://192.168.1.10:2380
- --initial-advertise-peer-urls=https://192.168.1.10:2380
- --initial-cluster=etcd=https://192.168.1.10:2380
- --initial-cluster-token=etcd-cluster-01
- --initial-cluster-state=new
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
- --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
- --data-dir=/var/lib/etcd
volumeMounts:
- name: etcd-certs
mountPath: /etc/kubernetes/pki/etcd
readOnly: true
- name: etcd-data
mountPath: /var/lib/etcd
volumes:
- name: etcd-certs
hostPath:
path: /etc/kubernetes/pki/etcd
- name: etcd-data
hostPath:
path: /var/lib/etcd
4.2.2 将YAML文件复制到Static Pod目录
# cp etcd-static-pod.yaml /etc/kubernetes/manifests/
4.2.3 验证etcd Static Pod状态
# kubectl get pods -n kube-system | grep etcd
执行 →
etcd-fgedu-master 1/1 Running 0 5m
Part05-风哥经验总结与分享
5.1 DaemonSet最佳实践
- ,from K8S+DB视频:www.itpux.com。
- 合理设置资源限制:为DaemonSet设置适当的CPU和内存限制,避免占用过多节点资源
- 使用节点选择器:通过nodeSelector或nodeAffinity选择适合运行DaemonSet的节点
- 配置滚动更新:使用rollingUpdate策略,确保DaemonSet更新时不影响集群运行
- 监控DaemonSet:定期检查DaemonSet的运行状态,确保所有节点都有Pod运行
。
5.2 Static Pod最佳实践
- 仅用于必要场景:Static Pod应仅用于控制平面组件或节点级服务
- 注意文件权限:确保Static Pod YAML文件权限正确,避免未授权修改
- 定期备份:定期备份Static Pod配置文件,以防止配置丢失
- 监控Static Pod:定期检查Static Pod的运行状态,确保其正常运行
5.3 常见问题与解决方案
- DaemonSet Pod无法在某些节点上运行:检查节点选择器是否正确,节点是否有足够的资源
- Static Pod未创建:检查YAML文件格式是否正确,文件是否在正确的目录中
- DaemonSet更新失败:检查更新策略是否正确,Pod是否能够正常启动
- Static Pod配置更新不生效:检查kubelet是否重新加载了配置文件,可能需要重启kubelet
5.4 性能优化建议
- 减少DaemonSet数量:只部署必要的DaemonSet,避免过多占用节点资源
- 优化Static Pod配置:确保Static Pod配置合理,避免不必要的资源消耗
- 使用本地存储:对于需要存储的DaemonSet或Static Pod,使用本地存储以提高性能
- 定期清理:定期清理不需要的DaemonSet和Static Pod,保持集群整洁
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
