V
2
R
A
 
F
R
E
E

k8s – 控制器(deployment)

首页 / 新闻资讯 / 正文
  • 通过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文件,然后通过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>  #挂载存储卷

 字段说明:

  • 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=数量