当前位置:   article > 正文

K8S之ReplicaSet详解_k8s replicaset

k8s replicaset

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

幸运的是,Kubernetes就为我们提供了这样的资源对象:

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

本节先讲ReplicaSet和ReplicationController。

一、ReplicationController

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

  • 开始演示
  1. #启动k8s
  2. minikube start
  3. #删除上次的pod
  4. kubectl delete -f pod_nginx.yml

  • 查看rc_nginx.yml
  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4. name: nginx
  5. spec:
  6. replicas: 3
  7. selector:
  8. app: nginx
  9. template:
  10. metadata:
  11. name: nginx
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx
  18. ports:
  19. - containerPort: 80

上面的YAML文件:

  • kind:ReplicationController
  • spec.replicas: 指定Pod副本数量,默认为1
  • spec.selector: RC通过该属性来筛选要控制的Pod
  • spec.template: 这里就是我们之前的Pod的定义的模块,但是不需要apiVersion和kind了
  • spec.template.metadata.labels: 注意这里的Pod的labels要和spec.selector相同,这样RC就可以来控制当前这个Pod了。
  1. #创建一个ReplicationController的横向扩展
  2. kubectl create -f rc_nginx.yml
  3. kubectl get pods
  4. kubectl get rc

  • 删除一个看看效果如何

通过delete pods 的方式删除一个容器,立刻就有一个新的容器起来

  1. kubectl get rc
  2. kubectl get pod
  3. kubectl delete pods nginx-h2qbt
  4. kubectl get pods
  5. kubectl get rc

  • scale 水平扩展的数量
  1. kubectl scale rc nginx --replicas=2
  2. kubectl get rc
  3. kubectl scale rc nginx --replicas=5
  4. kubectl get pods -o wide

二、ReplicaSet

Replication Set简称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的滚动升级功能(但是不支持一键回滚,需要用相同的方法去修改镜像地址)

 

  • 查看rc_nginx.yml
  1. apiVersion: apps/v1
  2. kind: ReplicaSet
  3. metadata:
  4. name: nginx
  5. labels:
  6. tier: frontend
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. tier: frontend
  12. template:
  13. metadata:
  14. name: nginx
  15. labels:
  16. tier: frontend
  17. spec:
  18. containers:
  19. - name: nginx
  20. image: nginx
  21. ports:
  22. - containerPort: 80

 

  1. #删除ReplicationController创建的pod
  2. kubectl delete -f rc_nginx.yml
  3. #创建一个ReplicationController的横向扩展
  4. kubectl create -f rs_nginx.yml
  5. kubectl get pods -o wide
  6. kubectl get pods
  7. kubectl get rc

  • 删除一个看看效果如何

通过delete pods 的方式删除一个容器,立刻就有一个新的容器起来

  1. kubectl get rs
  2. kubectl get pod
  3. kubectl delete pods nginx-h2qbt
  4. kubectl get pods
  5. kubectl get rs

  • scale 水平扩展的数量
  1. kubectl scale rs nginx --replicas=2
  2. kubectl get rs
  3. kubectl scale rs nginx --replicas=5
  4. kubectl get pods -o wide

通过这次了解了pod的扩展,ReplicaSet和ReplicationController的方式,基本上可以抛弃上次的直接pod的方式创建app了。下次说说Deployment。
 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号