Skip to content

云原生08-k8s控制器-Replicaset-Deployment

回顾

  • Pods·是·Kubernetes·中最基本的资源单位,它包含了一个或多个容器,并提供了一个隔离的 环境来运行这些容器。但是,在生产环境中,通常需要运行多个·Pod·实例来提供服务,并需要对这 些实例进行管理。这时候就需要使用·Deployment·和·ReplicaSet·这两种资源。
# 查看资源
$ kubectl api-resources

Replicaset控制器:概念、原理解读

Replicaset概述

假设你有一个容器应用程序,需要在·Kubernetes集群中运行。这个应用程序需要多个相同的 Pod·实例来处理用户请求,以确保应用程序的高可用性和性能。但是,由于Pod·可能会因为各种 原因而停止运行(例如,节点故障、资源不足、应用程序崩溃等),因此你需要一种机制来确保始终 有足够数量的·Pod·实例在运行。

这时候,就可以使用·ReplicaSet·来管理这些·Pod·实例。ReplicaSet·可以定义应该运行多少 个相同的·Pod·实例,以及在某个·Pod·实例失败时如何自动创建新的·Pod·实例来替代。 ReplicaSet·还可以根据资源利用率自动调整·Pod·实例的数量,以确保应用程序始终能够处理用户 请求。

简单来说,ReplicaSet·可以帮助你确保你的应用程序始终能够提供足够的容量和可用性,而无 需手动管理多个·Pod·实例。

Replicaset工作原理:如何管理Pod?

ReplicaSet·的工作原理可以简单概括为:它不断地检查当前集群中的·Pod·副本数量是否符合 用户定义的期望数量,如果数量不足,则会自动创建新的·Pod·副本来满足期望数量,如果数量过 多,则会删除一些·Pod·副本以满足期望数量。

具体来说,当创建一个·ReplicaSet·时,需要定义以下参数: 1、模板(template):指定了要创建的·Pod·的规格和属性; 2、副本数量(replicas):指定了要创建的·Pod·的副本数量; 3、选择器(selector):指定了要选择哪些·Pod·实例,以确保它们的标签与·ReplicaSet·的 标签相匹配。

一旦·ReplicaSet·创建完成,它会不断地监控集群中符合选择器要求的·Pod·实例数量,如果 实际数量小于期望数量,则会自动创建新的·Pod·实例,如果实际数量多于期望数量,则会自动删除 些·Pod·实例。

总之,ReplicaSet·是·Kubernetes·中用来管理·Pod·实例数量的核心组件,它通过自动创建 和删除·Pod·实例来确保应用程序的高可用性和可伸缩性。简写成rs。

Replicaset资源清单文件编写技巧

$ kubectl explain rs

1)apiVersion:表示当前资源使用的·API·版本,通常为"apps/v1"。 2)kind:表示资源类型,即."ReplicaSet"。 3)metadata:包括·name、namespace、labels、annotations·等字段,用于定义 Replicaset·的元数据信息。 4)spec:包括·replicas、selector、template·等字段,用于定义·Replicaset·的规格,包 括副本数、标签选择器和·Pod·模板等。 5)status:包括·replicas、available、Replicas、readyReplicas·等字段,用于记录当前 Replicaset·的状态信息,例如副本数、可用副本数和就绪副本数等。 注意:status·字段是只读的,不能手动修改。

$ kubectl explain rs.spec

1)replicas:表示需要创建的·Pod·副本数。 2)selector:用于匹配要管理的·Pod·的标签选择器,通常是一个·key-value·对,例如 matchLabels: {app:nginx)。 3)template:定义·Pod·的模板,基于该模板创建的所有·Pod·都是相同的。模板中包含了 Pod·的元数据和规格信息,例如·Pod·的名称、标签、容器镜像、容器端口等。

# 它的metadata中name不生效
$ kubectl explain rs.template
# 跟前面pod差不多
$ kubectl explain rs.template.spec
  • activeDeadlineSeconds:定义Pod的运行时间限制(秒)。
  • affinity:用丁定义Pod如何调度到节点上的规则,可指定nodeSelector、nodeAffinity 利lpodAffinity/podAntiAffinity。
  • automountServiceAccountToken:是否自动挂载Service·Account的token到Pod中。
  • containers:定义Pod中的容器列表,该字段是必需的。
  • dnsConfig:定义Pod中的DNS配置,如DNS服务器的IP地址和搜索域。
  • dnsPolicy:定义Pod中的DNS策略,如使用ClusterFirst或Default。
  • enableServiceLinks::是否启用service·account到相邻容器的白动服务链接。
  • ephemeralContainers:定义Pod中的临时容器列表,这些容器具有短暂的生命周期,例如用于调试或临时的数据处理。
  • hostAliases:定义Pod中的hosts文件条日。
  • hostIPC:是否允许容器共享IPC命名空间。
  • nostNetwork:是否将Pod的网络命名空间与主机共亨。
  • hostPID:是否允许容器共享主机PID命名空间。
  • hostUsers:是否允许容器共享主机用户命名空间。
  • hostname:定义Pod的主机名。
  • imagePullSecrets::定义从私有仓库中拉取镜像所需的身价验证信息。
  • initContainers:定义Pod中的初始化容器列表,这些容器在主容器启动之前运行。
  • nodeName:定义Pod所在的节点名称。
  • nodeSelector:用于定义Pod应该调度到哪些节点上。
  • os:定义Pod所在的操作系统类型和版本。
  • overhead:定义Pod需要的CPU、内存和存储资源之外的其他资源。
  • preemptionPolicy:定义Pod 被抢占的行为,如lNever、PreemptLowerPriority 或PreemptNever。
  • priority:定义Pod的调度优先级。
  • priorityClassName:定义Pod使用的调度优先级类名称。
  • readinessGates:定义Pod的就绪探针列表,这些探针川于检查容器是否已准备好接受流量。
  • resourceClaims:定义Pod使用的资源声明列表。
  • restartPolicy:定义Pod 的重启策略,如Always、OnFailure 或Never。
  • runtimeClassName:定义Pod使用的容器运行时类名称。
  • schedulerName:定义Pod使川的调度器名称。
  • schedulingGates:定义Pod的调度探针列表,这些探针用于检查节点是否已准备好接受Pod。
  • securityContext:定义Pod的安全上下文。
  • serviceAccount:定义Pod使用的Service·Account的名称。
  • serviceAccountName:定义Pod使用的Service·Account的名称。
  • setHostnameAsFQDN:是否将Pod的主机名设置为完全限定域名,
  • shareProcessNamespace:是否允许容器共享主机命名空间。如果将此字段设置为true,则在同一Pod 中的容器可以共享主机的 PID 命名空间、IPC命名空间和UTS命名空间。这使得容器之间可以相互查看和访问进程、共享进程、文件系统和其他资源。通常情况下,建议不要将此设置为true,以提高容器之间的安全性和隔离性。

实战:Replicaset使用案例-部署Guestbook留言板

# 工作节点下载
$ ctr -n k8s.io image pull docker.io/yecc/gcr.io-google_samples-gb-frontend:v3

vim replicate.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
        - name: php-redis
          image: yecc/gcr.io-google_samples-gb-frontend:v3
          imagePullPolicy: IfNotPresent
$ kubectl apply -f replicate.yaml 
replicaset.apps/frontend created
$ kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend   3         3         0       6s
$ kubectl get pod -owide 
NAME             READY   STATUS    RESTARTS   AGE     IP               NODE       NOMINATED NODE   READINESS GATES
frontend-r5vnc   1/1     Running   0          6m26s   10.250.209.162   xuegod64   <none>           <none>
frontend-rt6mx   1/1     Running   0          6m26s   10.250.209.161   xuegod64   <none>           <none>
frontend-sdlqt   1/1     Running   0          6m26s   10.250.209.163   xuegod64   <none>           <none>

扩容和缩容

  • 直接改 yaml 文件副本数,然后 apply 重新更新即可
$ ctr -n k8s.io image pull docker.io/janakiramm/myapp:v1
$ ctr -n k8s.io image pull docker.io/janakiramm/myapp:v2
$ ctr -n k8s.io image pull docker.io/ikubernetes/myapp:v2
  • 更新镜像

将yaml文件中镜像进行更改,apply之后不会删除原镜像更新,必须apply之后手动删除原镜像

Deployment控制器:概念、原原理解读

Deployment概述

  • 虽然ReplicaSet已经可以用来控制Pod的副本数量和自动重启,但是ReplicaSet仅仅是Pod 的一个管理器,它只能保证有一定数量的Pod在运行,但是对于如何更新Pod、回滚到历史版本、 扩容缩容等操作,ReplicaSet并不支持或者说不够方便。←
  • 而Deployment则在ReplicaSet的基础上增加了更多的功能,它可以用来部署应用程序,并 且支持更方便的应用程序更新、回滚和扩容缩容操作。Deployment通过定义副本控制器的方式来 管理Pod的副本,它可以方便地进行版本控制,而且支持自动更新和回滚,能够保证应用程序的高 可用性。另外,Deployment还支持滚动升级和滚动回滚,可以在不影响应用程序运行的情况下, 实现无缝升级和回滚操作。

Deployment工作原理:如何管理rs和Pod?

  • Deployment 通过创建和管理 ReplicaSet 和 Pod 来实现对应用的部署和管理。当 Pod 需要更新时,Deployment 会根据新的 Pod 模板创建新的 ReplicaSet,并逐步增加 新的Pod副本,同时逐渐减少旧的ReplicaSet的Pod副本数量,直到新的ReplicaSet 中所有 Pod副本都处于运行状态。 具体来说,Deployment包括以下几个步骤:

1.创建初始的 ReplicaSet 和 Pod:Deployment 根据指定的 Pod 模板创建初始的 ReplicaSet 和 Pod,同时设置Pod 的标签。 2.更新 Pod 模板:当需要更新 Pod 模板时,Deployment 会根据新的Pod 模板创建 一个新的 ReplicaSet,并逐渐增加新的 Pod 副本,同时逐渐减少旧的 ReplicaSet 的 Pod 副本数量,直到新的 ReplicaSet中所有Pod副本都处于运行状态。 3.回滚操作:如果新的 Pod 模板存在问题,需要回滚操作时,Deployment 会根据旧 的Pod 模板创建一个 ReplicaSet,并逐渐增加l旧的ReplicaSet的 Pod 副本数量, 同时逐渐减少新的ReplicaSet的Pod 副本数量,直到旧的 ReplicaSet 中所有 Pod 副本都处于运行状态。 4.扩容和缩容:Deployment可以通过修改ReplicaSet的副本数量来扩容和缩容应 用。

Deployment资源清单文件编写技巧

实战:Deployment使用案例-创建一个web站点

deploy-demo.yaml

apiVersion: apps/vl
kind: Deployment
metadata:
  name: myapp-v1
namespace: blue-green
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      version: v1
  template:
    metadata:
      labels:
        app: myapp
        version: v1
    spec:
      containers:
      - name: myapp
        image: janakiramm/myapp:v1
        imagePuLLPolicy: IfNotPresent
        ports:
        - containerPort: 80
        startupProbe:
          periodSeconds: 5
          initialDelaySeconds: 20
          timeoutSeconds: 10
          httpGet:
            scheme: HTTP
            port: 80
            path: /
        LivenessProbe:
          periodSeconds: 5
          initialDelaySeconds: 20
          timeoutSeconds: 10
          httpGet: /
            scheme: HTTP
            port: 80
            path: /
        readinessProbe:
          periodSeconds: 5
          initialDelaySeconds: 20
          timeoutSeconds: 10
          httpGet: /
            scheme: HTTP
            port: 80
            path: /
$ kubectl create namespace blue-green
$ kubectl get pod  -n blue-green                                                           labels:
NAME                        READY   STATUS    RESTARTS   AGE                                                      app: myapp
myapp-v1-58bdffcdd7-4kxtt   0/1     Running   0          21s                                                      version: v1
myapp-v1-58bdffcdd7-jjb6p   0/1     Running   0          21s                                                  spec:
$ kubectl get deployment                                                                   containers:
No resources found in default namespace.                                                                        - name: myapp
$ kubectl get deployment -n blue-green                                                       image: janakiramm/myapp:v1
NAME       READY   UP-TO-DATE   AVAILABLE   AGE                                                                   imagePuLLPolicy: IfNotPresent
myapp-v1   2/2     2            2           75s 

更新时比replicate多了回滚/镜像更新等功能

Comments