11、k8s控制器Replicaset

我们在定义pod资源时,可以直接创建一个kind:Pod类型的自主式pod,但是这存在一个问题,假如pod被删除了,那这个pod就不能自我恢复,就会彻底被删除,线上这种情况非常危险,所以我们可以使用pod的控制器,所谓控制器就是能够管理pod,监测pod运行状况,当pod发生故障,可以自动恢复pod。也就是说能够代我们去管理pod中间层,并帮助我们确保每一个pod资源始终处于我们所定义或者我们所期望的目标状态,一旦pod资源出现故障,那么控制器会尝试重启pod或者里面的容器,如果一直重启有问题的话那么它可能会基于某种策略来进行重新布派或者重新编排;如果pod副本数量低于用户所定义的目标数量,它也会自动补全;如果多余,也会自动终止pod资源。

1、Replicaset控制器

1.1 Replicaset概述

ReplicaSet是kubernetes中的一种副本控制器,简称rs,主要作用是控制由其管理的pod,使pod

副本的数量始终维持在预设的个数。它的主要作用就是保证一定数量的Pod能够在集群中正常运行,它会持续监听这些Pod的运行状态,在Pod发生故障时重启pod,pod数量减少时重新运行新的Pod副本。

官方推荐不要直接使用ReplicaSet,用Deployments取而代之,Deployments是比ReplicaSet更高级的概念,它会管理ReplicaSet并提供很多其它有用的特性,最重要的是Deployments支持声明式更新,声明式更新的好处是不会丢失历史变更。所以Deployment控制器不直接管理Pod对象,而是由Deployment管理ReplicaSet,再由ReplicaSet负责管理Pod对象。

1.2Replicaset工作原理

Replicaset核心作用在于代用户创建指定数量的pod副本,并确保pod副本一直处于满足用户期望

的数量,起到多退少补的作用,并且还具有自动扩容缩容等机制。

Replicaset控制器主要由三个部分组成:

1、用户期望的pod副本数:用来定义由这个控制器管控的pod副本有几个

2、标签选择器:选定哪些pod是自己管理的,如果通过标签选择器选到的pod副本数量少于我们

指定的数量,需要用到下面的组件

3、pod资源模板:如果集群中现存的pod数量不够我们定义的副本中期望的数量怎么办,需要新

建pod,这就需要pod模板,新建的pod是基于模板来创建的。

2、yaml配置实现Replicaset

bash 复制代码
# 创建replicaset.yaml配置
vi replicaset.yaml
bash 复制代码
apiVersion: apps/v1  # 指定 API 版本,ReplicaSet 属于 apps/v1
kind: ReplicaSet  # 资源类型为 ReplicaSet
metadata:  # 元数据部分
  name: frontend  # ReplicaSet 名称
  namespace: default  # 所在命名空间
  labels:  # ReplicaSet 自身的标签
    app: guestbook  # 应用名标签
    tier: frontend  # 层级标签
spec:  # 期望状态定义
  replicas: 3  # 期望副本数为 3
  selector:  # 选择器,用于管理匹配的 Pod
    matchLabels:  # 标签匹配规则
      tier1: frontend1  # 匹配带有 tier1=frontend1 的 Pod
  template:  # Pod 模板
    metadata:  # Pod 模板的元数据
      labels:  # Pod 模板的标签
        tier1: frontend1  # Pod 标签,必须与 selector 匹配
    spec:  # Pod 模板的规格
      containers:  # 容器列表
        - name: php-redis  # 容器名称
          image: gcr.io/google-samples/gb-frontend:v5  # 容器镜像
          imagePullPolicy: IfNotPresent  # 镜像拉取策略:本地不存在时拉取
          ports:  # 容器端口列表
            - containerPort: 80  # 容器暴露端口 80
          startupProbe:  # 启动探针,判断容器是否启动成功
            periodSeconds: 5  # 探测周期 5 秒
            initialDelaySeconds: 20  # 容器启动后等待 20 秒开始探测
            timeoutSeconds: 10  # 探测超时时间 10 秒
            httpGet:  # HTTP GET 探测方式
              scheme: HTTP  # 使用 HTTP 协议
              port: 80  # 探测端口 80
              path: /  # 探测路径 /
          livenessProbe:  # 存活探针,判断容器是否运行中
            periodSeconds: 5  # 探测周期 5 秒
            initialDelaySeconds: 20  # 容器启动后等待 20 秒开始探测
            timeoutSeconds: 10  # 探测超时时间 10 秒
            httpGet:  # HTTP GET 探测方式
              scheme: HTTP  # 使用 HTTP 协议
              port: 80  # 探测端口 80
              path: /  # 探测路径 /
          readinessProbe:  # 就绪探针,判断容器是否可接收流量
            periodSeconds: 5  # 探测周期 5 秒
            initialDelaySeconds: 20  # 容器启动后等待 20 秒开始探测
            timeoutSeconds: 10  # 探测超时时间 10 秒
            httpGet:  # HTTP GET 探测方式
              scheme: HTTP  # 使用 HTTP 协议
              port: 80  # 探测端口 80
              path: /  # 探测路径 /
bash 复制代码
# 启动pod
kubectl apply -f replicaset.yaml

# 查看rs
kubectl get rs

# 查看pod
kubectl get pods

现在我要验证以下是否k8s会根据replicaset.yaml中的定义保持三个副本在集群中。

bash 复制代码
# 删除其中一个frontend

kubectl delete pod frontend-xfkd9

# 查看pod数量

kubectl get pods

可以看到,我删除其中一个pod之后,果然k8s马上新建了一个frontend-l6n6v的pod,然后在25s之后达到ready,跟预期的效果一样。

再次查看pod,集群中保持了三个pod

3、Replicaset管理pod:扩容、缩容

3.1、Replicaset实现pod的动态扩容

ReplicaSet最核心的功能是可以动态扩容和回缩,如果我们觉得三个副本太少了,想要增加,只需

要修改配置文件replicaset.yaml里的replicas的值即可,原来replicas:3,现在变成replicaset:4,修改之后,执行如下命令更新:

bash 复制代码
# 启动pod
kubectl apply -f replicaset.yaml

# 查看rs
kubectl get rs

# 查看pod
kubectl get pods

3.2、Replicaset实现pod的动态缩容

如果我们觉得4个Pod副本太多了,想要减少,只需要修改配置文件replicaset.yaml里的replicas的值即可,把replicaset:4变成replicas: 3,修改之后,执行如下命令更新:

bash 复制代码
# 启动pod
kubectl apply -f replicaset.yaml

# 查看rs
kubectl get rs

# 查看pod
kubectl get pods
相关推荐
ezreal_pan4 天前
Pod 重启多场景复盘:OOM、日志阻塞、并发 map 读写导致程序崩溃
docker·k8s
cg.family4 天前
containerd 1.6.33 + nerdctl 1.7.6 + Jenkins
k8s
Ningcode_cloud6 天前
Kubernetes 弹性伸缩实验手册:从集群搭建到 HPA / VPA 自动扩缩容
云原生·k8s·prometheus
ZzzZZzzzZZZzzzz…8 天前
K8s---组件
运维·云原生·容器·kubernetes·k8s·k8s组件
张洛闻Eren8 天前
云原生k8s【第八课】: ETCD 备份与恢复
linux·运维·docker·kubernetes·k8s
张洛闻Eren9 天前
云原生k8s【第七课】:集群监控与可观测性
linux·运维·docker·云原生·容器·kubernetes·k8s
Eminem899 天前
9、k8s亲和性与污点容忍度
k8s
鹤落晴春11 天前
有状态应用 vs 无状态应用
运维·云原生·k8s
Eminem8912 天前
8、k8s nodename和nodeSelector调度pod
k8s