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.
是k8s中最常用的资源对象,为ReplicaSet和Pod的创建提供了一种声明式的定义方法。
声明式定义是指直接修改资源清单yaml文件,然后通过kubectlapply -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> #挂载存储卷
字段说明:
ReplicaSet的名称始终设置为[DEPLOYMENT-NAME]-[RANDOM-STRING]。
Pod名称为[DEPLOYMENT-NAME]-[RANDOM-STRING]-[RANDOM-STRING]。
RANDOM-STRING是随机生成的
# 镜像升级 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=数量