k8s中pod与service的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s中pod与service的区别相关的知识,希望对你有一定的参考价值。

参考技术A k8s中的最小部署单元,不是一个程序/进程,而是一个环境(包括容器、存储、网络ip:port、容器配置)。其中可以运行1个或多个container(docker或其他容器),在一个pod内部的container共享所有资源,包括共享pod的ip:port和磁盘。
pod是临时性的,用完即丢弃的,当pod中的进程结束、node故障,或者资源短缺时,pod会被干掉。基于此,用户很少直接创建一个独立的pods,而会通过k8s中的controller来对pod进行管理。
controller通过pod templates来创建pod,pod template是一个静态模板,创建出来之后的pod就跟模板没有关系了,模板的修改也不会影响现有的pod。

由于pod是临时性的,pod的ip:port也是动态变化的。这种动态变化在k8s集群中就涉及到一个问题:如果一组后端pod作为服务提供方,供一组前端的pod所调用,那服务调用方怎么自动感知服务提供方。这就引入了k8s中的另外一个核心概念,services.
service是通过apiserver创建出来的对象实例

pod 与 service 关系:
Service定义了pods的逻辑集合和访问这个集合的策略。 Pods集合是通过定义Service时提供的Label选择器完成的

Service的引入旨在保证pod的动态变化对访问端透明,访问端只需要知道service的地址,由service来提供代理
Service的抽象使得前端客户和后端Pods进行了解耦
支持ClusterIP, NodePort以及LoadBalancer三种类型
Service的底层实现有userspace、 iptables和ipvs三种模式

pod 跟service可以通过label来筛选。

Label其实就一对 key/value ,被关联到对象上,比如Pod,标签的使用我们倾向于能够标示对象的特殊特点,Labels的值对系统本身并没有什么含义,只是对用户才有意义。同一个资源对象的labels属性的key必须唯一,label可以附加到各种资源对象上,如Node,Pod,Service,RC等。一个资源拥有多个标签,可以实现不同维度的管理。标签(Label)的组成: key=value。Label可以在创建对象时就附加到对象上,也可以在对象创建后通过API进行额外添加或修改。

如果想知道某个service关联哪些pods是,
可以先: helm -l
kubectl get svc xxx -nyyy --show-labels
得到label, 然后通过
kubectl get pod -nxx -l labelname

反过来也一样。
先看pod的,再查svc

服务发现
服务使用方如何找到我们定义的Service? 在k8s中用了两个方案,环境变量 && DNS。

1、环境变量:每当有service被创建出来之后,各个node(宿主机)上的kubelet,就会把service name加到自己宿主机的环境变量中,供所有Pod使用。环境变量的命名规则是SERVICE_NAME_SERVICE_HOST, $SERVICE_NAMESERVICE_PORT,其中SERVICE_NAME是新serviceName的大写形式,serviceName中的横杠-会被替换成下划线.
使用环境变量有一个隐含的创建顺序,即服务使用方在通过环境变量访问一个service的时候,这个service必须已经存在了。
这么简单粗暴的方案...这样做有个好处,就是省的自己搞名字解析服务,相当于本地的agent做了“域名劫持”。serviceName对应到上文提到的,由kube-proxy提供的vip:port上

以上是关于k8s中pod与service的区别的主要内容,如果未能解决你的问题,请参考以下文章

k8s Service

K8S中StatefulSet和Deployment区别

K8S中StatefulSet和Deployment区别

访问k8s内部pod service网络

k8s服务service发现与负载均衡

k8s集群中service的域名解析pod的域名解析