目录
概念
pod控制器又叫做工作负载workload,它介于k8s集群和节点之间。它属于中间层。它的作用就是确保pod资源符合预期的状态。
pod资源出现故障的时候,会自动重启。对基于控制器创建的pod,delete pod相当于对pod重启,并不能删除pod,必须要把控制器删除,pod也会自动删除。
pod控制器的类型
1. replicaset
结合控制器一块用来控制副本数
2. deployment
最常用的控制器
3. DaemonSet
确保在每个节点上都会部署一个pod用于系统后台的支撑业务。特征:服务是无状态应用,delete pod也相当于重启。
使用场景:需要在每个节点都部署,或者是需要在后台运行的pod 。比如ELK的logstash
注:DaemonSet部署不能指定副本数。
piVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: nginx1
name: nginx1
spec:
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx1
image: nginx:1.22
4. StatefulSet
有状态的部署,pod的名称是固定的,一旦创建永久不变,增加副本数,也是有序的递增。StatefulSet可以指定副本数,里面的pod可以扩容和缩容。
delete pod也是相当于重启,只不过pod的名称不再发生变化。
使用场景:主要用于数据库,数据库必须要有指定的编号,比如redis和ELK中的ES。对数据独立性要求比较高的应用使用StatefulSet。
它的ClusterIP要为空,也就是定义值为None
基于StatefulSet部署的服务的特点:无头服务 headless
有状态的副本需要持久化存储,因为每一个pod都要有一个自己的独立的挂载卷。这里可以用hostpath和动态pv(它会自动给每个pod创建一个挂载卷)
实验:无头服务+StatefulSet
vim statefulSet.yaml
#定义service
apiVersion: v1
kind: Service
metadata:
name: nginx-web
labels:
app: svc1
spec:
ports:
- port: 80
#service的暴露端口
targetPort: 80
#容器的端口
clusterIP: None
selector:
app: nginx1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
labels:
app: nginx1
spec:
replicas: 3
selector:
matchLabels:
app: nginx1
serviceName: "nginx-web"
#这个字段必须要加,名称要和service的名字一致
template:
metadata:
labels:
app: nginx1
spec:
terminationGracePeriodSeconds: 10
#pod被终止时,强制等待容器退出的时间是10秒,也可以在命令行用--force
containers:
- name: nginx
image: nginx:1.22
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
#挂载的模版
- metadata:
name: www
spec:
accessModes: ["ReadWriteMany"]
storageClassName: "nfs-client-storageclass"
resources:
requests:
storage: 1Gi
#用这个模版的作用就是:
#所有的pod都会自动生成一个pv,在存储节点目录创建一个独立的数据卷,不能作为统一的数据同步到容器。
kubectl get pod -o wide
在客户机的/opt/k8s/
总结:StatefulSet就是每个pod独自有一个挂载点目录,不共享目录。
DNS解析:因为是无头服务,k8s集群为这些pod做一个dns的记录
DNS格式:web-0.nginx-web.default.svc.cluster.local
job控制器
job控制器属于任务类型的控制器。
任务类型的控制器有两种:
普通任务 job:使用场景:批量处理脚本,数据库迁移,视频解码等一次性的任务
定时任务 Cronjob:使用场景:需要定期执行的任务,比如环境扫描,健康检查
job普通任务
vim job.yaml
#job,普通类型的任务
apiVersion: batch/v1
kind: Job
metadata:
name: centos
spec:
template:
spec:
containers:
- name: centos
image: centos:7
command: ["/bin/bash","-c","test -e /etc/passwd"]
restartPolicy: Never
#job类型的pod重启只能是never或者OnFailure
backoffLimit: 2
#表示如果任务失败,重试的次数,不加默认是6次
kubectl get jobs.batch 查看job
cronjob 定时任务
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: test1-1
spec:
schedule: "*/1 * * * *"
#定时任务执行的时间周期
concurrencyPolicy: Allow
#要保留的失败的完成作业数,默认是1个
startingDeadlineSeconds: 15
#pod必须在15秒内开始执行定时任务的内容,超过这个时间没有运行,任务不运行而且标记为失败
jobTemplate:
#指定定时任务的执行模版,包括镜像和任务
spec:
template:
spec:
containers:
- name: centos
image: centos:7
command: ["/bin/bash","-c","test -e /etc/passwd"]
restartPolicy: OnFailure
#重启策略也只能是Never和Onfailure
kubectl get cronjobs.batch 查看定时任务