DaemonSet 简介
DaemonSet 确保全副(或者一些)Node 上运行一个 Pod 的正本。当有 Node 退出集群时,也会为他们新增一个 Pod。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创立的所有 Pod
- 应用 DaemonSet 的一些典型用法:
- 运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph
- 在每个 Node 上运行日志收集 daemon,例如 fluentd、logstash
- 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond
默认会在每个节点运行一个 Pod (master 节点除外)或依据标签匹配抉择运行的节点
DaemonSet 配置标准
apiVersion: apps/v1 # API 群组及版本
kind: DaemonSet# 资源类型特有标识
metadata:
name <string> #资源名称, 在作用域中要惟一
namespace <string> #名称空间;DaemonSet 资源附属名称空间级别
spec:
minReadySeconds <integer> # Pod 就绪后多少秒内任一容器无 crash 方可视为“就绪”selector <object> #标签选择器,必须匹配 template 字段中 Pod 模板中的标签
template <object> #Pod 模板对象;
revisionHistoryLimit <integer> #滚动更新历史记录数量,默认为 10;
updateStrategy <0bject> #滚动更新策略
type <string> #滚动更新类型,可用值有 OnDelete 和 Rollingupdate;
rollingUpdate <Object> #滚动更新参数,专用于 RollingUpdate 类型
maxUnavailable <string> #更新期间可比冀望的 Pod 数量短少的数量或比例
示例 1: 新建 DaemonSet 控制器 部署 node-exporter
[root@k8s-master PodControl]# cat daemonset-demo.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-demo
namespace: default
labels:
app: prometheus
component: node-exporter
spec:
selector:
matchLabels:
app: prometheus
component: node-exporter
template:
metadata:
name: prometheus-node-exporter
labels:
app: prometheus
component: node-exporter
spec:
containers:
- image: prom/node-exporter:v0.18.0
name: prometheus-node-exporter
ports:
- name: prom-node-exp
containerPort: 9100
hostPort: 9100
livenessProbe:
tcpSocket :
port: prom-node-exp
initialDelaySeconds: 3
readinessProbe:
httpGet:
path: '/metrics'
port: prom-node-exp
scheme: HTTP
initialDelaySeconds: 5
hostNetwork: true
hostPID: true
[root@k8s-master PodControl]# kubectl apply -f daemonset-demo.yaml
daemonset.apps/daemonset-demo created
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
deployment-demo-77d46c4794-fhz4l 1/1 Running 0 16h
deployment-demo-77d46c4794-kmrhn 1/1 Running 0 16h
deployment-demo-fb544c5d8-5f9lp 1/1 Running 0 17h
[root@k8s-master PodControl]# cat daemonset-demo.yaml
...
spec:
containers:
- image: prom/node-exporter:latest #更新为最新版
...
#默认为滚动更新
[root@k8s-master PodControl]# kubectl apply -f daemonset-demo.yaml && kubectl rollout status daemonset/daemonset-demo
daemonset.apps/daemonset-demo created
Waiting for daemon set "daemonset-demo" rollout to finish: 0 of 3 updated pods are available...
Waiting for daemon set "daemonset-demo" rollout to finish: 1 of 3 updated pods are available...
Waiting for daemon set "daemonset-demo" rollout to finish: 2 of 3 updated pods are available...
daemon set "daemonset-demo" successfully rolled out
Job 的简介及 配置标准
Job 负责批处理工作,即仅执行一次的工作,它保障批处理工作的一个或多个 Pod 胜利完结
Job 配置标准
apiVersion: batch/v1 #API 群组及版本
kind: Job #资源类型特有标识
metadata:
name <string> #资源名称, 在作用域中要惟一
namespace <string> #名称空间;Job 资源附属名称空间级别
spec:
selector <object> #标签选择器,必须匹配 template 字段中 Pod 模板中的标签
template <object> #Pod 模板对象
completions <integer> #冀望的胜利实现的作业次数,胜利运行完结的 Pod 数量
ttlSecondsAfterFinished <integer> #终止状态作业的生存时长,超期将被删除
parallelism <integer> #作业的最大并行度, 默认为 1
backoffLimit <integer> #将作业标记为 Failed 之前的重试次数,默认为 6
activeDeadlineSeconds <integer> #作业启动后可处于活动状态的时长
restartPolicy <string> #重启策略
#1. Always: 容器生效时,kubelet 主动重启该容器;#2. OnFailure: 容器终止运行且退出码不为 0 时重启;#3. Never: 不管状态为何,kubelet 都不重启该容器。
示例 2: 创立 Job 控制器 实现 2 次工作
[root@k8s-master PodControl]# cat job-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
spec:
containers:
- name: myjob
image: alpine:3.11
imagePullPolicy: IfNotPresent
command: ["/bin/sh" , "-c", "sleep 60"]
restartPolicy: Never
completions: 2 #实现 2 次 没有配置并行 所以是单队列 实现 1 次后在启动一次
ttlSecondsAfterFinished: 3600 #保留 1 个小时
backoffLimit: 3 #重试次数 默认为 6 改为 3
activeDeadlineSeconds: 300 #启动后的存活时长
[root@k8s-master PodControl]# kubectl apply -f job-demo.yaml
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
daemonset-demo-4zfwp 1/1 Running 0 20m
daemonset-demo-j7m7k 1/1 Running 0 20m
daemonset-demo-xj6wc 1/1 Running 0 20m
job-demo-w4nkh 0/1 ContainerCreating 0 2s
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
daemonset-demo-4zfwp 1/1 Running 0 22m
daemonset-demo-j7m7k 1/1 Running 0 22m
daemonset-demo-xj6wc 1/1 Running 0 22m
job-demo-vfh9r 1/1 Running 0 49s #串行运行
job-demo-w4nkh 0/1 Completed 0 2m5s #已实现
[root@k8s-master PodControl]# cat job-para-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-para-demo
spec:
template:
spec:
containers:
- name: myjob
image: alpine:3.11
imagePullPolicy: IfNotPresent
command: ["/bin/sh" , "-c", "sleep 60"]
restartPolicy: Never
completions: 12 #实现 12 次
parallelism: 2 #同时运行 2 个 个 2 个 Pod 同时运行
ttlSecondsAfterFinished: 3600
backoffLimit: 3
activeDeadlineSeconds: 1200
[root@k8s-master PodControl]# kubectl apply -f job-para-demo.yaml
job.batch/job-para-demo created
[root@k8s-master PodControl]# kubectl get job
NAME COMPLETIONS DURATION AGE
job-demo 2/2 2m25s 11m
job-para-demo 10/12 6m37s 7s
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
daemonset-demo-4zfwp 1/1 Running 0 25m
daemonset-demo-j7m7k 1/1 Running 0 25m
daemonset-demo-xj6wc 1/1 Running 0 25m
deployment-demo-fb544c5d8-lj5gt 0/1 Terminating 0 17h
deployment-demo-with-strategy-59468cb976-vkxdg 0/1 Terminating 0 16h
job-demo-vfh9r 0/1 Completed 0 3m41s
job-demo-w4nkh 0/1 Completed 0 4m57s
job-para-demo-9jtnv 0/1 ContainerCreating 0 7s #同一时间并行数为 2 个 共循环 6 次
job-para-demo-q2h6g 0/1 ContainerCreating 0 7s
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
daemonset-demo-4zfwp 1/1 Running 0 30m
daemonset-demo-j7m7k 1/1 Running 0 30m
daemonset-demo-xj6wc 1/1 Running 0 30m
job-demo-vfh9r 0/1 Completed 0 9m38s
job-demo-w4nkh 0/1 Completed 0 10m
job-para-demo-8fz78 0/1 Completed 0 3m48s
job-para-demo-9jtnv 0/1 Completed 0 6m4s
job-para-demo-bnw47 0/1 Completed 0 2m42s
job-para-demo-dsmbm 0/1 Completed 0 96s
job-para-demo-j4zw5 1/1 Running 0 30s
job-para-demo-jkbw4 0/1 Completed 0 4m55s
job-para-demo-l9pwc 0/1 Completed 0 96s
job-para-demo-lxxrv 1/1 Running 0 30s
job-para-demo-nljhg 0/1 Completed 0 4m55s
job-para-demo-q2h6g 0/1 Completed 0 6m4s
job-para-demo-rc9qt 0/1 Completed 0 3m48s
job-para-demo-xnzsq 0/1 Completed 0 2m42s
cronJob 简介及字段格局
Cron Job 治理基于工夫的 Job,即:
- 在给定工夫点只运行一次
- 周期性地在给定工夫点运行
** 应用前提条件:以后应用的 Kubernetes 集群,版本 >= 1.8(对 CronJob)。对于先前版本的集群,版本 < 1.8,启动 API Server 时,通过传递选项 –runtime-config=batch/v2alpha1=true 能够开启 batch/v2alpha1
API**
典型的用法如下所示:
1. 在给定的工夫点调度 Job 运行
2. 创立周期性运行的 Job,例如:数据库备份、发送邮件
cronJob 借助 Job 来实现工作 他们的有关系相似 Deployment 与 ReplicaSet 的关系
cronJob 配置标准
apiVersion: batch/v1betal #API 群组及版本
kind: CronJob #资源类型特有标识
metadata:
name <string> #资源名称, 在作用域中要惟一
namespace <string> #名称空间; CronJob 资源附属名称空间级别
spec:
jobTemplate <object> #job 作业模板, 必选字段
metadata <object> #模板元数据
spec_<object> #作业的冀望状态
schedule string> #调度工夫设定, 必选字段
concurrencyPolicy <string> #并发策略,可用值有 Allow、Fprbid 和 Replace 指前一个工作还没有执行完 下一个工作工夫又到了, 是否容许两个工作同时运行
failedJobsHistoryLimit <integer> #失败作业的历史记录数,默认为 1
successfulJobsHistoryLimit <integer> #胜利作业的历史记录数,默认为 3
startingDeadlineSeconds <integer> #因错过工夫点而未执行的作业的可超期时长
suspend <boolean> #是否挂起后续的作业,不影响以后作业,默认为 false
示例 3 : 创立 cronJob 每 2 分钟执行 1 次工作
[root@k8s-master PodControl]# cat cronjob-demo.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
namespace: default
spec:
schedule: "*/2 * * * *" #第 2 分种执行一次 和 Linux 定时工作一样别离是 分 时 日 月 周
jobTemplate:
metadata:
labels:
controller: cronjob-demo
spec: #Job 的定义
parallelism: 1 #并行数为 1
completions: 1 #执行 1 次
ttlSecondsAfterFinished: 600 #实现 600 后删除
backoffLimit: 3 #最多执行 3 次
activeDeadlineSeconds: 60
template:
spec:
containers:
- name: myjob
image: alpine
command:
- /bin/sh
- -c
- date; echo Hello from cronJob, sleep a while...; sleep 10
restartPolicy: OnFailure #容器终止运行且退出码不为 0 时重启
startingDeadlineSeconds: 300
[root@k8s-master PodControl]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-demo */2 * * * * False 0 <none> 58s
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cronjob-demo-1629169560-vn8hk 0/1 ContainerCreating 0 12s
daemonset-demo-4zfwp 1/1 Running 0 51m
daemonset-demo-j7m7k 1/1 Running 0 51m
daemonset-demo-xj6wc 1/1 Running 0 51m
StatefulSet 无状态利用控制器
StatefulSet 作为 Controller 为 Pod 提供惟一的标识。它能够保障部署和 scale 的程序
StatefulSet 是为了解决有状态服务的问题(对应 Deployments 和 ReplicaSets 是为无状态服务而设计),其利用
场景包含:
- 稳固的长久化存储,即 Pod 从新调度后还是能拜访到雷同的长久化数据,基于 PVC 来实现
- 稳固的网络标记,即 Pod 从新调度后其 PodName 和 HostName 不变,基于 Headless Service(即没 Cluster IP 的 Service)来实现
- 有序部署,有序扩大,即 Pod 是有程序的,在部署或者扩大的时候要根据定义的程序顺次顺次进行(即从 0 到 N -1,在下一个 Pod 运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态),基于 init containers 来实现有序
- 膨胀,有序删除(即从 N - 1 到 0)
- StatefulSet: 通用的有状态利用控制器
每个 Pod 都有本人的惟一标识,故障时,它只能被领有同一标识的新实例所取代;
${STATEFULSET_NAME}-${ORDINAL},web-O, web-1,web-2,如果更新和删除都是从逆序从最初一个开始 StatefulSet 强依赖于 Headless Service 无头服务创立 Pod 惟一标识 确定域名解析到能解析到惟一 Pod 之上如果有必要,能够为被 Pod 配置专用的存储卷,且只能是 PVC 格局;
StatefulSet 配置标准:
apiVersion:apps/v1 #API 群组及版本;
kind: StatefulSet #资源类型的特有标识
metadata:
name <string> #资源名称, 在作用域中要惟一
namespace <string> #名称空间;StatefulSet 附属名称空间级别
spec:
replicas <integer> #冀望的 Pod 正本数, 默认为 1
selector <object> #标签选择器,须匹配 Pod 模板中的标签,必选字段
template <object> #Pod 模板对象,必选字段
revisionHistoryLimit <integer> #滚动更新历史记录数量,默认为 10
updateStrategy'<object> #滚动更新策略
type <string> #滚动更新类型,可用值有 OnDelete 和 Rollingupdate
rollingUpdate <object> #滚动更新参数, 专用于 RollingUpdate 类型
partition <integer> #分区批示索引值, 默认为 0 如果为 2 示意只更新序号大于 2 的 Pod
serviceName <string> #相干的 Headless Service 的名称,必选字段
volumeclaimTemplates <[]0bject> #存储卷申请模板
apiVersion <string> #PVC 资源所属的 API 群组及版本,可省略
kind <string> #PVc 资源类型标识, 可省略
metadata <object># 卷申请模板元数据
spec <object># 冀望的状态, 可用字段同 PVC
podManagementPolicy <string> # Pod 管理策略,默认的“OrderedReady" 示意程序创
# 建并逆序删除, 另一可用值“Parallel" 示意并行模式
示例 4: 创立 StatefulSet 控制器
[root@k8s-master PodControl]# cat statefulset-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: demoapp-sts
namespace: default
spec:
clusterIP: None #发明无头服务
ports:
- port: 80
name: http
selector:
app: demoapp
controller: sts-demo
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sts-demo
spec:
serviceName: demoapp-sts #绑定无头服务
replicas: 2
selector:
matchLabels :
app: demoapp
controller: sts-demo
template: #以下为 Pod 模板
metadata:
labels:
app: demoapp
controller: sts-demo
spec:
containers:
- name: demoapp
image: ikubernetes/demoapp:v1.0 #不是无状态服务 只模仿 StatefulSet 创立过程
ports:
- containerPort: 80
name: web
volumeMounts:
- name: appdata
mountPath: /app/data
volumeClaimTemplates:
- metadata:
name: appdata
spec:
accessModes: ["ReadWriteOnce"] #单路读写
storageClassName: "longhorn" #应用之前创立的 sc
resources:
requests:
storage: 2Gi
[root@k8s-master PodControl]# kubectl apply -f statefulset-demo.yaml
service/demoapp-sts created
#Pod 是按序创立 先发明实现第 1 个才会发明 2 个 Pod
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
sts-demo-0 0/1 ContainerCreating 0 12s
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
sts-demo-0 1/1 Running 0 29s
sts-demo-1 0/1 ContainerCreating 0 9s
示例 4: StatefulSet 扩容、缩容
[root@k8s-master PodControl]# cat demodb.yaml
# demodb ,an educational Kubernetes-native NoSQL data store. It is a distributed
# key-value store,supporting permanent read and write operations.
# Environment Variables: DEMODB_DATADIR,DEMODB_HOST,DEMODB_PORT
# default port: 9907/tcp for clients, 9999/tcp for members.
# Maintainter: MageEdu <mage@magedu. com>
---
apiVersion: v1
kind: Service
metadata:
name: demodb
namespace: default
labels:
app: demodb
spec:
clusterIP: None
ports:
- port: 9907
selector:
app: demodb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: demodb
namespace: default
spec:
selector:
matchLabels:
app: demodb
serviceName: "demodb"
replicas: 3
template:
metadata:
labels:
app: demodb
spec:
nodeName: k8s-node3 #指定节点 测试环境 node 系统资源比拟 富余
containers :
- name: demodb-shard
image: ikubernetes/demodb:v0.1
ports:
- containerPort: 9907
name: db
env:
- name: DEMODB_DATADIR
value: "/demodb/data"
volumeMounts:
- name: data
mountPath: /demodb/data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "longhorn"
resources:
requests:
storage: 1Gi
[root@k8s-master PodControl]# kubectl apply -f demodb.yaml
[root@k8s-master PodControl]# kubectl get sts
NAME READY AGE
demodb 1/3 31s
[root@k8s-master PodControl]# kubectl get pod #按序创立
NAME READY STATUS RESTARTS AGE
centos-deployment-66d8cd5f8b-9x47c 1/1 Running 1 22h
demodb-0 1/1 Running 0 33s
demodb-1 0/1 ContainerCreating 0 5s
[root@k8s-master PodControl]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demodb-0 1/1 Running 0 5m22s 10.244.3.69 k8s-node3 <none> <none>
demodb-1 1/1 Running 0 5m1s 10.244.3.70 k8s-node3 <none> <none>
demodb-2 1/1 Running 0 4m37s 10.244.3.71 k8s-node3 <none> <none>
[root@k8s-master PodControl]# kubectl get pvc # PVC 绑定胜利
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-demodb-0 Bound pvc-bef2c61d-4ab4-4652-9902-f4bc2a918beb 1Gi RWO longhorn 14m
data-demodb-1 Bound pvc-2ebb5510-b9c1-4b7e-81d0-f540a1451eb3 1Gi RWO longhorn 9m8s
data-demodb-2 Bound pvc-74ee431f-794c-4b3d-837a-9337a6767f49 1Gi RWO longhorn 8m
- 新开启一个终端 测试应用
[root@k8s-master PodControl]# kubectl run pod-$RANDOM --image=ikubernetes/admin-box:latest -it --rm --command -- /bin/sh
root@pod-31692 # nslookup -query=A demodb #解析测试
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: demodb.default.svc.cluster.local
Address: 10.244.3.69
Name: demodb.default.svc.cluster.local
Address: 10.244.3.71
Name: demodb.default.svc.cluster.local
Address: 10.244.3.70
root@pod-31692 # nslookup -query=PTR 10.244.3.70 #对 IP 进行反解析
Server: 10.96.0.10
Address: 10.96.0.10#53
70.3.244.10.in-addr.arpa name = demodb-1.demodb.default.svc.cluster.local. #解析对惟一 Pod
root@pod-31692 # nslookup -query=PTR 10.244.3.71
Server: 10.96.0.10
Address: 10.96.0.10#53
71.3.244.10.in-addr.arpa name = demodb-2.demodb.default.svc.cluster.local. #解析对惟一 Pod
root@pod-31692 # echo "www.google.com" >/tmp/data
root@pod-31692 # curl -L -XPUT -T /tmp/data http://demodb:9907/set/data #通过 svc 上传数据 数据上传 set 下载 get
WRITE completedroot
root@pod-31692 # curl http://demodb:9907/get/data #尽管位于不同的 PV 不同 Pod 之前会同步数据 保持数据的一致性
www.google.com
- 更新: 如果是更新镜你 能够用 set 命令 或 编译 yaml 文件 还能够用 patch 打补丁
# 编译 yaml 文件 image 版本为 v0.2
[root@k8s-master PodControl]# kubectl apply -f demodb.yaml
service/demodb unchanged
statefulset.apps/demodb configured
[root@k8s-master PodControl]# kubectl get sts -o wide
NAME READY AGE CONTAINERS IMAGES
demodb 2/3 18m demodb-shard ikubernetes/demodb:v0.2 #之前说过是逆序更新 demodb-2 最先更新
[root@k8s-master PodControl]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
centos-deployment-66d8cd5f8b-9x47c 1/1 Running 1 22h 10.244.1.160 k8s-node1 <none> <none>
demodb-0 1/1 Running 0 18m 10.244.3.69 k8s-node3 <none> <none>
demodb-1 1/1 Running 0 18m 10.244.3.70 k8s-node3 <none> <none>
demodb-2 0/1 ContainerCreating 0 16s <none> k8s-node3 <none> <none>
- 扩缩容 Pod 也是逆序执行
# 应用 patch 打补丁批改正本数
[root@k8s-master PodControl]# kubectl patch sts/demodb -p '{"spec":{"replicas":5}}' #扩容数量为 5
statefulset.apps/demodb patched
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demodb-0 1/1 Running 0 6m43s
demodb-1 1/1 Running 0 7m3s
demodb-2 1/1 Running 0 7m53s
demodb-3 0/1 ContainerCreating 0 10s
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demodb-0 1/1 Running 0 6m52s
demodb-1 1/1 Running 0 7m12s
demodb-2 1/1 Running 0 8m2s
demodb-3 0/1 ContainerCreating 0 19s
[root@k8s-master PodControl]# kubectl patch sts/demodb -p '{"spec":{"replicas":2}}' #缩容数据为 2 逆序缩
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demodb-0 1/1 Running 0 9m19s
demodb-1 1/1 Running 0 6m9s
demodb-2 1/1 Running 0 5m25s
demodb-3 1/1 Running 0 2m18s
demodb-4 0/1 Terminating 0 83s
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demodb-0 1/1 Running 0 10m
demodb-1 1/1 Running 0 7m34s
demodb-2 1/1 Running 0 6m50s
demodb-3 1/1 Terminating 0 3m43s
[root@k8s-master PodControl]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demodb-0 1/1 Running 0 12m
demodb-1 1/1 Running 0 9m46s
pod-31692 1/1 Running 0 85m
#测试数据一致性 尽管不同位于的 PV 不同 Pod 之前会同步数据 保持数据的一致性
root@pod-31692 # curl http://demodb:9907/get/data
www.google.com