使用Replication Controller、Replica Set 管理 Pod

18 篇文章 0 订阅
9 篇文章 0 订阅


一、使用Replication Controller、Replica Set 管理Pod

我们之前是学习的Pod 的一些基本使用方法,而且我们都是直接来操作 Pod,假如我们现在有一个 Pod 正在提供线上的服务,我们可能遇到以下场景:

  • 某次运营活动非常成功,网站访问量突然暴增
  • 运行当前 Pod 的节点发生故障了, Pod 不能正常提供服务了

第一种情况,可能毕竟好处理,一般活动我们计算一下大概会有多大的访问量,提前多启动几个 Pod 。活动结束之后在把 Pod 杀掉,虽然有点麻烦,但是应该还是能够应对这种情况。

第二种情况,我们可能某天夜里收到大量报警说服务挂了,然后起来打开电脑在另外的节点上重新启动一个新的 Pod 。问题也很好的解决了。

如果我们都人工的去解决遇到的这些问题,似乎又回到了以前刀耕火种的时代,如果有一种工具能够来帮助我们管理 Pod 就好了, Pod 不够了自动帮我自动增加一个, Pod 挂了自动帮我在合适的节点上重新启动一个 Pod ,这样是不是遇到上面的问题我们都不需要手动去解决了。

Kubernetes 为我们提供了这样的资源对象:

  • Replication Controller:用来部署、升级 Pod
  • ReplicaSet:下一代的 Replication Controller
  • Deployment:可以更加方便的管理 Pod 和ReplicaSet

二、Replication Controller(RC)

Replication Controller 简称 (RC),RC 是 Kubernetes 系统中的核心概念之一,简单来说,RC 可以保证在任意时间运行 Pod 的副本数量,能够保证 Pod 总是可用的,如果实际 Pod 数量比指定的多那就结束掉多余的,如果实际数量比指定的少就新启动一些 Pod ,当 Pod 失败,被删除或者挂掉后, RC 都会自动创建新的 Pod 来保证副本数量,所以即使只有一个 Pod,我们也应该使用 RC 来管理我们的 Pod。

如果现在遇到上面两个问题,可能除了第一个不能坐到完全自动化,其余的我们是不是都可以不用担心了,运行 Pod 的节点挂了, RC 检测到 Pod 失败了,就会去合适的节点重新启动一个 Pod 就行,不需要我们手动去创建一个 Pod 了。如果第一种情况的话,在活动开始之前我们给 Pod 指定 10 个副本,结束后将副本数量改成2,这样是不是也远比我们手动去启动,手动去关闭要好的多,而且我们后面还会给大家介绍另外一种资源对象 HPA 可以根据资源的使用情况来进行自动扩缩容。

现在我们来使用 RC 来管理我们前面使用的 Nginx 的 Pod , YAML 文件如下:

apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-demo
  labels:
    name: rc
spec:
  replicas: 3
  selector:
    name: rc
  template:
    metadata:
     labels:
       name: rc
    spec:
     containers:
     - name: nginx-demo
       image: nginx
       ports:
       - containerPort: 80

上面的 YAML:文件相对于我们之前的 Pod 的格式:

  • kind :Replication Controller
  • spec.replicas:指定 Pod 副本数量,默认为1
  • spec.selector:RC 通过该属性来筛选要控制的 Pod
  • spec.template:这就是我们之前的 Pod 的定义的模块,但是不需要 apiServer 和 kind 了
  • spec.template.metedata.labels 注意这里的 Pod 的 labels 要和 spec.selector 相同,这样 RC 就可以来控制当前这个 Pod 了。

这个 YAML 文件中的意思就是定义了一个 RC 资源对象,它的名字叫 rc-demo ,保证一直会有 3 个 Pod 运行, Pod 的镜像是 nginx 镜像。

注意spec.selector和spec.template.metadata.labels这两个字段必须相同,否则会创建失败的,当然我们也可以不写spec.selector,这样就默认与Pod模板中的metadata.labels相同了。所以为了避免不必要的错误的话,不写为好。

然后我们Kauai创建上面的 RC 对象,(保存为rc-demo.yaml)

$ kubectl create -f rc-demo.yaml

查看RC

$ kubectl get rc

查看具体信息

$ kubectl describe rc rc-demo

我们通过 RC 来修改一下Pod 的副本数量为 2 :

$ kubectl apply -f rc-demo.yaml

或者

$ kubectl edit rc rc-demo

而且我们还可以用 RC 来进行滚动升级,比如我们将镜像地址改为:nginx:1.7.9:

$ kubectl rolling-update rc-demo --image=nginx:1.7.9

但是如果我们的 Pod 中多个容器的话,就需要通过修改 YAML 文件来进行修改了:

$ kubectl rolling-update rc-demo -f rc-demo.yaml

三、ReplicaSet (RS)

ReplicaSet 简称 RS ,随着 Kubernetes 的告诉发展,官方已经推荐我们使用 RS 和 Deployment 来代替 RC 了,实际上 RS 和 RC 功能基本一致,目前唯一的一个区别就是 RC 只支持基于等式的 selector (env = dev 或environment = qa),但是 RS 还支持基于集合的 selector (version in (v1.0,v2.0)),这对复杂的运维管理就方便了。

kubectl 命令行工具中关于 RC 的大部分命令同样适用于我们的RS资源对象。不过我们也很少会去单独使用RS,它主要被Deployment这个更加高层的资源对象使用,除非用户需要自定义升级功能或根本不需要升级Pod,在一般情况下,我们推荐使用Deployment而不直接使用Replica Set。
最后我们总结下关于RC/RS的一些特性和作用吧:

  • 大部分情况下,我们可以通过定义一个RC实现的Pod的创建和副本数量的控制
  • RC中包含一个完整的Pod定义模块(不包含apiversion和kind)
  • RC是通过label selector机制来实现对Pod副本的控制的
  • 通过改变RC里面的Pod副本数量,可以实现Pod的扩缩容功能
  • 通过改变RC里面的Pod模板中镜像版本,可以实现Pod的滚动升级功能(但是不支持一键回滚,需要用相同的方法去修改镜像地址)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值