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

K8S企业级应用与DaemonSet实战解析

目录

一、概述

二、YAML文件详解

三、企业应用案例

3.1 环境准备

3.2 扩缩容

3.3 滚动更新

3.4 回滚

四、自定义更新策略

4.1类型

4.2 设置方式

4.3 配置案例

一、 DaemonSet 概述

DaemonSet 工作原理

Daemonset 典型的应用场景

DaemonSet 与 Deployment 的区别

二、DaemonSet 资源清单文件编写技巧

清单模版

三、DaemonSet 使用案例


一、概述

Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。

典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet

  • 滚动升级和回滚应用

  • 扩容和缩容

  • 暂停和继续Deployment更新

Deployment表示用户对K8S集群的一次更新操作。Deployment是一个比RS( Replica Set, RS) 应用模型更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧RS中的副本数减少到0的复合操作。

这样一个复合操作用一个RS是不好描述的,所以用一个更通用的Deployment来描述。以K8S的发展方向,未来对所有长期伺服型的业务的管理,都会通过Deployment来管理。

二、YAML文件详解

apiVersion: apps/v1 #接口版本
kind: Deployment                 #接口类型
metadata:name: cango-demo               #Deployment名称namespace: cango-prd           #命名空间labels:app: cango-demo              #标签
spec:replicas: 3selector:matchLabels:app: cango-demo  #匹配模板中labelstrategy:rollingUpdate:  ##由于replicas为3,则整个升级,pod个数在2-4个之间maxSurge: 1      #滚动升级时会先启动1个podmaxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数template:         metadata:labels:app: cango-demo  #模板名称必填sepc: #定义容器模板,该模板可以包含多个容器containers:                                                                   - name: cango-demo1                                                           #镜像名称image: swr.cn-east-2.myhuaweicloud.com/cango-prd/cango-demo:0.0.1-SNAPSHOT #镜像地址command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ]    #启动命令args:                                                                #启动参数- '-storage.local.retention=$(STORAGE_RETENTION)'- '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'- '-config.file=/etc/prometheus/prometheus.yml'- '-alertmanager.url=http://alertmanager:9093/alertmanager'- '-web.external-url=$(EXTERNAL_URL)'#如果command和args均没有写,那么用Docker默认的配置。#如果command写了,但args没有写,那么Docker默认的配置会被忽略而且仅仅执行.yaml文件的command(不带任何参数的)。#如果command没写,但args写了,那么Docker默认配置的ENTRYPOINT的命令行会被执行,但是调用的参数是.yaml中的args。#如果如果command和args都写了,那么Docker默认的配置被忽略,使用.yaml的配置。imagePullPolicy: IfNotPresent  #如果不存在则拉取livenessProbe:       #表示container是否处于live状态。如果LivenessProbe失败,LivenessProbe将会通知kubelet对应的container不健康了。随后kubelet将kill掉container,并根据RestarPolicy进行进一步的操作。默认情况下LivenessProbe在第一次检测之前初始化值为Success,如果container没有提供LivenessProbe,则也认为是Success;httpGet:path: /health #如果没有心跳检测接口就为/port: 8080scheme: HTTPinitialDelaySeconds: 60 ##启动后延时多久开始运行检测timeoutSeconds: 5successThreshold: 1failureThreshold: 5readinessProbe:httpGet:path: /health #如果没有心跳检测接口就为/port: 8080scheme: HTTPinitialDelaySeconds: 30 ##启动后延时多久开始运行检测timeoutSeconds: 5successThreshold: 1failureThreshold: 5resources:              ##CPU内存限制requests:cpu: 2memory: 2048Milimits:cpu: 2memory: 2048Mienv:                    ##通过环境变量的方式,直接传递pod=自定义Linux OS环境变量- name: LOCAL_KEY     #本地Keyvalue: value- name: CONFIG_MAP_KEY  #局策略可使用configMap的配置Key,valueFrom:configMapKeyRef:name: special-config   #configmap中找到name为special-configkey: special.type      #找到name为special-config里data下的keyports:- name: httpcontainerPort: 8080 #对service暴露端口volumeMounts:     #挂载volumes中定义的磁盘- name: log-cachemountPath: /tmp/log- name: sdb       #普通用法,该卷跟随容器销毁,挂载一个目录mountPath: /data/media    - name: nfs-client-root    #直接挂载硬盘方法,如挂载下面的nfs目录到/mnt/nfsmountPath: /mnt/nfs- name: example-volume-config  #高级用法第1种,将ConfigMap的log-script,backup-script分别挂载到/etc/config目录下的一个相对路径path/to/...下,如果存在同名文件,直接覆盖。mountPath: /etc/config       - name: rbd-pvc                #高级用法第2中,挂载PVC(PresistentVolumeClaim)
​
#使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容,volumes:  # 定义磁盘给上面volumeMounts挂载- name: log-cacheemptyDir: {}- name: sdb  #挂载宿主机上面的目录hostPath:path: /any/path/it/will/be/replaced- name: example-volume-config  # 供ConfigMap文件内容到指定路径使用configMap:name: example-volume-config  #ConfigMap中名称items:- key: log-script           #ConfigMap中的Keypath: path/to/log-script  #指定目录下的一个相对路径path/to/log-script- key: backup-script        #ConfigMap中的Keypath: path/to/backup-script  #指定目录下的一个相对路径path/to/backup-script- name: nfs-client-root         #供挂载NFS存储类型nfs:server: 10.42.0.55          #NFS服务器地址path: /opt/public           #showmount -e 看一下路径- name: rbd-pvc                 #挂载PVC磁盘persistentVolumeClaim:claimName: rbd-pvc1         #挂载已经申请的pvc磁盘

三、企业应用案例

3.1 环境准备

创建my-blue.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: mydm
spec:replicas: 3selector:matchLabels:app: myapp-blue #匹配模板中labeltemplate:metadata:labels:app: myapp-bluespec:containers:- name: myapp-blueimage: janakiramm/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80

创建访问service my-blue-service.yaml

apiVersion: v1
kind: Service
metadata:name: service-blue
spec:selector:app: myapp-bluetype: NodePort ports:- port: 80nodePort: 30030targetPort: 80

提交对应的资源清单

[root@k8s-master01 ~]# kubectl apply -f my-blue.yaml
[root@k8s-master01 ~]# kubectl apply -f my-blue-service.yaml
#查看对应的资源
[root@k8s-master01 ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS        AGE
mydm-7755b9f55f-7h2nb     1/1     Running   0               69s
mydm-7755b9f55f-bj9gf     1/1     Running   0               69s
mydm-7755b9f55f-hjckc     1/1     Running   0               69s
mydm-7755b9f55f-lfvrd     1/1     Running   0               69s
mydm-7755b9f55f-lxzw4     1/1     Running   0               69s
mydm-7755b9f55f-v74w8     1/1     Running   0               69s
[root@k8s-master01 ~]# kubectl get svc
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service-blue         NodePort    10.10.157.201   <none>        80:30030/TCP     87s

3.2 扩缩容

修改对应的yaml文件中的replicas的数量

apiVersion: apps/v1
kind: Deployment
metadata:name: mydm
spec:replicas: 5selector:matchLabels:app: myapp-blue #匹配模板中labeltemplate:metadata:labels:app: myapp-bluespec:containers:- name: myapp-blueimage: janakiramm/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80

3.3 滚动更新

修改对应的yaml文件中的image信息

apiVersion: apps/v1
kind: Deployment
metadata:name: mydm
spec:replicas: 3selector:matchLabels:app: myapp-blue #匹配模板中labeltemplate:metadata:labels:app: myapp-bluespec:containers:- name: myapp-blueimage: janakiramm/myapp:v2imagePullPolicy: IfNotPresentports:- containerPort: 80

3.4 回滚

查看历史版本

[root@k8s-master01 ~]# kubectl  rollout history deployment name

回滚操作

[root@k8s-master01 ~]# kubectl rollout undo deployment name --to-revision=1

四、自定义更新策略

4.1类型

  • maxSurge:和期望的副本数比,超过期望副本数最大比例(或最大值),这个值调的越大,副本更新速度越快。

  • maxUnavailable:和期望的副本数比,不可用副本数最大比例(或最大值),这个值越小,越能保证服务稳定,更新越平滑;

4.2 设置方式

  1. 按数量

  • maxUnavailable: [0, 副本数]

  • maxSurge: [0, 副本数]

  • 注两者不能同时为0。

  1. 按比例

  • maxUnavailable: [0%, 100%] 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个;

  • maxSurge: [0%, 100%] 向上取整,比如10个副本,5%的话==0.5个,但计算按照1个;

  • 两者不能同时为0。

4.3 配置案例

apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-v1
spec:replicas: 3selector:matchLabels:app: myappversion: v1strategy:rollingUpdate:maxSurge: 1maxUnavailable: 1template:metadata:labels:app: myappversion: v1spec:containers:- name: myappimage: janakiramm/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80

一、 DaemonSet 概述

     DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 node 节点时,这个 node 节点也会自动创建一个 pod 副本,当 node 节点从 集群移除,这些 pod 也会自动删除;删除 Daemonset 也会删除它们创建的 pod

DaemonSet 工作原理

 daemonset 的控制器会监听 kuberntes 的 daemonset 对象、pod 对象、node 对象,这些被监听的对象之变动,就会触发 syncLoop 循环让 kubernetes 集群朝着 daemonset 对象描述的状态进行演进。

Daemonset 典型的应用场景

在集群的每个节点上运行存储,比如:glusterd 或 ceph。 在每个节点上运行日志收集组件,比如:flunentd 、 logstash、filebeat 等。 在每个节点上运行监控组件,比如:Prometheus、 Node Exporter 、collectd 等。

DaemonSet 与 Deployment 的区别

Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。

DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。

二、DaemonSet 资源清单文件编写技巧

[root@k8s-master01 ~]# kubectl explain ds
字段作用
apiVersion当前资源使用的 api 版本,跟 VERSION: apps/v1 保持 一致
kind资源类型,跟 KIND: DaemonSet 保持一致
metadata元数据,定义 DaemonSet 名字的
spec定义容器的
status状态信息,不能改
[root@k8s-master01 ~]# kubectl  explain ds.spec
字段作用
minReadySeconds当新的 pod 启动几秒种后,再 kill 掉旧的 pod。
revisionHistoryLimit历史版本
selector -required-用于匹配 pod 的标签选择器
template -required-定义 Pod 的模板,基于这个模板定义的所有 pod 是一样的
updateStrategydaemonset 的升级策略
[root@k8s-master01 ~]# kubectl  explain ds.spec.template
字段作用
containers容器配置列表。每个元素都描述了一个要运行在Pod内的容器。
initContainers化容器配置列表。这些容器在主容器之前运行,用于设置环境或执行预备工作。
ephemeralContainers临时容器配置列表。这些容器是临时的,仅在Pod运行时存在。
restartPolicyPod的重启策略。可以是Always、OnFailure或Never。
terminationGracePeriodSeconds优雅终止周期,以秒为单位。在强制终止Pod前,系统将等待此周期内的终止。
activeDeadlineSecondsPod活动的截止时间,超过此时间系统将杀死Pod。
dnsPolicyPod的DNS策略,可以是ClusterFirst、ClusterFirstWithHostNet、Default或None。
ContextPod的安全上下文,用于设置Pod的安全相关属性,如RBAC规则、SELinux标签等。
schedulerName调度器名称,用于指定用于调度Pod的特定调度器。
tolerationsPod容忍的污点,用于允许Pod调度到有特定污点的节点上。
affinityPod的亲和性设置,用于指定Pod偏好或必须运行的节点属性。
hostNetwork如果设置为true,P将使用主机的网络命名空间。
imagePullSecrets用于获取镜像的密钥,这些密钥会被注入到Pod中。
configMapConfigMap的名称和键值对列表,用于注入配置数据到Pod
secretSecret的名称和键值对列表,用于注入敏感数据到Pod。
volumeMounts卷挂载配置列表,用于指定Pod中容器如何挂载卷。
volumes卷配置列表,为Pod中的容器存储卷。

清单模版

apiVersion: apps/v1
kind: DaemonSet
metadata:name: pod-controller                      # ds名称                      labels:                                   # 给ds打标签controller: daemonset
spec:revisionHistoryLimit: 3                   # 保留历史版本数量,默认为10updateStrategy:                           # Pod更新策略,默认是RollingUpdatetype: RollingUpdate                     # 滚动更新策略。另一种是OnDelete,其没有子属性配置参数 rollingUpdate:                          # 当type为RollingUpdate的时候生效,为其配置参数maxSurge: 25%                         # 升级过程中可以超过期望的Pod的最大数量,可以为百分比,也可以为整数。默认是25%maxUnavailable: 25%                   # 升级过程中最大不可用状态的Pod数量,可以为百分比,也可以为整数。默认是25%selector:                                 # 选择器,通过该控制器管理哪些podmatchLabels:                            # Labels匹配规则。和matchExpressions类似app: nginx-pod                        ###或者matchExpressions:                     # Expressions匹配规则。和matchLabels类似 - {key: app, operator: 'In', values: ["nginx-pod"]} template:                                 # pod副本创建模板。属性和Pod的属性一样metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:latestports:- name: nginx-portcontainerPort: 80protocol: TCP

三、DaemonSet 使用案例

[root@k8s-master01 ~]# cat pod-controller.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:name: pod-controllerlabels:controller: daemonset
spec:selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:latestports:- name: nginx-portcontainerPort: 80protocol: TCP 
##查看
[root@k8s-master01 ~]# kubectl apply -f pod-controller.yaml 
daemonset.apps/pod-controller created
http://www.lryc.cn/news/620828.html

相关文章:

  • 深入解析 HTTP 协议演进:从 1.0 到 3.0
  • 怎么判断晶振的好坏,有什么简单的办法
  • .NET 的 WebApi 项目必要可配置项都有哪些?
  • 【论文阅读-Part1】PIKE-RAG: sPecIalized KnowledgE and Rationale Augmented Generation
  • 机器学习算法篇(八)-------svm支持向量机
  • Android数据缓存目录context.getCacheDir与Environment.getExternalStorageDirectory
  • Linux 文件系统简介
  • 【大模型私有化部署】实战部分:Ollama 部署教程
  • 芯片 讲解| DP7272—24位、192kHz立体声音频编解码器
  • 百川开源大模型Baichuan-M2的医疗能力登顶第一?
  • Mybatis Plus 分页插件报错`GOLDILOCKS`
  • week1-[分支结构]中位数
  • imx6ull-驱动开发篇24——Linux 中断API函数
  • Docker 入门与实战:从环境搭建到项目部署
  • Windows批处理脚本自动合并当前目录下由You-get下载的未合并的音视频文件
  • 【Unity3D实例-功能-移动】角色行走和奔跑的相互切换
  • AI智能体|扣子(Coze)搭建【批量识别发票并录入飞书】Agent
  • Cookie、Session、Token详解
  • 如何在 Ubuntu 24.04 LTS Noble Linux 上安装 Wine HQ
  • OpenCV对椒盐处理后的视频进行均值滤波处理
  • 短剧小程序系统开发:赋能创作者,推动短剧艺术创新发展
  • 【软件测试】自动化测试 — selenium快速上手
  • BitDock——让你的Windows桌面变为Mac
  • 如何查看SQL Server的当前端口
  • filezilla mac新版本MacOS-12.6.3会自动进入全屏模式BUG解决方法
  • 我的第一个开源项目-jenkins集成k8s项目
  • 软件测试中,常用的抓包工具有哪些?抓包的原理是什么?
  • FPGA读取AHT20温湿度模块思路及实现,包含遇到的问题(IIC协议)
  • 快速部署一个鉴黄服务
  • React数据请求