当前位置:   article > 正文

Kubernetes学习之Replication Set控制器_replicationset控制区

replicationset控制区

一、认识Pod
  Pod资源对象是一种集合了一到多个应用容器、存储资源、专用IP及支撑容器运行的其他选项的逻辑组件;Pod代表着Kubernetes的部署单元及原子运行单元,即一个应用程序的单一运行实例,它通常由共享资源且关系紧密的一个或多个容器组成;Kubernetes的网络模型要求其各Pod对象的IP地址位于同一网络平面内(同一个IP网段),各Pod之间可使用其IP地址直接进行通信,无论它们运行于哪个工作节点之上,这些Pod对象都像是运行于同一局域网中的多个主机。
  我们可以将每个Pod对象想象成一个逻辑的主机,它类似于现实世界中的物理主机或VM,运行于同一个Pod对象中的多个进程也类似于物理机或VM上独立运行的进程。不过,Pod对象中的各进程均运行于彼此隔离的容器中,并于各容器间共享两种关键资源:网络存储卷
  网络(Networking):每个Pod对象都会被分配一个集群内专用的IP地址,也称为Pod IP,同一Pod内部的所有容器共享Pod对象的Network和UTS名称空间,其中包括主机名、IP地址和端口等。因此,这些容器间的通信可以基于本地回环接口lo进行,而与Pod外的其他组件的通信则需要使用Service资源对象和ClusterIP及其相应的端口完成。
  存储卷(Volume):用户可以为Pod对象配置一组"存储卷"资源,这些资源可以共享给其内部的所有容器使用,从而完成容器间的数据共享。存储卷还可以确保在容器终止后重启,甚至是被删除后也能确保数据不会丢失,从而保证了生命周期内的Pod对象数据的持久化存储。

在这里插入图片描述

二、控制器
  一个Pod对象代表某个应用程序的一个特定实例,如果需要扩展应用程序,则意味着为此应用程序同时创建多个Pod实例,每个实例均代表应用程序的一个运行"副本"(replica)。这些副本化的Pod对象的创建和管理通常由另一组称之为"控制器"(Controller)的对象实现的,例如,ReplicatSet控制器、Deployment控制器等。
  控制器本身也是一组资源类型的统称,它有着多种实现,其中与工作负载相关的实现如Replication Controller、Deployment、StatefulSet、DaemonSet、和Job等,也可以统称它们为控制器。Deployment就是这类控制器的代表实现,它也是目前最常用的管理无状态应用的Pod控制器。Kubernetes的每个控制器对象都代表着一个控制循环,它通过API Server监视受控对象,并在必要时修改前状态以吻合目标状态
  Pod控制器的定义通常由期望的副本数量、Pod模板和标签选择器(Label Selector)组成。Pod控制器会根据标签控制器对Pod对象的标签进行匹配筛选,所有满足选择条件的Pod对象都将受控于当前控制器并计入其副本总数,并确保此数目能够精确反映期望的副本数。

在这里插入图片描述

三、Replication Set控制器
  Replication Set(简称RS)控制器是Replication Controller(简称RC)控制器的升级版,目前Kubernetes的版本中RC控制器已不再使用;RS已是主流;但是RC和RS的功能都是对Pod的副本数量做管理控制,它们的实际功能基本一致,目前唯一的区别是RC只支持基于等式的Selector(env=dev或app=nginx),但是RS还支持基于集合的Selector(version in(v1,v2)),着对于复杂的运维管理就非常方便了。
  kubelet命令行工具中关于RC的大部分命令同样适用于RS资源对象,不过我们也很少取单独适用RS控制器,它主要被Deployment这个更加高层的资源对象所使用,除非用户需要自定义升级功能或根本不需要升级Pod,在一般情况下,我们推荐使用Deployment而不直接使用Replication Set。
  RC/RS的特性与作用:
  1)大部分情况下,通过定义一个RS实现的Pod的创建和副本数量的控制
  2)RS中包含一个完整的Pod定义模块(不包含apiversion和kind)
  3)通过改变RS里面的Pod副本数量,可以实现Pod的扩缩容功能
  4)通过改变RS里面的Pod模板中的镜像版本,可以实现Pod的滚动升级功能(不支持一键回滚,需要用相同的方法去修改镜像地址)

四、部署Replication Set管理的Pod
1)创建一个yaml文件

]# vim rs-demo.yaml
# 文件内容如下:
apiVersion: apps/v1
kind: ReplicaSet
metadata: 
  name: test-rs 
  namespace: default
spec:
    replicas: 2
    selector:
        matchLabels:
            app: myapp
            release: canary
    template:
        metadata:
            name: myapp-rs-pod
            labels:
                app: myapp
                release: canary
                environment: qa
        spec:
            containers:
            - name: myapp-container
              image: ikubernetes/myapp:v1
              imagePullPolicy: IfNotPresent
              ports:
              - name: http
                containerPort: 80
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

2)创建ReplicaSet控制器

]# kubectl apply -f rs.yaml 
replicaset.apps/test-rs changed
  • 1
  • 2

3)查看ReplicaSet控制器

]# kubectl get rs -o wide
NAME      DESIRED   CURRENT   READY   AGE     CONTAINERS        IMAGES                 SELECTOR
test-rs   2         2         2       7h46m   myapp-container   ikubernetes/myapp:v1   app=myapp,release=canary
  • 1
  • 2
  • 3

NAME:ReplicaSet控制器的名称
DESIRED:期望的Pod副本集数量
CURRENT:实际的Pod副本集数量
READY:处于就绪状态可提供对外服务的Pod副本集数量
AGE:ReplicaSet控制器的运行时长
CONTAINERS:ReplicaSet控制器下所运行的Pod名称
IMAGES:Pod所使用的镜像名称
SELECTOR:ReplicaSet控制器所使用的标签选择器

4)查看Pod信息

]# kubectl get pod -o wide
NAME            READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
test-rs-js9mb   1/1     Running   0          122m    10.244.0.6   node1    <none>           <none>
test-rs-wk2fh   1/1     Running   0          7h53m   10.244.2.5   node2    <none>           <none>
  • 1
  • 2
  • 3
  • 4

NAME:Pod的实例名称
READY:处于就绪状态的Pod数量
STATUS:Pod的运行状态情况
  挂起(Pending):Pod已经被Kubernetes系统接受了,但是有一个或者多个容器镜像尚未创建,等待时间包括调度Pod的时间和和通过网络下载镜像的时间,这需要一些时间
  运行中(Running):该Pod已经绑定到了一个节点上,Pod中所有的容器都已经被创建了,至少有一个容器正在运行,或者处于启动或重启状态;
  失败(Failed):Pod中的所有容器都已经被终止了,并且至少有一个容器是因为失败终止的,也就是说,容器是以非0状态退出或者被系统终止;
  未知(Unknow):因为某些原因无法取得Pod状态,通常是因为与Pod所在主机通信失败;
RESTARTS:Pod重启的次数
AGE:Pod的运行时长
IP:Pod的集群内的访问IP地址
NODE:Pod被调度到集群中哪个节点之上
NOMINATED NODE:调度选择时被提名到的节点
READINESS GRTES:调度时预备队列中准备要调度的节点

5)访问集群内的Pod服务

]# curl 10.244.0.6 
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

]# curl 10.244.2.5
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
  • 1
  • 2
  • 3
  • 4
  • 5

6)删除一个Pod并观察变化

]# kubectl delete pod test-rs-js9mb
pod "test-rs-js9mb" deleted
  • 1
  • 2
]# kubectl get pod -o wide -w
NAME            READY   STATUS    RESTARTS   AGE    IP           NODE     NOMINATED NODE   READINESS GATES
test-rs-js9mb   1/1     Running   0          137m   10.244.0.6   master   <none>           <none>
test-rs-wk2fh   1/1     Running   0          8h     10.244.2.5   node2    <none>           <none>


test-rs-js9mb   1/1     Terminating   0          138m   10.244.0.6   master   <none>           <none>
test-rs-8mw96   0/1     Pending       0          0s     <none>       <none>   <none>           <none>
test-rs-8mw96   0/1     Pending       0          0s     <none>       node1    <none>           <none>
test-rs-8mw96   0/1     ContainerCreating   0          0s     <none>       node1    <none>           <none>
test-rs-js9mb   0/1     Terminating         0          138m   10.244.0.6   master   <none>           <none>
test-rs-8mw96   1/1     Running             0          3s     10.244.1.15   node1    <none>           <none>
test-rs-js9mb   0/1     Terminating         0          138m   10.244.0.6    master   <none>           <none>
test-rs-js9mb   0/1     Terminating         0          138m   10.244.0.6    master   <none>           <none>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

结论:可以看到,当我们删除一个Pod副本时,ReplicaSet控制器为了保证集群中规定的Pod副本数量,会立刻再次创建一个Pod,待倒新的Pod状态是Running可对外提供服务时,才会退出并删除老的Pod;以满足管理者所定义的副本集数量。

7)再次查看集群中的Pod并访问

]# kubectl get pod -o wide
NAME            READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
test-rs-8mw96   1/1     Running   0          2m59s   10.244.1.15   node1   <none>           <none>
test-rs-wk2fh   1/1     Running   0          8h      10.244.2.5    node2   <none>           <none>
]# curl 10.244.1.15
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
]# curl 10.244.2.5
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/189861
推荐阅读
相关标签
  

闽ICP备14008679号