4、k8s的service资源介绍和工作机制(k8s小白也能懂哦) 📅 发布时间:2026/8/30 6:48:26 👁 浏览次数: k8s的service资源介绍和工作机制服务访问代理service提供访问pod的功能相当于一个代理的角色D创建pod用户通过SVC访问pod。用户的请求通过标签选择器上节讲过咯分发给pod核心功能服务发现使用标签选择器在同一个namespace中筛选符合条件的pod从而实现发现一组提供了相同服务的pod可以结合readiness探针实现健康性检查负载均衡Service作为流量入口和负载均衡器其入口为ClusterIP, 这组筛选出的Pod的IP地址将作为该Service的后端服务器名称解析利用cluster DNS为该组pod所代表的服务提供一个名称在DNS中对于每个service自动生成一个A、PTR和SRV记录。Endpoints不用关心他自己会创建当创建service资源时最重要但就是为Service指定能够提供服务的标签选择器。service controller就会更具标签选择器自动创建一个同名的endpoint资源对象。Endpoint Controller使用Endpoint的标签选择器(继承自Service标签选择器)筛选符合条件(包括)符合标签选择器条件和处于Ready 状态)的pod资源Endpoint Controller 将符合要求的pod资源绑定到Endpoint上并告知给Service资源谁可以正常提供服务Service 会自动获取一个固定的 cluster IP向外提供由Endpoint提供的服务资源Service 其实就是为动态的一组 pod 资源对象提供一个固定的访问入口。即 Service实现了后端Pod应用服务的发现功能Endpoints负责维护由相关Service标签选择器匹配的Pod对象Endpoints对象上保存Service匹配到的所有Pod的IP和Port信息,称之为端点ETCD是K/V数据库, 而一个Endpoints对象对应一个Key,所有后端Pod端点信息为其Value当一个Endpoints对象对应后端每个Pod的每次变动都需更新整个Endpoints对象并将新的Endpoints对象重新保存至API Server和ETCD(如果一个大的集群这样改的话会导致很大的流量所以就有了endpointslices)此外还需要将该对象同步至每个节点的kube-proxyEndpointslices不用关心他自己会创建原来的一改改全部变成现在的只改某一部分效率更高service工作模型iptablesIptables模式在kubernetes v1.1版本开始使用。 kubernetes v1.2 版本 iptables 成为默认代理模式Kube-proxy 自动为Service创建iptables规则将由iptables规则直接捕获Pod向外发往ClusterIP和Port的请流量并重定向至当前Service的后端对每个Endpoints对象Service资源会为其创建iptables规则关联至挑选的后端Pod资源优点性能比userspace已经废弃服方案了更加高效和可靠ipvs当服务很多时性能更优四种SVC介绍clusteripservice的默认类型为集群内部的客户端访问包括节点和pod等外部网络无法访问nodeport本质上在clusterip模式基础上在多加了一层端口映射的封装对外部网络提供服务默认随机端口。可通过访问ClusterIP实现集群内部访问,也可以通过NodeIP:NortPort的方式实现从集群外部至内部的访问loadbalancer基于nodeport基础之上使用集群外部的运营负载上负载均衡器方式实现对外提供服务增强版的nodeport。externalname当Kubernetes集群需要访问集群外部服务时需要通过externalName将外部主机引入到集群内部。外部主机名以 DNS方式解析为一个 CNAME记录给Kubernetes集群的其他主机来使用。这种Service既没有ClusterIP也没有NodePort.而且依赖于内部的CoreDNS功能service管理创建service方式有两种——命令行和yaml文件方法。#创建命令1单独创建一个servicekubectl createservice[flags]NAME[--tcpport:targetport][--dry-run]#flag参数解释clusterip Create a ClusterIP service.将集群专用服务接口 nodeport 创建一个 NodePort service.将集群内部服务以端口形式对外提供 loadbalancer 创建一个 LoadBalancer service.主要针对公有云服务 externalname Create an ExternalName service.将集群外部服务引入集群内部#创建命令2针对一个已存在的deployment、pod、RS等创建一个servicekubectl expose(-f FILENAME|TYPE NAME)[--portport][--protocolTCP|UDP|SCTP][--target-portnumber-or-name][--namename][--external-ipexternal-ip-ofservice][--typetype][options]#作用针对一个已存在的deployment、pod、ReplicaSet等创建一个service#参数详解--port#设定service对外的端口信息--target-port#设定容器的端口,默认和service的端口相同--type#设定类型支持四种ClusterIP(默认), NodePort,LoadBalancer,ExternalName --cluster-ip#设定对外的ClusterIP地址--name#创建service对外的svc名称#创建命令3创建自主式Pod时动创建Servicekubectl runPod_name--image镜像--expose--port容器端口#查看命令kubectl get svc#查看更多信息的命令是一个通用的命令一般常用两种方法显示更多的内容yaml和json#语法kubectl get 资源类型[类型名称]-oyaml kubectl get 资源类型[类型名称]-ojson#yaml格式查看更多Service的信息kubectl get svcservice-name-oyaml#删除servicekubectl delete svcsvc_name[-nnamespace[][--all]文件方式apiVersion: v1 kind: Service metadata: name: … namespace: … labels: key1: value1 key2: value2 spec: type:string# Service类型默认为ClusterIPselector:map[string]string# 指定用于过滤出servic所代理的后端Pod的标签,只支持等值类型的标签选择器多个条件内含“与”逻辑ports:# Service的端口对象列表- name:string# 端口名称,需要保证唯一性protocol:string# 协议目前仅支持TCP、UDP和SCTP默认为TCPport:integer# Service的端口号targetPort:string# 后端Pod的端口号或名称名称需由Pod中的规范定义nodePort:integer#节点端口号仅适用NodePort和LoadBalancer类型,范围30000-32768建议不指定而由系统自动分配- name:string....... clusterIP:string# 指定Service的集群IP建议不指定而由系统自动分配internalTrafficPolicy:string# 内部流量策略处理方式Local表示由当前节点处理Cluster表示向集群范围调度默认值为ClusterexternalTrafficPolicy:string# 外部流量策略处理方式默认为Cluster当为Local时表示由当前节点处理性能较好但无负载均衡功能且可以看到真实客户端IPCluster表示向集群范围调度和Local相反基于性能原因生产更建议Local此方式只支持type是NodePort和LoadBlancer类型或者ExternalIPsloadBalancerIP:string# 外部负载均衡器使用的IP地址仅适用于LoadBlancer,此字段未来可能被删除externalName:string# 外部服务名称该名称将作为Service的DNS CNAME值externalIPs[]string# 群集中的节点将接受此服务的流量的 IP 地址列表。这些IP不由 Kubernetes管理。用户负责确保流量到达具有此 IP 的节点。常见的是不属于 Kubernetes 系统的外部负载均衡器注意此IP和Type类型无关nalIPs[]string# 群集中的节点将接受此服务的流量的 IP 地址列表。这些IP不由 Kubernetes管理。用户负责确保流量到达具有此 IP 的节点。常见的是不属于 Kubernetes 系统的外部负载均衡器注意此IP和Type类型无关