- 通过kind为Pod定义的资源是一个自主式pod,如果pod被删除了,pod不会自我恢复,如果连yaml文件也找不到了,那只能卷铺盖跑路了。Replicaset(副本控制器)创建的pod,可以管理pod维持在固定的个数,并可以实现pod的动态扩缩容。Deployment 功能更加强大,在replicaset的基础上增加了滚动更新等功能。
Replicaset
k8s中的一种副本控制器,主要作用是控制其管理的pod,使pod副本数始终维持在一定数量,他会监听这些pod,故障会重启,pod减少会创建。
组成部分:
1 、用户期望的pod副本数,用来定义这个控制器管理的副本数量。
2、标签选择器,选择管理的pod.
3、pod资源模版,根据模版创建pod
资源清单示例:
kubectl explain rs
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-test
labels:
rs: test
spec:
# 副本数
replicas: 2
# 选择管理pod标签
selector:
matchLabels:
rs: test
template:
metadata:
name: rs-test-dmoe
labels:
rs: test
spec:
containers:
- name: ts
image: nginx
ports:
- containerPort: 80
可以通过edit编辑 Replicaset 或yaml文件 中 replicas?修改副本数完成扩缩容
命令扩缩容:
kubectl ?scale ?资源类型? 资源名称? --replicas=3
通过观察发现?Replicaset 名字为 父级元数据定义的名称,Pod名为Replicaset-随机数
?Replicaset 不具有更新功能,只有新建的pod才会使用新的镜像。
扩展:
蓝绿发布:原有的一个控制器rs1,在创建另一个控制器rs2.通过修改service标签使之匹配到rs2.
Deployment (推荐使用)
是k8s中最常用的资源对象,为ReplicaSet和Pod的创建提供了一种声明式的定义方法。
声明式定义是指直接修改资源清单yaml文件,然后通过kubectl?apply?-f 资源清单yaml文件,就可以更改资源。
Deployment控制器是建立在rs之上的一个控制器,可以管理多个rs,每次更新镜像版本,都会生成一个新的rs,把旧的rs替换掉,多个rs同时存在,但是只有一个rs运行
通过一个Deployment会创建一个新的Replicaset控制器,通过Replicaset会创建和管理pod,删除Deployment控制器之下的所有资源也会被删除。
使用Deployment而不是Replicaset,因为Deployment下可以有多个Replicaset,滚动更新或升级时,Deployment会创建新的Replicaset,通过Replicaset操作Pod完成升级,回滚时使用指定的Replicaset,在把pod重新创建出来完成回滚。
可以实现:
1、创建ReplicaSet和Pod
2、滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)
3、平滑地扩容和缩容
4、暂停和继续Deployment
资源清单示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-test
labels:
dep: app1
spec:
# 定义rs
# minReadySeconds 在等待设置的时间后才进行升级,默认无等待
# paused 暂停,更新时先暂停服务 默认不暂停
# progressDeadlineSeconds 升级过程中有可能由于各种原因升级卡住(这个时候还没有明确的升级失败),比如在拉取被墙的镜像,权限不够等错误。那么这个时候就需要有个 deadline ,在 deadline 之内如果还卡着,那么就上报这个情况,这个时候这个 Deployment 状态就被标记为 False,并且注明原因。但是它并不会阻止 Deployment 继续进行卡住后面的操作。完全由用户进行控制。
# 副本数
replicas: 2
# 保留历史版本数量 默认10
# revisionHistoryLimit
# 更新策略
# strategy:
# 只有类型为滚蛋更新时,可以配置最大副本数和最少副本数
# rollingUpdate:
# 创建的最大数量,最多允许超出的指定的目标副本数有几个;
# maxSurge:
# 删除的最大数量,假设有5个副本,最多一个不可用,就表示最少有4个可用
# maxUnavailable:
# 类型分两种,重新创建(先删除后创建)和滚动更新(先创建后删除),默认滚动更新
# type:
# 选择管理的pod
selector:
matchLabels:
dep: app1-pod
template:
metadata:
name: deploy-pod
labels:
dep: app1-pod
spec:
containers:
- name: app-cont
image: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: /tmpdir
name: vol-dep
volumes:
- name: vol-dep
persistentVolumeClaim:
claimName: test-pvc
# 配置dns服务器
dnsConfig:
# 服务器地址
nameservers:
- 192.168.1.1
# 添加解析后缀名
searches:
- 123.cn
# 配置dns策略,默认使用集群dns(ClusterFirst)
# dnsPolicy: ClusterFirst
# None 无任何策略:使用自定义的策略
# Default 默认:使用宿主机的dns配置,/etc/resolv.conf
# ClusterFirst 集群DNS优先,与 Default 相反,会预先使用 kube-dns (或 CoreDNS ) 的信息当预设置参数写入到该 Pod 内的DNS配置。
# ClusterFirstWithHostNet 集群 DNS 优先,并伴随着使用宿主机网络:同时使用 hostNetwork 与 kube-dns 作为 Pod 预设 DNS 配置
# 给容器hosts文件添加域名解析
# 在pod中增加域名解析的
? hostAliases:
? – ip: 192.166.111.111
? ? hostnames:
? ? – www.123.com
dnsconfig 展示
配置前
?配置后
hostAliases 展示
?其他字段
hostIPC <boolean> #使用主机IPC
hostNetwork <boolean> #是否使用宿主机的网络
hostPID <boolean> #可以设置容器里是否可以看到宿主机上的进程。True可以
hostname <string>
imagePullSecrets <[]Object>
#定义初始化容器
initContainers <[]Object>
#定义pod调度到具体哪个节点上
nodeName <string>
#定义节点选择器
nodeSelector <map[string]string>
#overhead是1.16引入的字段,在没有引入 Overhead 之前,只要一个节点的资源可用量大于等于 Pod 的 requests 时,这个 Pod 就可以被调度到这个节点上。引入 Overhead 之后,只有节点的资源可用量大于等于 Overhead 加上 requests 的和时才能被调度上来。
overhead <map[string]string>
preemptionPolicy <string>
priority <integer>
priorityClassName <string>
readinessGates <[]Object>
restartPolicy <string> #Pod重启策略
runtimeClassName <string>
schedulerName <string>
securityContext <Object> #是否开启特权模式
serviceAccount <string>
serviceAccountName <string>
setHostnameAsFQDN <boolean>
shareProcessNamespace <boolean>
subdomain <string>
terminationGracePeriodSeconds <integer>
#在真正删除容器之前,K8S会先发终止信号(kill -15 {pid})给容器,默认30s
tolerations <[]Object> #定义容忍度
topologySpreadConstraints <[]Object>
volumes <[]Object> #挂载存储卷
?字段说明:
- 1.NAME?:列出名称空间中deployment的名称。
- 2.READY:显示deployment有多少副本数。它遵循ready/desired的模式。
- 3.UP-TO-DATE:?显示已更新到所需状态的副本数。
- 4.AVAILABLE:?显示你的可以使用多少个应用程序副本。
- 5.AGE?:显示应用程序已运行的时间。
- 命名?
-
ReplicaSet的名称始终设置为[DEPLOYMENT-NAME]-[RANDOM-STRING]。 -
Pod名称为[DEPLOYMENT-NAME]-[RANDOM-STRING]-[RANDOM-STRING]。 -
RANDOM-STRING是随机生成的 -
扩容、缩容、滚动更新、回滚 - 扩缩容可以使通过更新yaml文件replicas数量完成。
- 也可以使用命令?kubectl ?scale ?资源类型? 资源名称? --replicas=3
- 滚动更新和回滚
-
# 镜像升级
kubectl set image deployment 应用名 镜像=镜像:版本名
# 查看升级状态
kubectl rollout status deployment 应用名
# 查看历史版本
kubectl rollout history deployment 应用名
# 查看版本详情
kubectl rollout history deployment 应用名 --revision=2
# 版本回滚到上一版本
kubectl rollout undo deployment 应用名
# 版本回滚到指定版本
kubectl rollout undo deployment 应用名 --to-revision=版本号
# 暂停更新操作
kubectl rollout pause deployment 应用名
# 恢复部署操作
kubectl rollout resume deployment 应用名
# 弹性伸缩(通过命令修改副本的数量)
kubectl scale deployment 应用名 --replicas=数量
|