k8s中Pod、ReplicaSet、Deployment、Service的区别_pod deployment replicaset区别
Pod、ReplicaSet、Deployment、Service关系图
Pod、ReplicaSet、Deployment、Service之间的关系如下图
Pod:
Pod是一个或多个容器的组合,这些容器共享 存储 、网络和命名空间,以及如何运行的规范。Pod是Kubernetes的最小可部署单元。Pod的中文译词是豌豆荚,docker容器就像是豆子运行在豌豆荚内。
ReplicaSet:
Replication Controller的作用是确保Pod以指定的副本个数运行。ReplicaSet是Replication Controller升级版。ReplicaSet和Replication Controller之间的唯一区别是对选择器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet还支持新的,基于集合的selector( version in (v1.0,v2.0)或env notin (dev, qa))。
在yaml文件中通过spec.replicas声明pod的副本数。
Deployment:
Deployment用于管理Pod、ReplicaSet,可实现滚动升级和回滚应用、扩容和缩容。
Service:
试想一个问题,ReplicaSet定义了pod的数量是2,当一个pod由于某种原因停止了,ReplicaSet会新建一个pod,以确保运行中的pod数量始终是2。但每个pod都有自己的ip,前端请求不知道这个新pod的ip是什么,那前端的请求如何发送到新pod中呢?
答案是使用Service
k8s的Service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,来自外部的访问请求被 负载均衡 到后端的各个容器应用上。Service与其后端Pod副本集群之间则是通过Label Selector实现关联。
请说人话:前端请求不是直接发送给Pod,而是发送到Service,Service再将请求转发给pod。
总结
Pod被ReplicaSet管理,ReplicaSet控制pod的数量;ReplicaSet被Deployment管理,Deployment控制pod应用的升级、回滚,当然也能控制pod的数量。Service提供一个统一固定入口,负责将前端请求转发给Pod。
Deployment与service区别
| 特性 | Deployment | StatefulSet |
|---|---|---|
| 是否暴露到外网 | YES | NO |
| 请求面向的对象 | serviceName | 指定pod域名 |
| 灵活性 | 只能通过service/serviceIp访问到k8s自动转发的pod | 可以访问任意一个自定义的pod |
| 易用性 | 只需要关心Service的信息即可 | 需要知道要访问的pod启动的名称、headlessService名称 |
| PV/PVC绑定关系的稳定性(多replicas) | (pod挂掉后重启)无法保证初始的绑定关系 | 可以保证 |
| pod名称稳定性 | 不稳定,因为是通过template创建,每次为了避免重复都会后缀一个随机数 | 稳定,每次都一样 |
| 启动顺序(多replicas) | 随机启动,如果pod宕掉重启,会自动分配一个node重新启动 | pod按 app-0、app-1…app-(n-1),如果pod宕掉重启,还会在之前的node上重新启动 |
| 停止顺序(多replicas) | 随机停止 | 倒序停止 |
| 集群内部服务发现 | 只能通过service访问到随机的pod | 可以打通pod之间的通信(主要是被发现) |
| 性能开销 | 无需维护pod与node、pod与PVC 等关系 | 比deployment类型需要维护额外的关系信息 |
| 适用场景 | 无状态 | 有状态 |
NodePort, ClusterIp, LoadBalancer区别
ClusterIp: 此服务仅能在k8s集群内访问
NodePort: 节点端口,可以让service接收来自k8s集群外的请求
LoadBalancer:
Port: k8s 集群内部访问service端口, 通过clusterip:port 请求某个service
nodePort: 使用nodeIp:nodePort 从外部访问请求某个service
targetPort:是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器
containerPort:是pod内部容器的端口,targetPort映射到containerPort
案例
1 | apiVersion: apps/v1 |
K8s创建Service与创建Deployment
参考样例
创建Service, 配置myName-service.yaml:
1 | apiVersion: v1 |
创建Deployment
配置myName-deploy.yaml:
1 | apiVersion: extensions/v1beta1 |
参考
kubernetes Container、Pod、Replicaset、Service、Deployment、Lable、Statefulset关系和区别




%E5%AD%A6%E4%B9%A0%EF%BC%9AK8S%E5%AE%9E%E6%88%98%E6%A1%88%E4%BE%8B_kubernetes%20%E6%A1%88%E4%BE%8B/fe31cbdc5c6427a41c8a02c4bd278421.png)

%E5%AD%A6%E4%B9%A0%EF%BC%9Apod%E6%A6%82%E5%BF%B5%E5%8F%8A%E7%9B%B8%E5%85%B3%E6%93%8D%E4%BD%9C_kubectl%20%E8%BF%9B%E5%85%A5pod/7b2c22f6722174f5022fe7a9e34dbebd.png)




