当前位置: 首页 > news >正文

k8sday08深入控制器(3/3)

目录

DaemonSet(ds)

一、配置文件

1、举例

2、可能问题

3、验证成功

二、节点选择器

1、添加标签

2、验证添加

3、添加节点选择器

4、应用文件并验证

三、滚动更新

Horizontal Poad Autoscaler(HPA)

1、部署资源监控

Ⅰ、下载

①、官方一键 YAML

②、git克隆

③、手动下载二进制

④、拉取metrics-server 镜像

Ⅱ、验证

①、如果下载的是镜像

②、下载的是二进制

Ⅲ、我自己的做法

①、下载二进制文件

②、配置dockerfile

③、打包成镜像

​编辑

④、应用在我的集群

​编辑

⑤、下载官方yaml文件

⑥、编辑官方yaml文件

⑦、遇到的问题

⑧、验证

2、准备服务应用(如果你全删了的话)

3、配置HPA

​编辑

4、压力测试

JOB


DaemonSet(ds)

DaemonSet确保 所有(或指定)节点 上各有一个 Pod 副本;新增节点自动补,节点下线自动删。适用于日志收集(Fluent Bit)、监控代理(node-exporter)、网络插件(Calico)、存储插件等 系统级守护进程

一、配置文件

1、举例

以下给出一份基础的DaemonSet的yaml创建文件,并给出每一步的解释:

注意只给出基本的配置,其他配置如节点亲和、容忍度等等,如有需要,自行配置~

 apiVersion: apps/v1                    # DaemonSet 的API版本kind: DaemonSet                        # 声明资源类型是 DaemonSetmetadata:                              # DaemonSet 的元信息name: fluent                         # DaemonSet 的名称(自定义)​spec:                                  # DaemonSet 规约(期望状态)selector:                            # 选择器matchLabels:                       # 配备标签,表示下方的 Pod 模板要有app: fluent-bitapp: fluent-bittemplate:                            # Pod 模板metadata:                          # Pod 的元信息labels:                          # Pod 的标签,要和上方的匹配标签相同app: fluent-bitspec:                              # Pod 的规约(期望状态)volumes:                         # 声明数据卷- name: varlog                 # 数据卷名称(自定义)hostPath:path: /var/log             # 来自宿主机的 /var/log ,是宿主机真实目录containers:                      # Pod 管理的容器- name: fluent-bit             # 容器名称(自定义)image: fluent/fluent-bit:2.1 # 容器的镜像,后面指定了版本volumeMounts:                # 使用数据卷- name: varlogmountPath: /var/log      # 挂载到容器内的 /var/log ,是容器里访问的目录updateStrategy:                      # 更新策略type: RollingUpdate                # 这里的更新策略是滚动更新,也可以设置为OnDelete

注意:DaemonSet没有replicas 的概念,守护进程的创建是根据节点创建,匹配多少节点就是多少,一个节点只有一个,没有副本数的概念,即无法自动扩容什么的

2、可能问题

还是相同的问题,可能是我自己的网络问题,手动拉取镜像是成功的,但是创建DaemonSet时仍然提示无法从docker hub拉取镜像

解决方案:将本地 Docker 镜像加载到 Kind 集群绕过 Docker Hub 拉取,KinD 的节点本质是 Docker 容器,kind load 会将本地镜像导入到这些节点中,使 Pod 可直接使用。

  kind load docker-image fluent/fluent-bit:2.1 --name <你要拉取到的集群名称>

成功后可得到类似信息:

之后通过应用yaml文件创建StatefulSet即可:

  kubectl apply -f <你自己的statefulset的配置文件名称>
3、验证成功

验证使用如下方法:

  # 查看已创建的 daemonsetkubectl get daemonset​# 查看已有的 Pod ,如果创建成功会多出2个# 因为未选择部署到哪个节点,所以除了主节点外,给剩下的2个子节点都部署了kubectl get po

最终可得到类似信息即创建成功:

二、节点选择器

创建DaemonSet时,如果你不指定你要部署的节点,DaemonSet将会默认部署在非主节点上,而节点选择器(nodeselector)就是帮助我们指定要部署节点的工具

1、添加标签

为你想要部署的节点添加对应标签:

   # 这里的no是node节点的简称kubectl label no <要部署的节点> <要加的标签>
2、验证添加
  kubectl get no --show-labels

可得到类似结果:

3、添加节点选择器
  # 位于 Pod 模板的规约内,和容器同级template:spec:nodeSelector:                    # 节点选择器type: slave                      # 要匹配的节点所具有的标签
4、应用文件并验证
  # 应用文件kubectl apply -f <你自己的daemonset文件>​# 获取daemonset,ds是daemonset的简写kubectl get ds# 查看 Pod ,看daemonset创建了多少容器kubectl get po

对比如图:(我将应用配置文件前后均截屏,大家可对比看一下)

由于我只给一个子节点加了标签,所以部署了DaemonSet的节点只有加了type= slave 的,另一个没有加的就没有署DaemonSet,要想让另一个节点也加上守护进程,只要也加上标签type= slave即可

三、滚动更新

DaemonSet的滚动更新默认是RollingUpdate,也有OnDeletePod 模板任何字段(env、volume、资源限制、标签等)发生变化, DaemonSet就会进行更新

下方是对Deployment、StatefulSet、DaemonSet的滚动更新策略对比总结

控制器内置策略类型是否支持并发/并行是否支持分区/金丝雀是否支持暂停/继续是否支持回滚更新顺序/特点
DeploymentRollingUpdate(默认)、Recreate✅(maxSurge+maxUnavailable✅(partition 通过 Argo/Kruise 等旁路实现)✅(kubectl rollout pause/resume✅(kubectl rollout undo无序并行,可批量
StatefulSetRollingUpdate(默认)、OnDelete❌(一次只动一个 Pod)✅(原生 partition 字段)❌(无官方暂停)✅(kubectl rollout undo逆序(从最高序号开始)
DaemonSetRollingUpdate(默认)、OnDelete✅(maxUnavailable 节点级并发)✅(OpenKruise partition 或手工分批)❌(无官方暂停)✅(kubectl rollout undo按节点滚动,一节点一 Pod

亲和力、污点容忍在后面的学习中展开

Horizontal Poad Autoscaler(HPA)

Horizontal Pod Autoscaler(HPA)是 Kubernetes 官方提供的 水平 Pod 自动扩缩容控制器,可以根据 CPU、内存或自定义指标实时调整 Deployment / StatefulSet / ReplicaSet 的 Pod 副本数,业务高峰自动加副本,低谷自动减副本,无需人工干预

其实Horizontal Pod Autoscaler(HPA)就是通过追踪分析Pod的负载变化,来自动调整Pod的副本数。我们原来是通过kubectl scale来扩容缩容或者是改变yaml文件,这比较麻烦,通过HPA就可以让其自动扩容缩容

1、部署资源监控

HPA要想实现自动水平 Pod 自动扩缩容,其前提是要对你的Pod的负载进行监控分析,所以我们需要一个插件帮助我们正确分析监控,这里我采用常用的metrics-server

metrics-server 默认由 Kubernetes 官方Deployment + Service 的形式部署在 kube-system 命名空间,并作为 kube-controller-managerMetrics API 插件 运行

Ⅰ、下载

下载有多种方法,这里我提供四种:

①、官方一键 YAML
  # 下载并直接安装最新版kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml​# 等 30-60 秒kubectl get pods -n kube-system -l k8s-app=metrics-server
②、git克隆
  # 安装git(如果你没有安装过的话)yum install git -y​# 获取metrics-servergit clone -b <你要下载的版本号> https://github.com/kubernetes-sigs/metrics-server​# 修改配置# 进入metrics-server的deploy文件夹,找到你的deployment的yaml文件# 添加如下内容hostNetwork: trueregistry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:<你要下载的版本号>--kubelet-insecure-tls--kubelet-preferred-address-types=InternalIP​# 根据集群版本进入对应子目录cd deploy/kuberneteskubectl apply -f .
③、手动下载二进制

进入github的metrics-server下载网址https://github.com/kubernetes-sigs/metrics-server/releases,选择你要下载的版本,指定路径到本地后再kubectl apply -f <你的文件名>

④、拉取metrics-server 镜像
 # 最新版 v0.8.0docker pull registry.k8s.io/metrics-server/metrics-server:v0.8.0# 镜像架构:linux/amd64,大小 ≈ 82 MB [^124^]

镜像已内置 /metrics-server 可执行文件,无需再下载二进制

Ⅱ、验证
①、如果下载的是镜像
  # 查看docker里的使用镜像即可docker images
②、下载的是二进制
  ls -lh ./metrics-serverfile ./metrics-server​# 输出类似结果-rwxr-xr-x 1 root root 35M Jun 14 12:34 ./metrics-server./metrics-server: ELF 64-bit LSB executable, x86-64, ...

注意下载完二进制文件后,建议把它打包成镜像,当然你也可以直接跑,如果只是单片测试的话

Ⅲ、我自己的做法
①、下载二进制文件

将下载的二进制文件放在"E:\cloud-native\k8s\metrics-server\metrics-server-linux-amd64"

②、配置dockerfile

在和二进制文件同目录下编写dockerfile:

  FROM scratchCOPY metrics-server-linux-amd64 /metrics-serverUSER 65534EXPOSE 4443ENTRYPOINT ["/metrics-server"]
③、打包成镜像
docker build -t metrics-server:v0.8.0# 验证
docker images
④、应用在我的集群
   kind load docker-image metrics-server:v0.8.0 --name my-multi-node-cluster1
⑤、下载官方yaml文件
   wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.8.0/components.yaml
⑥、编辑官方yaml文件
# 将官方yaml文件中的镜像改为:image: metrics-server:v0.8.0# 在spec.template.spec.containers[0].args内改为:kubectl -n kube-system patch deployment metrics-server \--type='json' \-p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"},{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP"}]'
⑦、遇到的问题
  • 健康检查失败,探针配置可能未被正确应用,端口未对齐

  # 解决方法apiVersion: v1kind: Servicespec:ports:- port: 443targetPort: 4443  # 指向容器实际端口name: httpsreadinessProbe:httpGet:path: /readyzport: 4443  # 直接写数字,与 --secure-port 一致scheme: HTTPSlivenessProbe:httpGet:path: /livezport: 4443  # 同上scheme: HTTPS
  • 连不上任何节点的 kubelet 10250 端口,导致采集不到节点/容器指标,readiness 探针返回 500

    • metrics-server 在 Pod 网络里拿到的节点 IP(如 10.244.x.x)不是节点宿主机的真实 IP

  • Kind 节点里的 kubelet 默认只监听 127.0.0.1:10250,外部 Pod 无法访问。

  # 让 metrics-server 使用宿主机网络(这样它就能连 127.0.0.1:10250)kubectl -n kube-system patch deployment metrics-server \--type='json' \-p='[{"op":"add","path":"/spec/template/spec/hostNetwork","value":true}]'
⑧、验证

2、准备服务应用(如果你全删了的话)

配置一个有资源限制的Deployment,这里我不演示了,详情配置可以看我的k8sday06深入控制器(1/3)

3、配置HPA

  apiVersion: autoscaling/v2      # 自动缩放器的 API 版本kind: HorizontalPodAutoscaler   # 声明资源类型是 HPAmetadata:                       # 元数据name: web-hpa                 # 自动缩放器的名称(自定义)spec:                           # 自动缩放器的规约(期望状态)scaleTargetRef:apiVersion: apps/v1kind: Deployment            # 被自动缩放的资源类型name: nginx-deployment1     # 被自动缩放的资源名称(已存在的)minReplicas: 1                # 最小副本数maxReplicas: 5                # 最大副本数# targetCPUUtilizationPercentage已经废除,需要使用 metrics 指标# 目标 CPU 利用率(%)指标(设置的比较小方便测试)metrics:- type: Resourceresource:name: cpu                 # 资源名称(自定义)target:type: UtilizationaverageUtilization: 3   # 目标 CPU 利用率(%)指标(设置的比较小方便测试)

注意你的deployment要有资源限制

验证成功:

  kubectl get hpa# 刚开始可能在你的TARGETS那里显示是 <unknown>/3%# 过一会就1%/3% 正常了(不到 1min),如果时间久了还是<unknown>/3%# 可能是你的deployment没有限制资源等等

4、压力测试

由于不知是不是我的网络问题,在配置高并发Deployment测压时,明明本地有镜像就是死活不用,即使我已经使用镜像摘要来要求,就是用不了,所以没办法做压力测试了,大家可以自行配置,这里我给出我的使用nginx镜像的高并发Deployment配置文件,大家可以直接使用,按理来说应该是没有什么大问题的:

  # 高并发Deployment测压apiVersion: apps/v1kind: Deploymentmetadata:name: siege-deployspec:replicas: 5          # 并发 Pod 数selector:matchLabels:app: siegetemplate:metadata:labels:app: siegespec:containers:- name: siege# 注意这里的镜像,要填你自己的镜像版本image: nginx@sha256:6c0218f1687660914d2ce279489e9b6d62a5a48d06ab2e27b7710c19d5e904e5# 使用镜像的 sha256 摘要imagePullPolicy: IfNotPresent  # 确保显式设置command:- /bin/sh- -c- |while true; do# 每个 shell 里开 50 条后台并发 curlfor i in $(seq 50); docurl -s http://nginx-deployment.default.svc.cluster.local &donewait    # 等这一轮 50 个请求完成,再下一轮done# 当然你的command命令也可以通过写死循环什么的来提高压力,或用什么专业的测压软件都是可以的

JOB

用于运行一次性任务,例如批量处理任务或数据迁移任务。它会创建一个或多个 Pod 来完成任务,并在任务完成后Pod自动清理。

给出一个用于计算圆周率的任务的yaml配置文件:

apiVersion: batch/v1           # Job 属于 batch 组kind: Job                      # 声明资源类型是 Job 类型metadata:                      # 元数据name: pi-job                 # Job 名称,可自定义namespace: default           # 所在命名空间spec:                          # Job 的期望状态suspend: false               # 1.21+:true=暂停调度,默认 falsecompletions: 4               # 需要成功完成的 Pod 数为4个parallelism: 2               # 并发运行的 Pod 数为2个,即一次性运行2个 PodbackoffLimit: 4              # 最大重试次数(失败后不再创建)activeDeadlineSeconds: 100   # Job 运行期限:100s ,超过时间未结束自动失败manualSelector: true         # 是否使用selector选择器,默认 falseselector:                    # 选择器,用于手动选择 Pod 标签matchLabels:               # 下方应有 app: pi 标签app: pittlSecondsAfterFinished: 100 # 完成后 100s 自动清理(需开启 TTL 特性)template:                    # Pod 模板(与 Pod spec 结构一致)metadata:                  # Pod 的元信息labels:                  # Pod 的标签,要和上方的匹配标签相同app: pispec:restartPolicy: Never     # Job 只能 Never 或 OnFailure#因为 Job 执行的是一次性任务,所以不需要 Always 重启策略containers:- name: pi-container      # 容器名称,可自定义image: perl:5.34.0      # 容器镜像# 容器命令  计算 π 到 20 位 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(20)"]resources:              # 资源请求和限制requests:             # 最少资源请求cpu: 100m           # 容器请求 100毫核 CPU资源memory: 128Mi       # 容器请求 128Mi 内存

创建完成后,创建Job即可,可以使用-w实时监控(当然我忘了~),可以看到类似画面:

可以看到是一次性运行2个Pod,运行完之后过一会这些Job都会自动清理,如图:

CronJob类似,只不过CronJob是管理Job的,这里就不演示了

由于不知是不是我的网络问题,导致我的镜像拉取每次都只能通过手动拉取然后导入集群,比较麻烦,而且有的时候甚至导入了集群也无法使用,我有点苦恼TVT

所以最终我决定,直接从kind的集群配置文件出发,将原来的集群删除,重新创建集群,重新配置一遍,看看能不能解决我的问题,当然,有大佬教教我怎么解决就更好了QAQ

http://www.dtcms.com/a/333897.html

相关文章:

  • Arduino通过MQTT发送消息到树莓派
  • 【大模型核心技术】Dify 入门教程
  • GitHub 热榜项目 - 日榜(2025-08-16)
  • 心路历程-三个了解敲开linux的大门
  • 基于Uni-app+vue3实现微信小程序地图固定中心点范围内拖拽选择位置功能(分步骤详解)
  • 基于uni-app+vue3实现的微信小程序地图范围限制与单点标记功能实现指南
  • SpringBoot 整合 Langchain4j:系统提示词与用户提示词实战详解
  • uniapp:微信小程序使用Canvas 和Canvas 2D绘制图形
  • 【Java笔记】synchronized
  • GitHub宕机时的应急协作方案
  • 【Java学习】锁、线程死锁、线程安全2
  • Go语言实战案例:连接MySQL数据库
  • webrtc弱网-VideoSendStreamImpl类源码分析与算法原理
  • debian 13 显示中文字体 不再显示菱形块 终端显示中文
  • OpenCompass傻瓜式入门教程
  • 命令模式C++
  • Point-LIO技术文档中文翻译解析
  • 【计算机组成原理】第四章:指令系统
  • 使用vscode插件(c cpp cmake project creator)自动生成C++程序模板
  • LeetCode 283.移动零
  • C语言:指针(5)
  • break的使用大全
  • 基于STM32单片机的智能粮仓温湿度检测蓝牙手机APP设计
  • YAML:锚点深度解析,告别重复,拥抱优雅的配置艺术
  • 初识CNN02——认识CNN2
  • 浏览器面试题及详细答案 88道(45-55)
  • MyBatis 与 MyBatis-Plus 的区别
  • 20day-人工智能-机器学习-线性回归
  • 数据处理与统计分析 —— numpy入门
  • @mcp.tool如何从函数定义映射到llm系统输入