k8s – 控制器(deployment)

2022年9月6日09:14:46
  • 通过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=数量
  • 作者:王小栋857
  • 原文链接:https://blog.csdn.net/qq_25794513/article/details/123505797
    更新时间:2022年9月6日09:14:46 ,共 4338 字。