Pod控制器:
Pv pvc 动态PV
Pod控制器:工作负载。WordLoad,用于管理pod的中间层 ,确保pod资源符合预期的状态
预期状态:
- 副本数
- 容器的重启策略
- 镜像的拉取策略
Pod出现故障时的重启等等
Pod控制器的类型:
- replicaset:指定pod的副本的数量
三个组件:
- pod副本数
- 标签选择器,判断哪个pod归自己管理、
- 扩缩容
- deployment控制器,他是在replicaset之上,管理无状态应用,目前是最好的控制器,支持滚动更新和回滚,挺供声明式配置
- Statefulset:控制器的一种,管理有状态的应用,也可以设置副本数,可以扩缩容,pod的序号是固定的,重启之后,pod的名称也不会发生变化
- Daemonset:可以在所有节点部署一个pod,没有副本数,可以限制部署的节点,也是无状态的应用,服务必须是一个守护进程ingress logstash flannel
- Jobs:工作pod控制器,执行完成即可退出,不需要重启,不需要重建
- Cronjob:周期性的定时任务控制器,不需要在后台持续运行
Pod和控制器之间的关系:
- controllers:管理控制器,pod通过label------>selector进行关联
每次有更新,都会把旧的pod全部停止,然后再启动新的实力,服务可能会短暂中断
解析:
Strategy:
RollingUpdate:
MaxSurge:25%
Maxunavailable:25%
这是deployment的默认更新策略
RollingUpdate:滚动更新
Maxunavailable:25%升级过程中,新的pod启动好后,销毁旧的pod数量不能超过希望pod的25%
- 无状态应用,pod名称是无序的,任务所有pod的都是一体的,共享存储NFS,所有deployment下的pod共享一个存储
Stafulset:有状态的应用,pod的名称是有序的,所有pod都是独立的,存储卷也是独立的
顺序0-n,delete也不会改变pod的序号,扩缩容也是有序的扩缩容
创建一个有状态应用的控制器:
Headless service:无头服务
前提特点:必须要有动态PVC,没有ClusterIP
apiVersion: v1
kind: Service
metadata:
name: nginx-web
labels:
app: nginx2
spec:
ports:
- port: 80
targetPort: 80
clusterIP: ""
selector:
app: nginx2
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
labels:
app: nginx2
spec:
replicas: 3
selector:
matchLabels:
app: nginx2
serviceName: "nginx-web"
template:
metadata:
labels:
app: nginx2
spec:
containers:
- name: nginx
image: nginx:1.22
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: html
spec:
accessModes: ["ReadWriteMany"]
storageClassName: "nfs-client-storageclass"
resources:
requests:
storage: 2Gi
都有单独的挂载卷
解析:什么叫无头服务
Headless service:k8s集群当中一种特殊的服务类型,不分配ClusterIP给service,也不会负载均衡到后端的pod,DNS来提供服务的发现和访问。
由于ClusterIP是空的,k8s集群会给每个Headless service中的pod创建一个DNS记录
格式:pod-name Headless service-name namespace.svc.cluster.local
Web-0 nginx-web defaults 本地地址(pod的IP地址)
通过dns直接解析访问pod的IP地址
为什么要用无头协议呢?
有序,独立个体
Deployment的pod是没有名称的,随机字符串,无序,他需要一个集中的ClusterIP来集中统一为pod提供网络
Statefulset是有序的,,pod的名称是固定的,重建之后pod的标识也不变,pod名称也是唯一的标识,系统直接通过pod名称解析IP地址
为什么要有volumeClaimCliamTemplates:
有状态的副本把集群都会涉及持久化存储,每个pod是独立的个体,每个pod都有一个自己专用的存储点
Statefulset在定义的时候就规定了每个pod是不能同一个存储卷,所以才需要动态PV
应用场景:
不是固定节点的应用,不是固定IP的应用
更新发布比较频繁
支持自动伸缩,节点资源不够,可以自动伸缩
如何删除呢
DaemonSet控制器:
核心机制就是确保每个节点上都运行一个pod副本,当node加入集群,也会为他新增一个pod,当node节点从集群当中移除时,pod也会被回收
如何部署daemonset?
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx4-daemon
labels:
app: nginx4
spec:
selector:
matchLabels:
app: nginx4
template:
metadata:
labels:
app: nginx4
spec:
containers:
- name: nginx4
image: nginx:1.22
分别部署在三个节点上
如何指定节点部署:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx4-daemon
labels:
app: nginx4
spec:
selector:
matchLabels:
app: nginx4
template:
metadata:
labels:
app: nginx4
spec:
containers:
- name: nginx4
image: nginx:1.22
nodeSelector:
ingress: "true"
写标签
DaemonSet不需要指定调度策略,默认会在每个节点创建一个pod,除非污点
我们可以通过指定的方式,只把daemonset部署在指定的节点,daemonset他是没有副本数的
以上都是基于控制器创建的方式,基于控制器创建的,要彻底删除pod,必须要删除控制器,delete相当于重启(delete慎重使用)
Job:
job分为两类,1. job普通任务 2.定时任务crontob
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
backoffLimit: 4
对于k8s系统来说,既然定义好了job,你只需要执行一次,或者指挥次数即可,不能一直允许
第一点:必须指定的容器策略,onfailure(一次失败,退出码非0,就会重启容器) never(是不管容器的重启策略,按照backoffLimit来尝试job任务的重试次数,到了规定的失败次数,不会再继续执行)
第二点:执行失败的次数也是受限制的,默认是6次
第三点:更新yml文件要先删除任务,再更新,不能动态更新的
面试题:
问:容器化部署,部署过数据库没有?
答:数据库是核心资产,不会容器化部署
前端你们会容器化部署吗?
Nginx可以容器化部署吗,可以
改正确:
报错,已被重命名
删除pod,执行成功
cronjob:
周期性任务,定期执行,和Linux的crontob一模一样,语法一样
分 时 日 月 周
应用场景:定时备份,可以起到一个通知作用,也可以理解为定时监测(结合探针一起做)
始终会保留三个副本:
如何删除呢
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
concurrencyPokicy: Allow
startingDeadlineSeconds: 15
successfulJobsHistoryLimit: 3
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: centos:7
command: ["/bin/bash","-c","date; echo 科比"]
restartPolicy: Never
总结一下:
五个都是控制器创建的pod
都是依赖于控制器
Deployment:无状态应用,最好用的,也是最多的
StatefulSet:有状态应用,有序的,独立的pod
DaemonSet:无状态应用,不能定义副本数,每个节点都运行一个pod,也可以指定节点
Job:执行一次性的任务,必须要有重启策略,同时默认失败次数是6次,只有失败次数达到,重启才会生效
Cronjob:定时任务,主要就是通知,备份或者探测