赞
踩
一、认识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
2)创建ReplicaSet控制器
]# kubectl apply -f rs.yaml
replicaset.apps/test-rs changed
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
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>
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>
6)删除一个Pod并观察变化
]# kubectl delete pod test-rs-js9mb
pod "test-rs-js9mb" deleted
]# 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>
结论:可以看到,当我们删除一个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>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。